diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/BlackListController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/BlackListController.java index a27f9f8..0c06661 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/BlackListController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/BlackListController.java @@ -1,13 +1,18 @@ package com.casic.missiles.modular.controller; +import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.base.controller.ExportController; import com.casic.missiles.core.page.PageFactory; import com.casic.missiles.model.response.ResponseData; import com.casic.missiles.modular.dto.BlackInfoRequest; +import com.casic.missiles.modular.dto.BlackPictureRequest; +import com.casic.missiles.modular.dto.hik.PersonInfoRequest; +import com.casic.missiles.modular.enums.HikUri; import com.casic.missiles.modular.enums.OperateTypeEnum; import com.casic.missiles.modular.model.BlackInfo; import com.casic.missiles.modular.service.BlackInfoService; +import com.casic.missiles.modular.util.HikUtil; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; @@ -56,4 +61,22 @@ return null; } + /** + * 黑名单人员照片 + */ + @PostMapping("/personPicture") + @ResponseBody + public Object personPicture(@RequestBody BlackPictureRequest blackPictureRequest){ + //获取照片 + String picUri = blackPictureRequest.getPicUri(); + String serverIndexCode = blackPictureRequest.getServerIndexCode(); + PersonInfoRequest picRequest = new PersonInfoRequest(); + picRequest.setPicUri(picUri); + picRequest.setServerIndexCode(serverIndexCode); + String reBody = JSONObject.toJSONString(picRequest); + //重定向地址获取 + String url = HikUtil.hikApiFor302(HikUri.PERSON_PICTURE, reBody); + return ResponseData.success(url); + } + } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/BlackListController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/BlackListController.java index a27f9f8..0c06661 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/BlackListController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/BlackListController.java @@ -1,13 +1,18 @@ package com.casic.missiles.modular.controller; +import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.base.controller.ExportController; import com.casic.missiles.core.page.PageFactory; import com.casic.missiles.model.response.ResponseData; import com.casic.missiles.modular.dto.BlackInfoRequest; +import com.casic.missiles.modular.dto.BlackPictureRequest; +import com.casic.missiles.modular.dto.hik.PersonInfoRequest; +import com.casic.missiles.modular.enums.HikUri; import com.casic.missiles.modular.enums.OperateTypeEnum; import com.casic.missiles.modular.model.BlackInfo; import com.casic.missiles.modular.service.BlackInfoService; +import com.casic.missiles.modular.util.HikUtil; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; @@ -56,4 +61,22 @@ return null; } + /** + * 黑名单人员照片 + */ + @PostMapping("/personPicture") + @ResponseBody + public Object personPicture(@RequestBody BlackPictureRequest blackPictureRequest){ + //获取照片 + String picUri = blackPictureRequest.getPicUri(); + String serverIndexCode = blackPictureRequest.getServerIndexCode(); + PersonInfoRequest picRequest = new PersonInfoRequest(); + picRequest.setPicUri(picUri); + picRequest.setServerIndexCode(serverIndexCode); + String reBody = JSONObject.toJSONString(picRequest); + //重定向地址获取 + String url = HikUtil.hikApiFor302(HikUri.PERSON_PICTURE, reBody); + return ResponseData.success(url); + } + } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/DeviceController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/DeviceController.java index e1c4eba..666bbee 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/DeviceController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/DeviceController.java @@ -107,7 +107,7 @@ } /** - * 设备维修管理查询(分页),需计算MTTR=总维修时间/故障次数 + * 设备状态计算与评判/设备维修管理查询(分页),需计算MTTR=总维修时间/故障次数 */ @PostMapping("/repair/listPage") @ResponseBody @@ -211,7 +211,7 @@ //需根据设备编号获取到对应的门禁点唯一标识 doorControlRequest.setDoorIndexCodes(indexCodes); doorControlRequest.setControlType(Integer.valueOf(gateGroupDTO.getStatus())); - String body = JSONObject.toJSONString(deviceCodes); + String body = JSONObject.toJSONString(doorControlRequest); String resultStr = HikUtil.hikApi(HikUri.DOOR_CONTROL, body); JSONObject resultJson = (JSONObject)JSONObject.parse(resultStr); if (!"0".equals(resultJson.get("code"))) { diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/BlackListController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/BlackListController.java index a27f9f8..0c06661 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/BlackListController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/BlackListController.java @@ -1,13 +1,18 @@ package com.casic.missiles.modular.controller; +import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.base.controller.ExportController; import com.casic.missiles.core.page.PageFactory; import com.casic.missiles.model.response.ResponseData; import com.casic.missiles.modular.dto.BlackInfoRequest; +import com.casic.missiles.modular.dto.BlackPictureRequest; +import com.casic.missiles.modular.dto.hik.PersonInfoRequest; +import com.casic.missiles.modular.enums.HikUri; import com.casic.missiles.modular.enums.OperateTypeEnum; import com.casic.missiles.modular.model.BlackInfo; import com.casic.missiles.modular.service.BlackInfoService; +import com.casic.missiles.modular.util.HikUtil; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; @@ -56,4 +61,22 @@ return null; } + /** + * 黑名单人员照片 + */ + @PostMapping("/personPicture") + @ResponseBody + public Object personPicture(@RequestBody BlackPictureRequest blackPictureRequest){ + //获取照片 + String picUri = blackPictureRequest.getPicUri(); + String serverIndexCode = blackPictureRequest.getServerIndexCode(); + PersonInfoRequest picRequest = new PersonInfoRequest(); + picRequest.setPicUri(picUri); + picRequest.setServerIndexCode(serverIndexCode); + String reBody = JSONObject.toJSONString(picRequest); + //重定向地址获取 + String url = HikUtil.hikApiFor302(HikUri.PERSON_PICTURE, reBody); + return ResponseData.success(url); + } + } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/DeviceController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/DeviceController.java index e1c4eba..666bbee 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/DeviceController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/DeviceController.java @@ -107,7 +107,7 @@ } /** - * 设备维修管理查询(分页),需计算MTTR=总维修时间/故障次数 + * 设备状态计算与评判/设备维修管理查询(分页),需计算MTTR=总维修时间/故障次数 */ @PostMapping("/repair/listPage") @ResponseBody @@ -211,7 +211,7 @@ //需根据设备编号获取到对应的门禁点唯一标识 doorControlRequest.setDoorIndexCodes(indexCodes); doorControlRequest.setControlType(Integer.valueOf(gateGroupDTO.getStatus())); - String body = JSONObject.toJSONString(deviceCodes); + String body = JSONObject.toJSONString(doorControlRequest); String resultStr = HikUtil.hikApi(HikUri.DOOR_CONTROL, body); JSONObject resultJson = (JSONObject)JSONObject.parse(resultStr); if (!"0".equals(resultJson.get("code"))) { diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/StaffController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/StaffController.java index b58ccab..704093c 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/StaffController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/StaffController.java @@ -2,15 +2,21 @@ import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.util.StrUtil; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.base.controller.ExportController; import com.casic.missiles.core.page.PageFactory; import com.casic.missiles.model.response.ErrorResponseData; import com.casic.missiles.model.response.ResponseData; import com.casic.missiles.modular.dto.StaffInfoRequest; +import com.casic.missiles.modular.dto.hik.PersonInfoRequest; +import com.casic.missiles.modular.dto.hik.StaffCardRequest; +import com.casic.missiles.modular.enums.HikUri; import com.casic.missiles.modular.enums.OperateTypeEnum; import com.casic.missiles.modular.model.StaffInfo; import com.casic.missiles.modular.service.StaffInfoService; +import com.casic.missiles.modular.util.HikUtil; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; @@ -110,4 +116,60 @@ } return ResponseData.success(); } + + /** + * 批量开卡,添加人员之后调用,若在一个接口中添加人员成功开卡失败则第二次添加时会有问题 + */ + @PostMapping("/cardBinding") + @ResponseBody + public Object cardBinding(@RequestBody StaffCardRequest staffCardRequest) { + String body = JSONObject.toJSONString(staffCardRequest); + String resultStr = HikUtil.hikApi(HikUri.CARD_BINDING, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (!"0".equals(resultJson.get("code"))) { + log.error("请求海康,批量开卡失败,海康response:{}", resultStr); + return ResponseData.error("批量开卡失败"); + } + //保存卡号 + if(staffInfoService.saveCardInfo(staffCardRequest) > 0){ + return ResponseData.success(); + } + return ResponseData.error("批量开卡失败"); + } + + /** + * 获取员工照片,海康存储 + */ + @PostMapping("/personPicture/{staffCode}") + @ResponseBody + public Object personPicture(@PathVariable("staffCode") String staffCode){ + //获取员工详细信息,含图片服务器、uri + PersonInfoRequest request = new PersonInfoRequest(); + List list = new ArrayList<>(); + list.add(staffCode); + request.setParamName("personId"); + request.setParamValue(list); + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi(HikUri.PERSON_INFO, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (!"0".equals(resultJson.get("code"))) { + log.error("请求海康,根据人员唯一字段获取人员详细信息失败,海康response:{}", resultStr); + return ResponseData.error("获取员工照片失败"); + } + //获取照片 + JSONObject data = (JSONObject) resultJson.get("data"); + JSONArray dataArray = (JSONArray) data.get("list"); + JSONObject jsonObject = (JSONObject) dataArray.get(0); + JSONArray personPhoto = (JSONArray) jsonObject.get("personPhoto"); + JSONObject photo = (JSONObject) personPhoto.get(0); + String picUri = photo.getString("picUri"); + String serverIndexCode = photo.getString("serverIndexCode"); + PersonInfoRequest picRequest = new PersonInfoRequest(); + picRequest.setPicUri(picUri); + picRequest.setServerIndexCode(serverIndexCode); + String reBody = JSONObject.toJSONString(picRequest); + //重定向地址获取 + String url = HikUtil.hikApiFor302(HikUri.PERSON_PICTURE, reBody); + return ResponseData.success(url); + } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/BlackListController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/BlackListController.java index a27f9f8..0c06661 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/BlackListController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/BlackListController.java @@ -1,13 +1,18 @@ package com.casic.missiles.modular.controller; +import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.base.controller.ExportController; import com.casic.missiles.core.page.PageFactory; import com.casic.missiles.model.response.ResponseData; import com.casic.missiles.modular.dto.BlackInfoRequest; +import com.casic.missiles.modular.dto.BlackPictureRequest; +import com.casic.missiles.modular.dto.hik.PersonInfoRequest; +import com.casic.missiles.modular.enums.HikUri; import com.casic.missiles.modular.enums.OperateTypeEnum; import com.casic.missiles.modular.model.BlackInfo; import com.casic.missiles.modular.service.BlackInfoService; +import com.casic.missiles.modular.util.HikUtil; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; @@ -56,4 +61,22 @@ return null; } + /** + * 黑名单人员照片 + */ + @PostMapping("/personPicture") + @ResponseBody + public Object personPicture(@RequestBody BlackPictureRequest blackPictureRequest){ + //获取照片 + String picUri = blackPictureRequest.getPicUri(); + String serverIndexCode = blackPictureRequest.getServerIndexCode(); + PersonInfoRequest picRequest = new PersonInfoRequest(); + picRequest.setPicUri(picUri); + picRequest.setServerIndexCode(serverIndexCode); + String reBody = JSONObject.toJSONString(picRequest); + //重定向地址获取 + String url = HikUtil.hikApiFor302(HikUri.PERSON_PICTURE, reBody); + return ResponseData.success(url); + } + } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/DeviceController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/DeviceController.java index e1c4eba..666bbee 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/DeviceController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/DeviceController.java @@ -107,7 +107,7 @@ } /** - * 设备维修管理查询(分页),需计算MTTR=总维修时间/故障次数 + * 设备状态计算与评判/设备维修管理查询(分页),需计算MTTR=总维修时间/故障次数 */ @PostMapping("/repair/listPage") @ResponseBody @@ -211,7 +211,7 @@ //需根据设备编号获取到对应的门禁点唯一标识 doorControlRequest.setDoorIndexCodes(indexCodes); doorControlRequest.setControlType(Integer.valueOf(gateGroupDTO.getStatus())); - String body = JSONObject.toJSONString(deviceCodes); + String body = JSONObject.toJSONString(doorControlRequest); String resultStr = HikUtil.hikApi(HikUri.DOOR_CONTROL, body); JSONObject resultJson = (JSONObject)JSONObject.parse(resultStr); if (!"0".equals(resultJson.get("code"))) { diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/StaffController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/StaffController.java index b58ccab..704093c 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/StaffController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/StaffController.java @@ -2,15 +2,21 @@ import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.util.StrUtil; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.base.controller.ExportController; import com.casic.missiles.core.page.PageFactory; import com.casic.missiles.model.response.ErrorResponseData; import com.casic.missiles.model.response.ResponseData; import com.casic.missiles.modular.dto.StaffInfoRequest; +import com.casic.missiles.modular.dto.hik.PersonInfoRequest; +import com.casic.missiles.modular.dto.hik.StaffCardRequest; +import com.casic.missiles.modular.enums.HikUri; import com.casic.missiles.modular.enums.OperateTypeEnum; import com.casic.missiles.modular.model.StaffInfo; import com.casic.missiles.modular.service.StaffInfoService; +import com.casic.missiles.modular.util.HikUtil; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; @@ -110,4 +116,60 @@ } return ResponseData.success(); } + + /** + * 批量开卡,添加人员之后调用,若在一个接口中添加人员成功开卡失败则第二次添加时会有问题 + */ + @PostMapping("/cardBinding") + @ResponseBody + public Object cardBinding(@RequestBody StaffCardRequest staffCardRequest) { + String body = JSONObject.toJSONString(staffCardRequest); + String resultStr = HikUtil.hikApi(HikUri.CARD_BINDING, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (!"0".equals(resultJson.get("code"))) { + log.error("请求海康,批量开卡失败,海康response:{}", resultStr); + return ResponseData.error("批量开卡失败"); + } + //保存卡号 + if(staffInfoService.saveCardInfo(staffCardRequest) > 0){ + return ResponseData.success(); + } + return ResponseData.error("批量开卡失败"); + } + + /** + * 获取员工照片,海康存储 + */ + @PostMapping("/personPicture/{staffCode}") + @ResponseBody + public Object personPicture(@PathVariable("staffCode") String staffCode){ + //获取员工详细信息,含图片服务器、uri + PersonInfoRequest request = new PersonInfoRequest(); + List list = new ArrayList<>(); + list.add(staffCode); + request.setParamName("personId"); + request.setParamValue(list); + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi(HikUri.PERSON_INFO, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (!"0".equals(resultJson.get("code"))) { + log.error("请求海康,根据人员唯一字段获取人员详细信息失败,海康response:{}", resultStr); + return ResponseData.error("获取员工照片失败"); + } + //获取照片 + JSONObject data = (JSONObject) resultJson.get("data"); + JSONArray dataArray = (JSONArray) data.get("list"); + JSONObject jsonObject = (JSONObject) dataArray.get(0); + JSONArray personPhoto = (JSONArray) jsonObject.get("personPhoto"); + JSONObject photo = (JSONObject) personPhoto.get(0); + String picUri = photo.getString("picUri"); + String serverIndexCode = photo.getString("serverIndexCode"); + PersonInfoRequest picRequest = new PersonInfoRequest(); + picRequest.setPicUri(picUri); + picRequest.setServerIndexCode(serverIndexCode); + String reBody = JSONObject.toJSONString(picRequest); + //重定向地址获取 + String url = HikUtil.hikApiFor302(HikUri.PERSON_PICTURE, reBody); + return ResponseData.success(url); + } } 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 4a07dd9..7b1dcf6 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 @@ -16,6 +16,7 @@ import com.casic.missiles.modular.redis.key.CacheKeys; import com.casic.missiles.modular.service.CockpitService; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.util.CollectionUtils; import org.springframework.web.bind.annotation.*; @@ -24,10 +25,7 @@ import java.text.NumberFormat; import java.time.LocalDateTime; import java.time.temporal.ChronoUnit; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.util.*; import java.util.stream.Collectors; /** @@ -73,6 +71,9 @@ private StatisticNumberMapper numberMapper; @Autowired + private HazardLevelMapper hazardLevelMapper; + + @Autowired private AccessGroupConfig accessGroupConfig; /** @@ -104,8 +105,24 @@ public Object buildingNumberPerHour(){ //当天按小时分组的人数 List list = numberMapper.selectListByTime(); - Map> collect = list.stream().collect(Collectors.groupingBy(BuildingNumberDTO::getStatisticPosition)); - return ResponseData.success(collect); + Map> collect = list.stream().collect(Collectors.groupingBy(BuildingNumberDTO::getStatisticTime)); + //定时任务中已将每小时三栋楼人数存到数据库 + //将一期主楼和录制楼人数合并,二期单算 + List> resultList = new ArrayList<>(); + collect.keySet().forEach(key -> { + List buildingNumberDTOS = collect.get(key); + BuildingNumberDTO mainBuildingOne = buildingNumberDTOS.get(0); + BuildingNumberDTO mainBuildingTwo = buildingNumberDTOS.get(1); + BuildingNumberDTO recordingBuilding = buildingNumberDTOS.get(2); + HashMap resultMap = new HashMap<>(); + Integer oneQuantity = Integer.valueOf(mainBuildingOne.getStatisticQuantity()); + Integer recordingQuantity = Integer.valueOf(recordingBuilding.getStatisticQuantity()); + resultMap.put("staticTime", mainBuildingOne.getStatisticTime()); + resultMap.put(mainBuildingOne.getStatisticPositionName()+"、"+recordingBuilding.getStatisticPositionName(), String.valueOf(oneQuantity+recordingQuantity)); + resultMap.put(mainBuildingTwo.getStatisticPositionName(), mainBuildingTwo.getStatisticQuantity()); + resultList.add(resultMap); + }); + return ResponseData.success(resultList); } /** @@ -151,12 +168,11 @@ public Object securityNumber() { QueryWrapper wrapper = new QueryWrapper<>(); wrapper.eq("staff_type", 2); + // TODO: 2022/9/2 后续使用产品确定的每天出勤的安保人员的数量 Integer total = staffInfoMapper.selectCount(wrapper); - //当日离岗事件个数 - QueryWrapper wrapper1 = new QueryWrapper<>(); - wrapper1.eq("hik_event_type", SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); - wrapper1.apply("date_format(now(),'%Y-%m-%d') = date_format(happen_time,'%Y-%m-%d')"); - Integer leave = caseInfoMapper.selectCount(wrapper1); + //当日离岗事件按设备去重后的个数 + // TODO: 2022/9/2 目前相当于24小时内的计算,之后看需要可改成自定义小时数计算离岗率,即离岗+6小时内仅一次离岗则恢复为100%,多次则累加离岗次数计算离岗率 + Integer leave = caseInfoMapper.selectDemobilizedCount(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); NumberFormat numberFormat = NumberFormat.getInstance(); // 设置精确到小数点后2位 numberFormat.setMaximumFractionDigits(2); @@ -179,7 +195,6 @@ @ResponseBody public Object visitorApplyDetail() { List reasonGroup = applyMapper.selectByVisitReason(); - HashMap resultMap = new HashMap<>(); NumberFormat numberFormat = NumberFormat.getInstance(); // 设置精确到小数点后2位 numberFormat.setMaximumFractionDigits(2); @@ -187,12 +202,17 @@ if(0 == sum){ return ResponseData.success(); } + List resultList = new ArrayList<>(); reasonGroup.forEach(group -> { String reasonName = dictService.getDictNameByCode(SecurityEventDict.VISIT_REASON, group.getVisitReason()); String result = numberFormat.format((float) group.getQuantity() / (float) sum * 100); - resultMap.put(reasonName, result+"%"); + ApplyReasonGroupDTO applyReasonGroupDTO = new ApplyReasonGroupDTO(); + applyReasonGroupDTO.setQuantity(group.getQuantity()); + applyReasonGroupDTO.setVisitReason(reasonName); + applyReasonGroupDTO.setRatio(result+"%"); + resultList.add(applyReasonGroupDTO); }); - return ResponseData.success(resultMap); + return ResponseData.success(resultList); } /** @@ -247,6 +267,32 @@ } /** + * 机动力量实时在岗率,在岗人数除以总应在岗人数,用离岗+6小时内恢复为100%,6小时外再计算 + */ + @GetMapping("/staff/beOnDutyRatio") + @ResponseBody + public Object beOnDutyRatio() { + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("staff_type", 2); + // TODO: 2022/9/2 后续使用产品确定的每天出勤的安保人员的数量 + Integer total = staffInfoMapper.selectCount(wrapper); + if(0 == total){ + return ResponseData.success(null); + } + //当日离岗事件按设备去重后的个数 + // TODO: 2022/9/2 目前相当于24小时内的计算,之后看需要可改成自定义小时数计算离岗率,即离岗+6小时内仅一次离岗则恢复为100%,多次则累加离岗次数计算离岗率 + List onDutyRatioDTOS = caseInfoMapper.selectDemobilizedCountByHour(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); + onDutyRatioDTOS.forEach(dto -> { + NumberFormat numberFormat = NumberFormat.getInstance(); + // 设置精确到小数点后2位 + numberFormat.setMaximumFractionDigits(2); + String result = numberFormat.format(100 - Float.valueOf(dto.getQuantity()) / (float) total * 100); + dto.setRatio(result+"%"); + }); + return ResponseData.success(onDutyRatioDTOS); + } + + /** * 闸机速通门统计-设备状态分组计算数量,devType传闸机字典key * 视频频监控摄像机统计-设备状态分组计算数量,devType传摄像头字典key */ @@ -262,12 +308,17 @@ if(sum <= 0){ return ResponseData.error("无该类设备信息"); } + List resultList = new ArrayList<>(); gateStatusGroup.forEach(group -> { String devStatus = dictService.getDictNameByCode(SecurityEventDict.DEVICE_STATUS, group.getStatus()); String result = numberFormat.format((float) group.getQuantity() / (float) sum * 100); - resultMap.put(devStatus, result+"%"); + GateStatusGroupResponse gateStatusGroupResponse = new GateStatusGroupResponse(); + gateStatusGroupResponse.setStatus(devStatus); + gateStatusGroupResponse.setRatio(result+"%"); + resultList.add(gateStatusGroupResponse); }); - resultMap.put("总", sum); + resultMap.put("total", sum); + resultMap.put("list", resultList); return ResponseData.success(resultMap); } @@ -282,17 +333,38 @@ String position = securityScoreDTO.getPosition(); List caseInfos = caseInfoMapper.selectByPosition(position); //查询各危险级别权重、各类别权重,放入map,避免循环中多次查数据库 - + HashMap hazardScoreMap = new HashMap<>(); + List caseHazardLevelList = hazardLevelMapper.getCaseHazardLevelList(null); + caseHazardLevelList.forEach(hazardLevel -> { + hazardScoreMap.put(hazardLevel.getCode(), hazardLevel.getWeight()); + }); + HashMap categoryScoreMap = new HashMap<>(); + List categoryLevelList = categoryLevelMapper.getCaseCategoryLevelList(null); + categoryLevelList.forEach(categoryLevel -> { + categoryScoreMap.put(categoryLevel.getCode(), categoryLevel.getWeight()); + }); + //事件按楼层分组,计算 List securityScoreDTOs = new ArrayList<>(); caseInfos.forEach(caseInfo -> { SecurityScoreDTO securityScoreDTO1 = new SecurityScoreDTO(); + securityScoreDTO1.setPosition(caseInfo.getPosition()); securityScoreDTO1.setArea(caseInfo.getArea()); - // TODO: 2022/8/4 楼层评分计算根据产品定义调整 -// caseInfo.get -// securityScoreDTO1.setScore(); + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); + Double score = 100 - Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + securityScoreDTO1.setScore(score); + securityScoreDTOs.add(securityScoreDTO1); }); - - return null; + 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); + }); + return ResponseData.success(securityScoreDTOs); } /** @@ -303,9 +375,13 @@ public Object SecurityFrequency(@RequestBody SecurityFrequencyDTO securityFrequencyDTO) { String year = securityFrequencyDTO.getYear(); String month = securityFrequencyDTO.getMonth(); - Integer quantity = caseInfoMapper.selectCountByMonth(year, month); - securityFrequencyDTO.setQuantity(quantity); - return ResponseData.success(securityFrequencyDTO); + if(!StringUtils.isEmpty(year) && StringUtils.isEmpty(month)){ + Integer quantity = caseInfoMapper.selectCountByMonth(year, month); + securityFrequencyDTO.setQuantity(quantity); + return ResponseData.success(securityFrequencyDTO); + } + List list = caseInfoMapper.selectPreMonthCount(); + return ResponseData.success(list); } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/BlackListController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/BlackListController.java index a27f9f8..0c06661 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/BlackListController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/BlackListController.java @@ -1,13 +1,18 @@ package com.casic.missiles.modular.controller; +import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.base.controller.ExportController; import com.casic.missiles.core.page.PageFactory; import com.casic.missiles.model.response.ResponseData; import com.casic.missiles.modular.dto.BlackInfoRequest; +import com.casic.missiles.modular.dto.BlackPictureRequest; +import com.casic.missiles.modular.dto.hik.PersonInfoRequest; +import com.casic.missiles.modular.enums.HikUri; import com.casic.missiles.modular.enums.OperateTypeEnum; import com.casic.missiles.modular.model.BlackInfo; import com.casic.missiles.modular.service.BlackInfoService; +import com.casic.missiles.modular.util.HikUtil; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; @@ -56,4 +61,22 @@ return null; } + /** + * 黑名单人员照片 + */ + @PostMapping("/personPicture") + @ResponseBody + public Object personPicture(@RequestBody BlackPictureRequest blackPictureRequest){ + //获取照片 + String picUri = blackPictureRequest.getPicUri(); + String serverIndexCode = blackPictureRequest.getServerIndexCode(); + PersonInfoRequest picRequest = new PersonInfoRequest(); + picRequest.setPicUri(picUri); + picRequest.setServerIndexCode(serverIndexCode); + String reBody = JSONObject.toJSONString(picRequest); + //重定向地址获取 + String url = HikUtil.hikApiFor302(HikUri.PERSON_PICTURE, reBody); + return ResponseData.success(url); + } + } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/DeviceController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/DeviceController.java index e1c4eba..666bbee 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/DeviceController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/DeviceController.java @@ -107,7 +107,7 @@ } /** - * 设备维修管理查询(分页),需计算MTTR=总维修时间/故障次数 + * 设备状态计算与评判/设备维修管理查询(分页),需计算MTTR=总维修时间/故障次数 */ @PostMapping("/repair/listPage") @ResponseBody @@ -211,7 +211,7 @@ //需根据设备编号获取到对应的门禁点唯一标识 doorControlRequest.setDoorIndexCodes(indexCodes); doorControlRequest.setControlType(Integer.valueOf(gateGroupDTO.getStatus())); - String body = JSONObject.toJSONString(deviceCodes); + String body = JSONObject.toJSONString(doorControlRequest); String resultStr = HikUtil.hikApi(HikUri.DOOR_CONTROL, body); JSONObject resultJson = (JSONObject)JSONObject.parse(resultStr); if (!"0".equals(resultJson.get("code"))) { diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/StaffController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/StaffController.java index b58ccab..704093c 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/StaffController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/StaffController.java @@ -2,15 +2,21 @@ import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.util.StrUtil; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.base.controller.ExportController; import com.casic.missiles.core.page.PageFactory; import com.casic.missiles.model.response.ErrorResponseData; import com.casic.missiles.model.response.ResponseData; import com.casic.missiles.modular.dto.StaffInfoRequest; +import com.casic.missiles.modular.dto.hik.PersonInfoRequest; +import com.casic.missiles.modular.dto.hik.StaffCardRequest; +import com.casic.missiles.modular.enums.HikUri; import com.casic.missiles.modular.enums.OperateTypeEnum; import com.casic.missiles.modular.model.StaffInfo; import com.casic.missiles.modular.service.StaffInfoService; +import com.casic.missiles.modular.util.HikUtil; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; @@ -110,4 +116,60 @@ } return ResponseData.success(); } + + /** + * 批量开卡,添加人员之后调用,若在一个接口中添加人员成功开卡失败则第二次添加时会有问题 + */ + @PostMapping("/cardBinding") + @ResponseBody + public Object cardBinding(@RequestBody StaffCardRequest staffCardRequest) { + String body = JSONObject.toJSONString(staffCardRequest); + String resultStr = HikUtil.hikApi(HikUri.CARD_BINDING, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (!"0".equals(resultJson.get("code"))) { + log.error("请求海康,批量开卡失败,海康response:{}", resultStr); + return ResponseData.error("批量开卡失败"); + } + //保存卡号 + if(staffInfoService.saveCardInfo(staffCardRequest) > 0){ + return ResponseData.success(); + } + return ResponseData.error("批量开卡失败"); + } + + /** + * 获取员工照片,海康存储 + */ + @PostMapping("/personPicture/{staffCode}") + @ResponseBody + public Object personPicture(@PathVariable("staffCode") String staffCode){ + //获取员工详细信息,含图片服务器、uri + PersonInfoRequest request = new PersonInfoRequest(); + List list = new ArrayList<>(); + list.add(staffCode); + request.setParamName("personId"); + request.setParamValue(list); + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi(HikUri.PERSON_INFO, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (!"0".equals(resultJson.get("code"))) { + log.error("请求海康,根据人员唯一字段获取人员详细信息失败,海康response:{}", resultStr); + return ResponseData.error("获取员工照片失败"); + } + //获取照片 + JSONObject data = (JSONObject) resultJson.get("data"); + JSONArray dataArray = (JSONArray) data.get("list"); + JSONObject jsonObject = (JSONObject) dataArray.get(0); + JSONArray personPhoto = (JSONArray) jsonObject.get("personPhoto"); + JSONObject photo = (JSONObject) personPhoto.get(0); + String picUri = photo.getString("picUri"); + String serverIndexCode = photo.getString("serverIndexCode"); + PersonInfoRequest picRequest = new PersonInfoRequest(); + picRequest.setPicUri(picUri); + picRequest.setServerIndexCode(serverIndexCode); + String reBody = JSONObject.toJSONString(picRequest); + //重定向地址获取 + String url = HikUtil.hikApiFor302(HikUri.PERSON_PICTURE, reBody); + return ResponseData.success(url); + } } 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 4a07dd9..7b1dcf6 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 @@ -16,6 +16,7 @@ import com.casic.missiles.modular.redis.key.CacheKeys; import com.casic.missiles.modular.service.CockpitService; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.util.CollectionUtils; import org.springframework.web.bind.annotation.*; @@ -24,10 +25,7 @@ import java.text.NumberFormat; import java.time.LocalDateTime; import java.time.temporal.ChronoUnit; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.util.*; import java.util.stream.Collectors; /** @@ -73,6 +71,9 @@ private StatisticNumberMapper numberMapper; @Autowired + private HazardLevelMapper hazardLevelMapper; + + @Autowired private AccessGroupConfig accessGroupConfig; /** @@ -104,8 +105,24 @@ public Object buildingNumberPerHour(){ //当天按小时分组的人数 List list = numberMapper.selectListByTime(); - Map> collect = list.stream().collect(Collectors.groupingBy(BuildingNumberDTO::getStatisticPosition)); - return ResponseData.success(collect); + Map> collect = list.stream().collect(Collectors.groupingBy(BuildingNumberDTO::getStatisticTime)); + //定时任务中已将每小时三栋楼人数存到数据库 + //将一期主楼和录制楼人数合并,二期单算 + List> resultList = new ArrayList<>(); + collect.keySet().forEach(key -> { + List buildingNumberDTOS = collect.get(key); + BuildingNumberDTO mainBuildingOne = buildingNumberDTOS.get(0); + BuildingNumberDTO mainBuildingTwo = buildingNumberDTOS.get(1); + BuildingNumberDTO recordingBuilding = buildingNumberDTOS.get(2); + HashMap resultMap = new HashMap<>(); + Integer oneQuantity = Integer.valueOf(mainBuildingOne.getStatisticQuantity()); + Integer recordingQuantity = Integer.valueOf(recordingBuilding.getStatisticQuantity()); + resultMap.put("staticTime", mainBuildingOne.getStatisticTime()); + resultMap.put(mainBuildingOne.getStatisticPositionName()+"、"+recordingBuilding.getStatisticPositionName(), String.valueOf(oneQuantity+recordingQuantity)); + resultMap.put(mainBuildingTwo.getStatisticPositionName(), mainBuildingTwo.getStatisticQuantity()); + resultList.add(resultMap); + }); + return ResponseData.success(resultList); } /** @@ -151,12 +168,11 @@ public Object securityNumber() { QueryWrapper wrapper = new QueryWrapper<>(); wrapper.eq("staff_type", 2); + // TODO: 2022/9/2 后续使用产品确定的每天出勤的安保人员的数量 Integer total = staffInfoMapper.selectCount(wrapper); - //当日离岗事件个数 - QueryWrapper wrapper1 = new QueryWrapper<>(); - wrapper1.eq("hik_event_type", SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); - wrapper1.apply("date_format(now(),'%Y-%m-%d') = date_format(happen_time,'%Y-%m-%d')"); - Integer leave = caseInfoMapper.selectCount(wrapper1); + //当日离岗事件按设备去重后的个数 + // TODO: 2022/9/2 目前相当于24小时内的计算,之后看需要可改成自定义小时数计算离岗率,即离岗+6小时内仅一次离岗则恢复为100%,多次则累加离岗次数计算离岗率 + Integer leave = caseInfoMapper.selectDemobilizedCount(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); NumberFormat numberFormat = NumberFormat.getInstance(); // 设置精确到小数点后2位 numberFormat.setMaximumFractionDigits(2); @@ -179,7 +195,6 @@ @ResponseBody public Object visitorApplyDetail() { List reasonGroup = applyMapper.selectByVisitReason(); - HashMap resultMap = new HashMap<>(); NumberFormat numberFormat = NumberFormat.getInstance(); // 设置精确到小数点后2位 numberFormat.setMaximumFractionDigits(2); @@ -187,12 +202,17 @@ if(0 == sum){ return ResponseData.success(); } + List resultList = new ArrayList<>(); reasonGroup.forEach(group -> { String reasonName = dictService.getDictNameByCode(SecurityEventDict.VISIT_REASON, group.getVisitReason()); String result = numberFormat.format((float) group.getQuantity() / (float) sum * 100); - resultMap.put(reasonName, result+"%"); + ApplyReasonGroupDTO applyReasonGroupDTO = new ApplyReasonGroupDTO(); + applyReasonGroupDTO.setQuantity(group.getQuantity()); + applyReasonGroupDTO.setVisitReason(reasonName); + applyReasonGroupDTO.setRatio(result+"%"); + resultList.add(applyReasonGroupDTO); }); - return ResponseData.success(resultMap); + return ResponseData.success(resultList); } /** @@ -247,6 +267,32 @@ } /** + * 机动力量实时在岗率,在岗人数除以总应在岗人数,用离岗+6小时内恢复为100%,6小时外再计算 + */ + @GetMapping("/staff/beOnDutyRatio") + @ResponseBody + public Object beOnDutyRatio() { + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("staff_type", 2); + // TODO: 2022/9/2 后续使用产品确定的每天出勤的安保人员的数量 + Integer total = staffInfoMapper.selectCount(wrapper); + if(0 == total){ + return ResponseData.success(null); + } + //当日离岗事件按设备去重后的个数 + // TODO: 2022/9/2 目前相当于24小时内的计算,之后看需要可改成自定义小时数计算离岗率,即离岗+6小时内仅一次离岗则恢复为100%,多次则累加离岗次数计算离岗率 + List onDutyRatioDTOS = caseInfoMapper.selectDemobilizedCountByHour(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); + onDutyRatioDTOS.forEach(dto -> { + NumberFormat numberFormat = NumberFormat.getInstance(); + // 设置精确到小数点后2位 + numberFormat.setMaximumFractionDigits(2); + String result = numberFormat.format(100 - Float.valueOf(dto.getQuantity()) / (float) total * 100); + dto.setRatio(result+"%"); + }); + return ResponseData.success(onDutyRatioDTOS); + } + + /** * 闸机速通门统计-设备状态分组计算数量,devType传闸机字典key * 视频频监控摄像机统计-设备状态分组计算数量,devType传摄像头字典key */ @@ -262,12 +308,17 @@ if(sum <= 0){ return ResponseData.error("无该类设备信息"); } + List resultList = new ArrayList<>(); gateStatusGroup.forEach(group -> { String devStatus = dictService.getDictNameByCode(SecurityEventDict.DEVICE_STATUS, group.getStatus()); String result = numberFormat.format((float) group.getQuantity() / (float) sum * 100); - resultMap.put(devStatus, result+"%"); + GateStatusGroupResponse gateStatusGroupResponse = new GateStatusGroupResponse(); + gateStatusGroupResponse.setStatus(devStatus); + gateStatusGroupResponse.setRatio(result+"%"); + resultList.add(gateStatusGroupResponse); }); - resultMap.put("总", sum); + resultMap.put("total", sum); + resultMap.put("list", resultList); return ResponseData.success(resultMap); } @@ -282,17 +333,38 @@ String position = securityScoreDTO.getPosition(); List caseInfos = caseInfoMapper.selectByPosition(position); //查询各危险级别权重、各类别权重,放入map,避免循环中多次查数据库 - + HashMap hazardScoreMap = new HashMap<>(); + List caseHazardLevelList = hazardLevelMapper.getCaseHazardLevelList(null); + caseHazardLevelList.forEach(hazardLevel -> { + hazardScoreMap.put(hazardLevel.getCode(), hazardLevel.getWeight()); + }); + HashMap categoryScoreMap = new HashMap<>(); + List categoryLevelList = categoryLevelMapper.getCaseCategoryLevelList(null); + categoryLevelList.forEach(categoryLevel -> { + categoryScoreMap.put(categoryLevel.getCode(), categoryLevel.getWeight()); + }); + //事件按楼层分组,计算 List securityScoreDTOs = new ArrayList<>(); caseInfos.forEach(caseInfo -> { SecurityScoreDTO securityScoreDTO1 = new SecurityScoreDTO(); + securityScoreDTO1.setPosition(caseInfo.getPosition()); securityScoreDTO1.setArea(caseInfo.getArea()); - // TODO: 2022/8/4 楼层评分计算根据产品定义调整 -// caseInfo.get -// securityScoreDTO1.setScore(); + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); + Double score = 100 - Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + securityScoreDTO1.setScore(score); + securityScoreDTOs.add(securityScoreDTO1); }); - - return null; + 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); + }); + return ResponseData.success(securityScoreDTOs); } /** @@ -303,9 +375,13 @@ public Object SecurityFrequency(@RequestBody SecurityFrequencyDTO securityFrequencyDTO) { String year = securityFrequencyDTO.getYear(); String month = securityFrequencyDTO.getMonth(); - Integer quantity = caseInfoMapper.selectCountByMonth(year, month); - securityFrequencyDTO.setQuantity(quantity); - return ResponseData.success(securityFrequencyDTO); + if(!StringUtils.isEmpty(year) && StringUtils.isEmpty(month)){ + Integer quantity = caseInfoMapper.selectCountByMonth(year, month); + securityFrequencyDTO.setQuantity(quantity); + return ResponseData.success(securityFrequencyDTO); + } + List list = caseInfoMapper.selectPreMonthCount(); + return ResponseData.success(list); } } 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 ae4d770..f4f075c 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 @@ -1,20 +1,25 @@ package com.casic.missiles.modular.controller.cockpit; +import cn.hutool.core.date.DateUnit; import cn.hutool.core.date.DateUtil; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.casic.missiles.model.response.ResponseData; -import com.casic.missiles.modular.dao.AttendanceInfoMapper; -import com.casic.missiles.modular.dao.CaseInfoMapper; -import com.casic.missiles.modular.dao.HazardLevelMapper; -import com.casic.missiles.modular.dao.StaffInfoMapper; +import com.casic.missiles.modular.dao.*; +import com.casic.missiles.modular.dto.DeviceRepairLogDTO; +import com.casic.missiles.modular.dto.DeviceRepairRequest; import com.casic.missiles.modular.dto.statistics.*; +import com.casic.missiles.modular.enums.SecurityEventType; +import com.casic.missiles.modular.model.CaseCategoryLevel; import com.casic.missiles.modular.model.CaseHazardLevel; +import com.casic.missiles.modular.model.CaseInfo; import com.casic.missiles.modular.model.StaffInfo; +import com.casic.missiles.modular.service.DeviceInfoService; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.util.CollectionUtils; import org.springframework.web.bind.annotation.*; +import java.math.BigDecimal; import java.text.NumberFormat; import java.util.*; import java.util.stream.Collectors; @@ -40,6 +45,12 @@ @Autowired private HazardLevelMapper hazardLevelMapper; + @Autowired + private CategoryLevelMapper categoryLevelMapper; + + @Autowired + private DeviceInfoService deviceInfoService; + /** * 安防事件时域频次统计,每月的每天安防事件个数(原方案) * 月维度:展示每个月的每天的数据 @@ -89,15 +100,17 @@ List monthList = caseInfoMapper.selectPreMonthCountByYear(year); Map> collect = monthList.stream().collect(Collectors.groupingBy(PreMonthOrWeekCaseDTO::getHazardLevelCode)); HashMap strAvgMap = new HashMap<>(); + List resultList = new ArrayList<>(); for (String key : collect.keySet()) { List preMonthOrWeekCaseDTOS = collect.get(key); int sum = preMonthOrWeekCaseDTOS.stream().mapToInt(PreMonthOrWeekCaseDTO::getQuantity).sum(); //若年份是本年,则使用个安防级别数量/当前月份数 //若不是本年,除数为12 MonthAndWeekDTO monthAndWeekDTO = new MonthAndWeekDTO(); + String hazardName = hazardLevelMapper.selectHazardNameByCode(key); + monthAndWeekDTO.setLevelName(hazardName); if(year.equals(String.valueOf(DateUtil.thisYear()))){ monthAndWeekDTO.setMonthQuantity(sum / DateUtil.thisMonth()); -// monthAndWeekDTO.setLevelName(); strAvgMap.put(key, monthAndWeekDTO); }else{ monthAndWeekDTO.setMonthQuantity(sum / 12); @@ -113,27 +126,37 @@ if(year.equals(String.valueOf(DateUtil.thisYear()))){ if(!Objects.isNull(strAvgMap.get(key))){ MonthAndWeekDTO monthAndWeekDTO = strAvgMap.get(key); + String hazardName = hazardLevelMapper.selectHazardNameByCode(key); + monthAndWeekDTO.setLevelName(hazardName); monthAndWeekDTO.setWeekQuantity(sum / DateUtil.thisWeekOfYear()); strAvgMap.put(key, monthAndWeekDTO); }else{ MonthAndWeekDTO monthAndWeekDTO = new MonthAndWeekDTO(); + String hazardName = hazardLevelMapper.selectHazardNameByCode(key); + monthAndWeekDTO.setLevelName(hazardName); monthAndWeekDTO.setWeekQuantity(sum / DateUtil.thisWeekOfYear()); strAvgMap.put(key, monthAndWeekDTO); } }else{ if(!Objects.isNull(strAvgMap.get(key))){ MonthAndWeekDTO monthAndWeekDTO = strAvgMap.get(key); + String hazardName = hazardLevelMapper.selectHazardNameByCode(key); + monthAndWeekDTO.setLevelName(hazardName); monthAndWeekDTO.setWeekQuantity(sum / 52); strAvgMap.put(key, monthAndWeekDTO); }else{ MonthAndWeekDTO monthAndWeekDTO = new MonthAndWeekDTO(); + String hazardName = hazardLevelMapper.selectHazardNameByCode(key); + monthAndWeekDTO.setLevelName(hazardName); monthAndWeekDTO.setWeekQuantity(sum / 52); strAvgMap.put(key, monthAndWeekDTO); } } } - avgMonthAndWeekGroupDTO.setMap(strAvgMap); - return ResponseData.success(avgMonthAndWeekGroupDTO); + strAvgMap.keySet().forEach(key -> { + resultList.add(strAvgMap.get(key)); + }); + return ResponseData.success(resultList); } /** @@ -181,12 +204,178 @@ } /** - * 员工考勤人数变化,功能待定 + * 员工考勤人数变化,统计当天(横坐标为时)及近7天(横坐标为天)的考勤人数变化,只要发生一次考勤识别,次数的基数就正常增加(没有上班下班区分) */ + @PostMapping("/staff/attendanceNumber/{dimension}") + @ResponseBody + public Object attendanceNumber(@PathVariable("dimension") String dimension) { + List attendanceNumberDTOs = null; + List> resultList = new ArrayList<>(); + if("week".equals(dimension)){ + //近7天数据按天分组统计 + attendanceNumberDTOs = attendanceInfoMapper.getCountForWeek(); + }else if("day".equals(dimension)) { + //今天数据按小时分组统计 + attendanceNumberDTOs = attendanceInfoMapper.getCountForDay(); + } + if(CollectionUtils.isEmpty(attendanceNumberDTOs)){ + return ResponseData.error("该查询条件下,无员工出勤数据!"); + } + Map> collect = attendanceNumberDTOs.stream().collect(Collectors.groupingBy(AttendanceNumberDTO::getDate)); + collect.keySet().forEach(key -> { + List attendanceNumberDTOS = collect.get(key); + AttendanceNumberDTO attendanceNumberDTO = attendanceNumberDTOS.get(0); + AttendanceNumberDTO attendanceNumberDTO2 = attendanceNumberDTOS.get(1); + Map resultMap = new HashMap<>(); + resultMap.put(attendanceNumberDTO.getStaffType(), attendanceNumberDTO.getQuantity()); + resultMap.put(attendanceNumberDTO2.getStaffType(), attendanceNumberDTO2.getQuantity()); + resultMap.put("staticTime", attendanceNumberDTO.getDate()); + resultList.add(resultMap); + }); + return ResponseData.success(resultList); + } /** - * 近30天/近一周安保人员到岗排行 + * 早晚高峰区域安防评估 */ + @PostMapping("/security/assessment/{dimension}") + @ResponseBody + public Object securityAssessment(@PathVariable("dimension") String dimension) { + //查询各危险级别权重、各类别权重,放入map,避免循环中多次查数据库 + HashMap hazardScoreMap = new HashMap<>(); + List caseHazardLevelList = hazardLevelMapper.getCaseHazardLevelList(null); + caseHazardLevelList.forEach(hazardLevel -> { + hazardScoreMap.put(hazardLevel.getCode(), hazardLevel.getWeight()); + }); + HashMap categoryScoreMap = new HashMap<>(); + List categoryLevelList = categoryLevelMapper.getCaseCategoryLevelList(null); + categoryLevelList.forEach(categoryLevel -> { + categoryScoreMap.put(categoryLevel.getCode(), categoryLevel.getWeight()); + }); + HashMap hashMap = new HashMap<>(); + if("week".equals(dimension)){ + //近7天早晚高峰数据 + List caseInfos = caseInfoMapper.selectListBySevenDay(); + //按时间(天)进行分组 + caseInfos.forEach(caseInfo -> { + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); + Double score = Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + String[] array = caseInfo.getHappenTime().split(" "); + String dayTime = array[0]; + BigDecimal preScore; + if(hashMap.containsKey(dayTime)){ + Double aDouble = hashMap.get(dayTime); + preScore = new BigDecimal(aDouble.toString()); + + }else{ + preScore = new BigDecimal("100.0"); + } + BigDecimal nowScore = new BigDecimal(score.toString()); + hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); + }); + return ResponseData.success(hashMap); + }else if("day".equals(dimension)) { + //今天数据按小时分组统计 + List caseInfos = caseInfoMapper.selectListByToday(); + caseInfos.forEach(caseInfo -> { + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); + Double score = Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + String[] array = caseInfo.getHappenTime().split(":"); + String dayTime = array[0]; + BigDecimal preScore; + if(hashMap.containsKey(dayTime)){ + Double aDouble = hashMap.get(dayTime); + preScore = new BigDecimal(aDouble.toString()); + + }else{ + preScore = new BigDecimal("100.0"); + } + BigDecimal nowScore = new BigDecimal(score.toString()); + hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); + }); + return ResponseData.success(hashMap); + } + return null; + } + + /** + * 重点区域安防事态评估,统计重点区域6:00-23:00按小时分组数据 + */ + @GetMapping("/security/keyAreaStatistic") + @ResponseBody + public Object keyAreaStatistic() { + //查询各危险级别权重、各类别权重,放入map,避免循环中多次查数据库 + HashMap hazardScoreMap = new HashMap<>(); + List caseHazardLevelList = hazardLevelMapper.getCaseHazardLevelList(null); + caseHazardLevelList.forEach(hazardLevel -> { + hazardScoreMap.put(hazardLevel.getCode(), hazardLevel.getWeight()); + }); + HashMap categoryScoreMap = new HashMap<>(); + List categoryLevelList = categoryLevelMapper.getCaseCategoryLevelList(null); + categoryLevelList.forEach(categoryLevel -> { + categoryScoreMap.put(categoryLevel.getCode(), categoryLevel.getWeight()); + }); + HashMap hashMap = new HashMap<>(); + //今天数据按小时分组统计 + List caseInfos = caseInfoMapper.selectListByToday2(); + caseInfos.forEach(caseInfo -> { + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); + Double score = Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + String[] array = caseInfo.getHappenTime().split(":"); + String dayTime = array[0]; + BigDecimal preScore; + if(hashMap.containsKey(dayTime)){ + Double aDouble = hashMap.get(dayTime); + preScore = new BigDecimal(aDouble.toString()); + + }else{ + preScore = new BigDecimal("100.0"); + } + BigDecimal nowScore = new BigDecimal(score.toString()); + hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); + }); + return ResponseData.success(hashMap); + } + + /** + * 安防机动支援力量调配响应评估,根据事件已解决状态及已解决时间-发送时间,按时间(小时)分组统计 + */ + @GetMapping("/security/responseAssess") + @ResponseBody + public Object responseAssess() { + //查询各危险级别权重、各类别权重,放入map,避免循环中多次查数据库 + HashMap hazardScoreMap = new HashMap<>(); + List caseHazardLevelList = hazardLevelMapper.getCaseHazardLevelList(null); + caseHazardLevelList.forEach(hazardLevel -> { + hazardScoreMap.put(hazardLevel.getCode(), hazardLevel.getWeight()); + }); + HashMap hashMap = new HashMap<>(); + //今天数据按小时分组统计 + List caseInfos = caseInfoMapper.selectListByToday3(); + caseInfos.forEach(caseInfo -> { + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + //扣分=事件级别权重*未解决小时数 + Date updateTime = DateUtil.parse(caseInfo.getUpdateTime()); + Date happenTime = DateUtil.parse(caseInfo.getHappenTime()); + long between = DateUtil.between(updateTime, happenTime, DateUnit.HOUR); + Double score = Double.valueOf(hazardWeight)*between; + String[] array = caseInfo.getHappenTime().split(":"); + String dayTime = array[0]; + BigDecimal preScore; + if(hashMap.containsKey(dayTime)){ + Double aDouble = hashMap.get(dayTime); + preScore = new BigDecimal(aDouble.toString()); + }else{ + preScore = new BigDecimal("100.0"); + } + BigDecimal nowScore = new BigDecimal(score.toString()); + hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); + }); + return ResponseData.success(hashMap); + } /** * 重点区域威胁事件类型统计,优先级2,统计近7天和近30天 @@ -224,7 +413,34 @@ } /** - * 设备状态计算系数和评判,优先级3,需确认设备恢复时间是否可以获取 + * 近30天/近一周安保人员到岗排行 */ + + /** + * 安保等级评估,发生离岗事件减1分 + */ + @GetMapping("/security/levelAssess") + @ResponseBody + public Object securityLevelAssess() { + //今天数据按小时分组统计 + List resultList = caseInfoMapper.selectListByType(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); + resultList.forEach(result -> { + BigDecimal deScore = new BigDecimal(result.getQuantity()); + BigDecimal preScore = new BigDecimal("100.0"); + result.setScore(preScore.subtract(deScore).doubleValue()); + }); + return ResponseData.success(resultList); + } + + /** + * 设备状态计算系数和评判,即设备维修管理查询(不分页) + */ + @PostMapping("/device/repairList") + @ResponseBody + public Object repairList(@RequestBody DeviceRepairRequest deviceRepairRequest) { + List deviceRepairLogDTOS = deviceInfoService.deviceRepairListPage(deviceRepairRequest); + return ResponseData.success(deviceRepairLogDTOS); + } + } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/BlackListController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/BlackListController.java index a27f9f8..0c06661 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/BlackListController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/BlackListController.java @@ -1,13 +1,18 @@ package com.casic.missiles.modular.controller; +import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.base.controller.ExportController; import com.casic.missiles.core.page.PageFactory; import com.casic.missiles.model.response.ResponseData; import com.casic.missiles.modular.dto.BlackInfoRequest; +import com.casic.missiles.modular.dto.BlackPictureRequest; +import com.casic.missiles.modular.dto.hik.PersonInfoRequest; +import com.casic.missiles.modular.enums.HikUri; import com.casic.missiles.modular.enums.OperateTypeEnum; import com.casic.missiles.modular.model.BlackInfo; import com.casic.missiles.modular.service.BlackInfoService; +import com.casic.missiles.modular.util.HikUtil; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; @@ -56,4 +61,22 @@ return null; } + /** + * 黑名单人员照片 + */ + @PostMapping("/personPicture") + @ResponseBody + public Object personPicture(@RequestBody BlackPictureRequest blackPictureRequest){ + //获取照片 + String picUri = blackPictureRequest.getPicUri(); + String serverIndexCode = blackPictureRequest.getServerIndexCode(); + PersonInfoRequest picRequest = new PersonInfoRequest(); + picRequest.setPicUri(picUri); + picRequest.setServerIndexCode(serverIndexCode); + String reBody = JSONObject.toJSONString(picRequest); + //重定向地址获取 + String url = HikUtil.hikApiFor302(HikUri.PERSON_PICTURE, reBody); + return ResponseData.success(url); + } + } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/DeviceController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/DeviceController.java index e1c4eba..666bbee 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/DeviceController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/DeviceController.java @@ -107,7 +107,7 @@ } /** - * 设备维修管理查询(分页),需计算MTTR=总维修时间/故障次数 + * 设备状态计算与评判/设备维修管理查询(分页),需计算MTTR=总维修时间/故障次数 */ @PostMapping("/repair/listPage") @ResponseBody @@ -211,7 +211,7 @@ //需根据设备编号获取到对应的门禁点唯一标识 doorControlRequest.setDoorIndexCodes(indexCodes); doorControlRequest.setControlType(Integer.valueOf(gateGroupDTO.getStatus())); - String body = JSONObject.toJSONString(deviceCodes); + String body = JSONObject.toJSONString(doorControlRequest); String resultStr = HikUtil.hikApi(HikUri.DOOR_CONTROL, body); JSONObject resultJson = (JSONObject)JSONObject.parse(resultStr); if (!"0".equals(resultJson.get("code"))) { diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/StaffController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/StaffController.java index b58ccab..704093c 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/StaffController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/StaffController.java @@ -2,15 +2,21 @@ import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.util.StrUtil; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.base.controller.ExportController; import com.casic.missiles.core.page.PageFactory; import com.casic.missiles.model.response.ErrorResponseData; import com.casic.missiles.model.response.ResponseData; import com.casic.missiles.modular.dto.StaffInfoRequest; +import com.casic.missiles.modular.dto.hik.PersonInfoRequest; +import com.casic.missiles.modular.dto.hik.StaffCardRequest; +import com.casic.missiles.modular.enums.HikUri; import com.casic.missiles.modular.enums.OperateTypeEnum; import com.casic.missiles.modular.model.StaffInfo; import com.casic.missiles.modular.service.StaffInfoService; +import com.casic.missiles.modular.util.HikUtil; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; @@ -110,4 +116,60 @@ } return ResponseData.success(); } + + /** + * 批量开卡,添加人员之后调用,若在一个接口中添加人员成功开卡失败则第二次添加时会有问题 + */ + @PostMapping("/cardBinding") + @ResponseBody + public Object cardBinding(@RequestBody StaffCardRequest staffCardRequest) { + String body = JSONObject.toJSONString(staffCardRequest); + String resultStr = HikUtil.hikApi(HikUri.CARD_BINDING, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (!"0".equals(resultJson.get("code"))) { + log.error("请求海康,批量开卡失败,海康response:{}", resultStr); + return ResponseData.error("批量开卡失败"); + } + //保存卡号 + if(staffInfoService.saveCardInfo(staffCardRequest) > 0){ + return ResponseData.success(); + } + return ResponseData.error("批量开卡失败"); + } + + /** + * 获取员工照片,海康存储 + */ + @PostMapping("/personPicture/{staffCode}") + @ResponseBody + public Object personPicture(@PathVariable("staffCode") String staffCode){ + //获取员工详细信息,含图片服务器、uri + PersonInfoRequest request = new PersonInfoRequest(); + List list = new ArrayList<>(); + list.add(staffCode); + request.setParamName("personId"); + request.setParamValue(list); + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi(HikUri.PERSON_INFO, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (!"0".equals(resultJson.get("code"))) { + log.error("请求海康,根据人员唯一字段获取人员详细信息失败,海康response:{}", resultStr); + return ResponseData.error("获取员工照片失败"); + } + //获取照片 + JSONObject data = (JSONObject) resultJson.get("data"); + JSONArray dataArray = (JSONArray) data.get("list"); + JSONObject jsonObject = (JSONObject) dataArray.get(0); + JSONArray personPhoto = (JSONArray) jsonObject.get("personPhoto"); + JSONObject photo = (JSONObject) personPhoto.get(0); + String picUri = photo.getString("picUri"); + String serverIndexCode = photo.getString("serverIndexCode"); + PersonInfoRequest picRequest = new PersonInfoRequest(); + picRequest.setPicUri(picUri); + picRequest.setServerIndexCode(serverIndexCode); + String reBody = JSONObject.toJSONString(picRequest); + //重定向地址获取 + String url = HikUtil.hikApiFor302(HikUri.PERSON_PICTURE, reBody); + return ResponseData.success(url); + } } 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 4a07dd9..7b1dcf6 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 @@ -16,6 +16,7 @@ import com.casic.missiles.modular.redis.key.CacheKeys; import com.casic.missiles.modular.service.CockpitService; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.util.CollectionUtils; import org.springframework.web.bind.annotation.*; @@ -24,10 +25,7 @@ import java.text.NumberFormat; import java.time.LocalDateTime; import java.time.temporal.ChronoUnit; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.util.*; import java.util.stream.Collectors; /** @@ -73,6 +71,9 @@ private StatisticNumberMapper numberMapper; @Autowired + private HazardLevelMapper hazardLevelMapper; + + @Autowired private AccessGroupConfig accessGroupConfig; /** @@ -104,8 +105,24 @@ public Object buildingNumberPerHour(){ //当天按小时分组的人数 List list = numberMapper.selectListByTime(); - Map> collect = list.stream().collect(Collectors.groupingBy(BuildingNumberDTO::getStatisticPosition)); - return ResponseData.success(collect); + Map> collect = list.stream().collect(Collectors.groupingBy(BuildingNumberDTO::getStatisticTime)); + //定时任务中已将每小时三栋楼人数存到数据库 + //将一期主楼和录制楼人数合并,二期单算 + List> resultList = new ArrayList<>(); + collect.keySet().forEach(key -> { + List buildingNumberDTOS = collect.get(key); + BuildingNumberDTO mainBuildingOne = buildingNumberDTOS.get(0); + BuildingNumberDTO mainBuildingTwo = buildingNumberDTOS.get(1); + BuildingNumberDTO recordingBuilding = buildingNumberDTOS.get(2); + HashMap resultMap = new HashMap<>(); + Integer oneQuantity = Integer.valueOf(mainBuildingOne.getStatisticQuantity()); + Integer recordingQuantity = Integer.valueOf(recordingBuilding.getStatisticQuantity()); + resultMap.put("staticTime", mainBuildingOne.getStatisticTime()); + resultMap.put(mainBuildingOne.getStatisticPositionName()+"、"+recordingBuilding.getStatisticPositionName(), String.valueOf(oneQuantity+recordingQuantity)); + resultMap.put(mainBuildingTwo.getStatisticPositionName(), mainBuildingTwo.getStatisticQuantity()); + resultList.add(resultMap); + }); + return ResponseData.success(resultList); } /** @@ -151,12 +168,11 @@ public Object securityNumber() { QueryWrapper wrapper = new QueryWrapper<>(); wrapper.eq("staff_type", 2); + // TODO: 2022/9/2 后续使用产品确定的每天出勤的安保人员的数量 Integer total = staffInfoMapper.selectCount(wrapper); - //当日离岗事件个数 - QueryWrapper wrapper1 = new QueryWrapper<>(); - wrapper1.eq("hik_event_type", SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); - wrapper1.apply("date_format(now(),'%Y-%m-%d') = date_format(happen_time,'%Y-%m-%d')"); - Integer leave = caseInfoMapper.selectCount(wrapper1); + //当日离岗事件按设备去重后的个数 + // TODO: 2022/9/2 目前相当于24小时内的计算,之后看需要可改成自定义小时数计算离岗率,即离岗+6小时内仅一次离岗则恢复为100%,多次则累加离岗次数计算离岗率 + Integer leave = caseInfoMapper.selectDemobilizedCount(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); NumberFormat numberFormat = NumberFormat.getInstance(); // 设置精确到小数点后2位 numberFormat.setMaximumFractionDigits(2); @@ -179,7 +195,6 @@ @ResponseBody public Object visitorApplyDetail() { List reasonGroup = applyMapper.selectByVisitReason(); - HashMap resultMap = new HashMap<>(); NumberFormat numberFormat = NumberFormat.getInstance(); // 设置精确到小数点后2位 numberFormat.setMaximumFractionDigits(2); @@ -187,12 +202,17 @@ if(0 == sum){ return ResponseData.success(); } + List resultList = new ArrayList<>(); reasonGroup.forEach(group -> { String reasonName = dictService.getDictNameByCode(SecurityEventDict.VISIT_REASON, group.getVisitReason()); String result = numberFormat.format((float) group.getQuantity() / (float) sum * 100); - resultMap.put(reasonName, result+"%"); + ApplyReasonGroupDTO applyReasonGroupDTO = new ApplyReasonGroupDTO(); + applyReasonGroupDTO.setQuantity(group.getQuantity()); + applyReasonGroupDTO.setVisitReason(reasonName); + applyReasonGroupDTO.setRatio(result+"%"); + resultList.add(applyReasonGroupDTO); }); - return ResponseData.success(resultMap); + return ResponseData.success(resultList); } /** @@ -247,6 +267,32 @@ } /** + * 机动力量实时在岗率,在岗人数除以总应在岗人数,用离岗+6小时内恢复为100%,6小时外再计算 + */ + @GetMapping("/staff/beOnDutyRatio") + @ResponseBody + public Object beOnDutyRatio() { + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("staff_type", 2); + // TODO: 2022/9/2 后续使用产品确定的每天出勤的安保人员的数量 + Integer total = staffInfoMapper.selectCount(wrapper); + if(0 == total){ + return ResponseData.success(null); + } + //当日离岗事件按设备去重后的个数 + // TODO: 2022/9/2 目前相当于24小时内的计算,之后看需要可改成自定义小时数计算离岗率,即离岗+6小时内仅一次离岗则恢复为100%,多次则累加离岗次数计算离岗率 + List onDutyRatioDTOS = caseInfoMapper.selectDemobilizedCountByHour(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); + onDutyRatioDTOS.forEach(dto -> { + NumberFormat numberFormat = NumberFormat.getInstance(); + // 设置精确到小数点后2位 + numberFormat.setMaximumFractionDigits(2); + String result = numberFormat.format(100 - Float.valueOf(dto.getQuantity()) / (float) total * 100); + dto.setRatio(result+"%"); + }); + return ResponseData.success(onDutyRatioDTOS); + } + + /** * 闸机速通门统计-设备状态分组计算数量,devType传闸机字典key * 视频频监控摄像机统计-设备状态分组计算数量,devType传摄像头字典key */ @@ -262,12 +308,17 @@ if(sum <= 0){ return ResponseData.error("无该类设备信息"); } + List resultList = new ArrayList<>(); gateStatusGroup.forEach(group -> { String devStatus = dictService.getDictNameByCode(SecurityEventDict.DEVICE_STATUS, group.getStatus()); String result = numberFormat.format((float) group.getQuantity() / (float) sum * 100); - resultMap.put(devStatus, result+"%"); + GateStatusGroupResponse gateStatusGroupResponse = new GateStatusGroupResponse(); + gateStatusGroupResponse.setStatus(devStatus); + gateStatusGroupResponse.setRatio(result+"%"); + resultList.add(gateStatusGroupResponse); }); - resultMap.put("总", sum); + resultMap.put("total", sum); + resultMap.put("list", resultList); return ResponseData.success(resultMap); } @@ -282,17 +333,38 @@ String position = securityScoreDTO.getPosition(); List caseInfos = caseInfoMapper.selectByPosition(position); //查询各危险级别权重、各类别权重,放入map,避免循环中多次查数据库 - + HashMap hazardScoreMap = new HashMap<>(); + List caseHazardLevelList = hazardLevelMapper.getCaseHazardLevelList(null); + caseHazardLevelList.forEach(hazardLevel -> { + hazardScoreMap.put(hazardLevel.getCode(), hazardLevel.getWeight()); + }); + HashMap categoryScoreMap = new HashMap<>(); + List categoryLevelList = categoryLevelMapper.getCaseCategoryLevelList(null); + categoryLevelList.forEach(categoryLevel -> { + categoryScoreMap.put(categoryLevel.getCode(), categoryLevel.getWeight()); + }); + //事件按楼层分组,计算 List securityScoreDTOs = new ArrayList<>(); caseInfos.forEach(caseInfo -> { SecurityScoreDTO securityScoreDTO1 = new SecurityScoreDTO(); + securityScoreDTO1.setPosition(caseInfo.getPosition()); securityScoreDTO1.setArea(caseInfo.getArea()); - // TODO: 2022/8/4 楼层评分计算根据产品定义调整 -// caseInfo.get -// securityScoreDTO1.setScore(); + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); + Double score = 100 - Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + securityScoreDTO1.setScore(score); + securityScoreDTOs.add(securityScoreDTO1); }); - - return null; + 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); + }); + return ResponseData.success(securityScoreDTOs); } /** @@ -303,9 +375,13 @@ public Object SecurityFrequency(@RequestBody SecurityFrequencyDTO securityFrequencyDTO) { String year = securityFrequencyDTO.getYear(); String month = securityFrequencyDTO.getMonth(); - Integer quantity = caseInfoMapper.selectCountByMonth(year, month); - securityFrequencyDTO.setQuantity(quantity); - return ResponseData.success(securityFrequencyDTO); + if(!StringUtils.isEmpty(year) && StringUtils.isEmpty(month)){ + Integer quantity = caseInfoMapper.selectCountByMonth(year, month); + securityFrequencyDTO.setQuantity(quantity); + return ResponseData.success(securityFrequencyDTO); + } + List list = caseInfoMapper.selectPreMonthCount(); + return ResponseData.success(list); } } 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 ae4d770..f4f075c 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 @@ -1,20 +1,25 @@ package com.casic.missiles.modular.controller.cockpit; +import cn.hutool.core.date.DateUnit; import cn.hutool.core.date.DateUtil; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.casic.missiles.model.response.ResponseData; -import com.casic.missiles.modular.dao.AttendanceInfoMapper; -import com.casic.missiles.modular.dao.CaseInfoMapper; -import com.casic.missiles.modular.dao.HazardLevelMapper; -import com.casic.missiles.modular.dao.StaffInfoMapper; +import com.casic.missiles.modular.dao.*; +import com.casic.missiles.modular.dto.DeviceRepairLogDTO; +import com.casic.missiles.modular.dto.DeviceRepairRequest; import com.casic.missiles.modular.dto.statistics.*; +import com.casic.missiles.modular.enums.SecurityEventType; +import com.casic.missiles.modular.model.CaseCategoryLevel; import com.casic.missiles.modular.model.CaseHazardLevel; +import com.casic.missiles.modular.model.CaseInfo; import com.casic.missiles.modular.model.StaffInfo; +import com.casic.missiles.modular.service.DeviceInfoService; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.util.CollectionUtils; import org.springframework.web.bind.annotation.*; +import java.math.BigDecimal; import java.text.NumberFormat; import java.util.*; import java.util.stream.Collectors; @@ -40,6 +45,12 @@ @Autowired private HazardLevelMapper hazardLevelMapper; + @Autowired + private CategoryLevelMapper categoryLevelMapper; + + @Autowired + private DeviceInfoService deviceInfoService; + /** * 安防事件时域频次统计,每月的每天安防事件个数(原方案) * 月维度:展示每个月的每天的数据 @@ -89,15 +100,17 @@ List monthList = caseInfoMapper.selectPreMonthCountByYear(year); Map> collect = monthList.stream().collect(Collectors.groupingBy(PreMonthOrWeekCaseDTO::getHazardLevelCode)); HashMap strAvgMap = new HashMap<>(); + List resultList = new ArrayList<>(); for (String key : collect.keySet()) { List preMonthOrWeekCaseDTOS = collect.get(key); int sum = preMonthOrWeekCaseDTOS.stream().mapToInt(PreMonthOrWeekCaseDTO::getQuantity).sum(); //若年份是本年,则使用个安防级别数量/当前月份数 //若不是本年,除数为12 MonthAndWeekDTO monthAndWeekDTO = new MonthAndWeekDTO(); + String hazardName = hazardLevelMapper.selectHazardNameByCode(key); + monthAndWeekDTO.setLevelName(hazardName); if(year.equals(String.valueOf(DateUtil.thisYear()))){ monthAndWeekDTO.setMonthQuantity(sum / DateUtil.thisMonth()); -// monthAndWeekDTO.setLevelName(); strAvgMap.put(key, monthAndWeekDTO); }else{ monthAndWeekDTO.setMonthQuantity(sum / 12); @@ -113,27 +126,37 @@ if(year.equals(String.valueOf(DateUtil.thisYear()))){ if(!Objects.isNull(strAvgMap.get(key))){ MonthAndWeekDTO monthAndWeekDTO = strAvgMap.get(key); + String hazardName = hazardLevelMapper.selectHazardNameByCode(key); + monthAndWeekDTO.setLevelName(hazardName); monthAndWeekDTO.setWeekQuantity(sum / DateUtil.thisWeekOfYear()); strAvgMap.put(key, monthAndWeekDTO); }else{ MonthAndWeekDTO monthAndWeekDTO = new MonthAndWeekDTO(); + String hazardName = hazardLevelMapper.selectHazardNameByCode(key); + monthAndWeekDTO.setLevelName(hazardName); monthAndWeekDTO.setWeekQuantity(sum / DateUtil.thisWeekOfYear()); strAvgMap.put(key, monthAndWeekDTO); } }else{ if(!Objects.isNull(strAvgMap.get(key))){ MonthAndWeekDTO monthAndWeekDTO = strAvgMap.get(key); + String hazardName = hazardLevelMapper.selectHazardNameByCode(key); + monthAndWeekDTO.setLevelName(hazardName); monthAndWeekDTO.setWeekQuantity(sum / 52); strAvgMap.put(key, monthAndWeekDTO); }else{ MonthAndWeekDTO monthAndWeekDTO = new MonthAndWeekDTO(); + String hazardName = hazardLevelMapper.selectHazardNameByCode(key); + monthAndWeekDTO.setLevelName(hazardName); monthAndWeekDTO.setWeekQuantity(sum / 52); strAvgMap.put(key, monthAndWeekDTO); } } } - avgMonthAndWeekGroupDTO.setMap(strAvgMap); - return ResponseData.success(avgMonthAndWeekGroupDTO); + strAvgMap.keySet().forEach(key -> { + resultList.add(strAvgMap.get(key)); + }); + return ResponseData.success(resultList); } /** @@ -181,12 +204,178 @@ } /** - * 员工考勤人数变化,功能待定 + * 员工考勤人数变化,统计当天(横坐标为时)及近7天(横坐标为天)的考勤人数变化,只要发生一次考勤识别,次数的基数就正常增加(没有上班下班区分) */ + @PostMapping("/staff/attendanceNumber/{dimension}") + @ResponseBody + public Object attendanceNumber(@PathVariable("dimension") String dimension) { + List attendanceNumberDTOs = null; + List> resultList = new ArrayList<>(); + if("week".equals(dimension)){ + //近7天数据按天分组统计 + attendanceNumberDTOs = attendanceInfoMapper.getCountForWeek(); + }else if("day".equals(dimension)) { + //今天数据按小时分组统计 + attendanceNumberDTOs = attendanceInfoMapper.getCountForDay(); + } + if(CollectionUtils.isEmpty(attendanceNumberDTOs)){ + return ResponseData.error("该查询条件下,无员工出勤数据!"); + } + Map> collect = attendanceNumberDTOs.stream().collect(Collectors.groupingBy(AttendanceNumberDTO::getDate)); + collect.keySet().forEach(key -> { + List attendanceNumberDTOS = collect.get(key); + AttendanceNumberDTO attendanceNumberDTO = attendanceNumberDTOS.get(0); + AttendanceNumberDTO attendanceNumberDTO2 = attendanceNumberDTOS.get(1); + Map resultMap = new HashMap<>(); + resultMap.put(attendanceNumberDTO.getStaffType(), attendanceNumberDTO.getQuantity()); + resultMap.put(attendanceNumberDTO2.getStaffType(), attendanceNumberDTO2.getQuantity()); + resultMap.put("staticTime", attendanceNumberDTO.getDate()); + resultList.add(resultMap); + }); + return ResponseData.success(resultList); + } /** - * 近30天/近一周安保人员到岗排行 + * 早晚高峰区域安防评估 */ + @PostMapping("/security/assessment/{dimension}") + @ResponseBody + public Object securityAssessment(@PathVariable("dimension") String dimension) { + //查询各危险级别权重、各类别权重,放入map,避免循环中多次查数据库 + HashMap hazardScoreMap = new HashMap<>(); + List caseHazardLevelList = hazardLevelMapper.getCaseHazardLevelList(null); + caseHazardLevelList.forEach(hazardLevel -> { + hazardScoreMap.put(hazardLevel.getCode(), hazardLevel.getWeight()); + }); + HashMap categoryScoreMap = new HashMap<>(); + List categoryLevelList = categoryLevelMapper.getCaseCategoryLevelList(null); + categoryLevelList.forEach(categoryLevel -> { + categoryScoreMap.put(categoryLevel.getCode(), categoryLevel.getWeight()); + }); + HashMap hashMap = new HashMap<>(); + if("week".equals(dimension)){ + //近7天早晚高峰数据 + List caseInfos = caseInfoMapper.selectListBySevenDay(); + //按时间(天)进行分组 + caseInfos.forEach(caseInfo -> { + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); + Double score = Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + String[] array = caseInfo.getHappenTime().split(" "); + String dayTime = array[0]; + BigDecimal preScore; + if(hashMap.containsKey(dayTime)){ + Double aDouble = hashMap.get(dayTime); + preScore = new BigDecimal(aDouble.toString()); + + }else{ + preScore = new BigDecimal("100.0"); + } + BigDecimal nowScore = new BigDecimal(score.toString()); + hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); + }); + return ResponseData.success(hashMap); + }else if("day".equals(dimension)) { + //今天数据按小时分组统计 + List caseInfos = caseInfoMapper.selectListByToday(); + caseInfos.forEach(caseInfo -> { + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); + Double score = Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + String[] array = caseInfo.getHappenTime().split(":"); + String dayTime = array[0]; + BigDecimal preScore; + if(hashMap.containsKey(dayTime)){ + Double aDouble = hashMap.get(dayTime); + preScore = new BigDecimal(aDouble.toString()); + + }else{ + preScore = new BigDecimal("100.0"); + } + BigDecimal nowScore = new BigDecimal(score.toString()); + hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); + }); + return ResponseData.success(hashMap); + } + return null; + } + + /** + * 重点区域安防事态评估,统计重点区域6:00-23:00按小时分组数据 + */ + @GetMapping("/security/keyAreaStatistic") + @ResponseBody + public Object keyAreaStatistic() { + //查询各危险级别权重、各类别权重,放入map,避免循环中多次查数据库 + HashMap hazardScoreMap = new HashMap<>(); + List caseHazardLevelList = hazardLevelMapper.getCaseHazardLevelList(null); + caseHazardLevelList.forEach(hazardLevel -> { + hazardScoreMap.put(hazardLevel.getCode(), hazardLevel.getWeight()); + }); + HashMap categoryScoreMap = new HashMap<>(); + List categoryLevelList = categoryLevelMapper.getCaseCategoryLevelList(null); + categoryLevelList.forEach(categoryLevel -> { + categoryScoreMap.put(categoryLevel.getCode(), categoryLevel.getWeight()); + }); + HashMap hashMap = new HashMap<>(); + //今天数据按小时分组统计 + List caseInfos = caseInfoMapper.selectListByToday2(); + caseInfos.forEach(caseInfo -> { + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); + Double score = Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + String[] array = caseInfo.getHappenTime().split(":"); + String dayTime = array[0]; + BigDecimal preScore; + if(hashMap.containsKey(dayTime)){ + Double aDouble = hashMap.get(dayTime); + preScore = new BigDecimal(aDouble.toString()); + + }else{ + preScore = new BigDecimal("100.0"); + } + BigDecimal nowScore = new BigDecimal(score.toString()); + hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); + }); + return ResponseData.success(hashMap); + } + + /** + * 安防机动支援力量调配响应评估,根据事件已解决状态及已解决时间-发送时间,按时间(小时)分组统计 + */ + @GetMapping("/security/responseAssess") + @ResponseBody + public Object responseAssess() { + //查询各危险级别权重、各类别权重,放入map,避免循环中多次查数据库 + HashMap hazardScoreMap = new HashMap<>(); + List caseHazardLevelList = hazardLevelMapper.getCaseHazardLevelList(null); + caseHazardLevelList.forEach(hazardLevel -> { + hazardScoreMap.put(hazardLevel.getCode(), hazardLevel.getWeight()); + }); + HashMap hashMap = new HashMap<>(); + //今天数据按小时分组统计 + List caseInfos = caseInfoMapper.selectListByToday3(); + caseInfos.forEach(caseInfo -> { + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + //扣分=事件级别权重*未解决小时数 + Date updateTime = DateUtil.parse(caseInfo.getUpdateTime()); + Date happenTime = DateUtil.parse(caseInfo.getHappenTime()); + long between = DateUtil.between(updateTime, happenTime, DateUnit.HOUR); + Double score = Double.valueOf(hazardWeight)*between; + String[] array = caseInfo.getHappenTime().split(":"); + String dayTime = array[0]; + BigDecimal preScore; + if(hashMap.containsKey(dayTime)){ + Double aDouble = hashMap.get(dayTime); + preScore = new BigDecimal(aDouble.toString()); + }else{ + preScore = new BigDecimal("100.0"); + } + BigDecimal nowScore = new BigDecimal(score.toString()); + hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); + }); + return ResponseData.success(hashMap); + } /** * 重点区域威胁事件类型统计,优先级2,统计近7天和近30天 @@ -224,7 +413,34 @@ } /** - * 设备状态计算系数和评判,优先级3,需确认设备恢复时间是否可以获取 + * 近30天/近一周安保人员到岗排行 */ + + /** + * 安保等级评估,发生离岗事件减1分 + */ + @GetMapping("/security/levelAssess") + @ResponseBody + public Object securityLevelAssess() { + //今天数据按小时分组统计 + List resultList = caseInfoMapper.selectListByType(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); + resultList.forEach(result -> { + BigDecimal deScore = new BigDecimal(result.getQuantity()); + BigDecimal preScore = new BigDecimal("100.0"); + result.setScore(preScore.subtract(deScore).doubleValue()); + }); + return ResponseData.success(resultList); + } + + /** + * 设备状态计算系数和评判,即设备维修管理查询(不分页) + */ + @PostMapping("/device/repairList") + @ResponseBody + public Object repairList(@RequestBody DeviceRepairRequest deviceRepairRequest) { + List deviceRepairLogDTOS = deviceInfoService.deviceRepairListPage(deviceRepairRequest); + return ResponseData.success(deviceRepairLogDTOS); + } + } 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 fbf8ab6..c71a15a 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 @@ -1,13 +1,12 @@ package com.casic.missiles.modular.controller.hik; +import cn.hutool.core.date.DateTime; +import cn.hutool.core.date.DateUtil; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.casic.missiles.model.response.ResponseData; import com.casic.missiles.modular.dao.HikFaceGroupInfoMapper; -import com.casic.missiles.modular.dto.hik.EventSubscribeRequest; -import com.casic.missiles.modular.dto.hik.FaceGroupAdditionRequest; -import com.casic.missiles.modular.dto.hik.HikRecvEvent; -import com.casic.missiles.modular.dto.hik.OrgBatchAdd; +import com.casic.missiles.modular.dto.hik.*; import com.casic.missiles.modular.enums.HikUri; import com.casic.missiles.modular.enums.SecurityEventType; import com.casic.missiles.modular.model.CaseInfo; @@ -18,16 +17,20 @@ import com.casic.missiles.modular.util.CaseInfoFactoryUtil; import com.casic.missiles.modular.util.HikUtil; import com.casic.missiles.modular.util.ThreadPoolUtil; +import com.casic.missiles.modular.util.WebSocket; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; -import org.springframework.web.bind.annotation.*; +import org.springframework.util.CollectionUtils; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.RestController; -import java.net.InetAddress; -import java.net.UnknownHostException; import java.util.ArrayList; +import java.util.Iterator; import java.util.List; import java.util.Objects; @@ -38,7 +41,6 @@ */ @Slf4j @RestController -@RequestMapping("/hik") public class HikController { @Autowired @@ -53,28 +55,37 @@ @Autowired private HikService hikService; + @Autowired + private HikFaceGroupInfoMapper hikFaceGroupInfoMapper; + + @Autowired + private WebSocket webSocket; + @Value("${server.port}") private int serverPort; - @Autowired - private HikFaceGroupInfoMapper hikFaceGroupInfoMapper; /** * 海康事件订阅 */ - @PostMapping("/event/subscribe") + @PostMapping("/hik/event/subscribe") @ResponseBody - public Object eventSubscribe() throws UnknownHostException { + public Object eventSubscribe() { EventSubscribeRequest eventSubscribeRequest = new EventSubscribeRequest(); ArrayList list = new ArrayList<>(); list.add(SecurityEventType.DEVICE_OFFLINE); + list.add(SecurityEventType.DEVICE_ONLINE); list.add(SecurityEventType.KEY_PERSONNEL_IDENTIFY_EVENT); list.add(SecurityEventType.MONITORING_POINT_OFFLINE); + list.add(SecurityEventType.MONITORING_POINT_ONLINE); list.add(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); list.add(SecurityEventType.PERSONNEL_GATHER_EVENT); - InetAddress localHost = InetAddress.getLocalHost(); + list.add(SecurityEventType.VISITOR_REGISTER); + list.add(SecurityEventType.VISITOR_CHECKOUT); + list.add(SecurityEventType.HIGH_ALTITUDE_PARABOLIC); +// InetAddress localHost = InetAddress.getLocalHost(); eventSubscribeRequest.setEventTypes(list); - eventSubscribeRequest.setEventDest("https://" + localHost + ":" + serverPort + "/eventRcv"); + eventSubscribeRequest.setEventDest("http://" + "192.168.10.6" + ":" + serverPort + "/eventRcv"); //订阅类型,0-订阅原始事件,1-联动事件,2-原始事件和联动事件,不填使用默认值0 eventSubscribeRequest.setSubType(0); /** @@ -92,19 +103,25 @@ } /** + * 查询事件订阅信息 + */ + @PostMapping("/hik/event/query") + @ResponseBody + public Object eventQuery() { + String result = HikUtil.hikApi(HikUri.EVENT_INFO, ""); + return result; + } + + /** * 海康事件接收 */ @PostMapping("/eventRcv") @ResponseBody public Object eventRcv(@RequestBody HikRecvEvent hikRecvEvent) { //1、接收所需事件类型 - Long eventType = hikRecvEvent.getEventType(); + Number eventType = hikRecvEvent.getEventType(); log.info("接收到安防事件类型为:{}", eventType); CaseInfo caseInfo = caseInfoFactoryUtil.getCaseInfo(eventType); - //接收到不关心事件直接返回 - if(Objects.isNull(caseInfo)){ - return ResponseData.success(); - } //2、不同事件不同处理,caseInfoFactoryUtil已设置好事件基础定义信息 // 再为事件添加状态、设备编码、设备名称、位置、区域、时间 // 异步处理事件 @@ -114,19 +131,23 @@ caseHandle(hikRecvEvent, eventType, caseInfo); } })); +// caseHandle(hikRecvEvent, eventType, caseInfo); - return null; + return ResponseData.success(); } - private void caseHandle(HikRecvEvent hikRecvEvent, Long eventType, CaseInfo caseInfo) { + private void caseHandle(HikRecvEvent hikRecvEvent, Number eventType, CaseInfo caseInfo) { JSONArray eventArray = hikRecvEvent.getEventArray(); List caseInfos = new ArrayList<>(); - while (eventArray.stream().iterator().hasNext()) { + Iterator iterator = eventArray.iterator(); + while (iterator.hasNext()) { CaseInfo caseInfo1 = new CaseInfo(); - BeanUtils.copyProperties(caseInfo, caseInfo1); - JSONObject event = (JSONObject) eventArray.stream().iterator().next(); + if(!Objects.isNull(caseInfo)){ + BeanUtils.copyProperties(caseInfo, caseInfo1); + } + JSONObject event = (JSONObject) iterator.next(); //5种事件进行不同处理 - if(SecurityEventType.KEY_PERSONNEL_IDENTIFY_EVENT == eventType){ + if (SecurityEventType.KEY_PERSONNEL_IDENTIFY_EVENT.equals(eventType)) { //判断所属人脸分组 JSONObject data = (JSONObject) event.get("data"); JSONObject faceRecognitionResult = (JSONObject) data.get("faceRecognitionResult"); @@ -142,52 +163,101 @@ if (faceGroupCode.equals(blackListGroup.getFaceGroupCode())) { //黑名单分组处理 caseInfo1 = hikService.blackListHandle(event, caseInfo1); - }else if(faceGroupCode.equals(propertyPersonnelGroup.getFaceGroupCode())){ + } else if (faceGroupCode.equals(propertyPersonnelGroup.getFaceGroupCode())) { //考勤分组处理-物业人员,添加到考勤表 hikService.propertyAttendanceHandle(event); - }else if(faceGroupCode.equals(securityPersonnelGroup.getFaceGroupCode())){ + } else if (faceGroupCode.equals(securityPersonnelGroup.getFaceGroupCode())) { //考勤分组处理-安保人员,添加到考勤表 hikService.securityPersonnelHandle(event); - }else { + } else { return; } - }else if(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT == eventType){ + } else if (SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT.equals(eventType)) { //离岗事件处理 caseInfo1 = hikService.demobilizedHandle(event, caseInfo1); - }else if(SecurityEventType.PERSONNEL_GATHER_EVENT == eventType){ + } else if (SecurityEventType.PERSONNEL_GATHER_EVENT.equals(eventType)) { //人员聚集事件处理 caseInfo1 = hikService.personGatherHandle(event, caseInfo1); - }else if(SecurityEventType.MONITORING_POINT_OFFLINE == eventType){ + } else if (SecurityEventType.MONITORING_POINT_OFFLINE.equals(eventType)) { //监控点离线事件处理 caseInfo1 = hikService.monitorPointOfflineHandle(event, caseInfo1); - }else if(SecurityEventType.DEVICE_OFFLINE == eventType){ + } else if (SecurityEventType.MONITORING_POINT_ONLINE.equals(eventType)) { + //监控点上线事件处理 + hikService.monitorPointOnlineHandle(event); + } else if (SecurityEventType.DEVICE_OFFLINE.equals(eventType)) { //装置离线事件处理 caseInfo1 = hikService.deviceOfflineHandle(event, caseInfo1); - }else if(SecurityEventType.VISITOR_REGISTER == eventType){ + } else if (SecurityEventType.DEVICE_ONLINE.equals(eventType)) { + //装置上线处理 + hikService.deviceOnlineHandle(event); + } else if (SecurityEventType.VISITOR_REGISTER.equals(eventType)) { //记录访客登记记录,添加到访客记录表 hikService.visitorRegisterHandler(event); - }else if(SecurityEventType.VISITOR_CHECKOUT == eventType){ + } else if (SecurityEventType.VISITOR_CHECKOUT.equals(eventType)) { //记录访客签离记录 hikService.visitorCheckOutHandler(event); } - if(!Objects.isNull(caseInfo1) && !StringUtils.isEmpty(caseInfo1.getHappenTime())){ + if (!Objects.isNull(caseInfo1) && !StringUtils.isEmpty(caseInfo1.getHappenTime())) { caseInfos.add(caseInfo1); } } //3、安防事件入库 - if(!caseInfoService.insertCaseInfoBatch(caseInfos)){ - log.error("安防事件批量入库异常"); + if (!CollectionUtils.isEmpty(caseInfos) && !caseInfoService.insertCaseInfoBatch(caseInfos)) { + log.error("安防事件批量入库异常!"); } // TODO: 2022/8/15 webSocket推送 + if (CollectionUtils.isEmpty(caseInfos)) { + log.info("webSocket事件推送"); + webSocket.sendAllMessage(JSONObject.toJSONString(caseInfos)); + } return; } /** + * 以图搜图,前端用于轨迹追踪 + */ + @PostMapping("/hik/search/picture") + @ResponseBody + public Object searchPictures(@RequestBody SearchPicturesRequest searchPicturesRequest) { + DateTime startDateTime = DateUtil.parse(searchPicturesRequest.getStartTime()); + DateTime endDateTime = DateUtil.parse(searchPicturesRequest.getEndTime()); + String startTime = DateUtil.format(startDateTime, "yyyy-MM-dd'T'HH:mm:ss.SSSXXX"); + String endTime = DateUtil.format(endDateTime, "yyyy-MM-dd'T'HH:mm:ss.SSSXXX"); + searchPicturesRequest.setStartTime(startTime); + searchPicturesRequest.setEndTime(endTime); + String body = JSONObject.toJSONString(searchPicturesRequest); + String resultStr = HikUtil.hikApi(HikUri.SEARCH_PICTURES, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (!"0".equals(resultJson.get("code"))) { + log.error("请求海康,以图搜图失败,海康response:{}", resultStr); + return ResponseData.error("以图搜图失败"); + } + return ResponseData.success(resultJson); + } + + + /** + * 海康事件取消订阅 + */ + @PostMapping("/hik/event/cancel") + @ResponseBody + public Object eventCancelSubscribe(@RequestBody CancelSubscribeRequest cancelSubscribeRequest) { + String body = JSONObject.toJSONString(cancelSubscribeRequest); + String resultStr = HikUtil.hikApi(HikUri.EVENT_CANCEL, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (!"0".equals(resultJson.get("code"))) { + log.error("请求海康,取消订阅失败,海康response:{}", resultStr); + return ResponseData.error("取消订阅失败"); + } + return ResponseData.success(resultJson); + } + + /** * 单个添加海康人脸分组 * api->hik单个添加人脸分组api->response->mysql */ - @PostMapping("/faceGroup/single/add") + @PostMapping("/hik/faceGroup/single/add") @ResponseBody public Object faceGroupAddition(@RequestBody FaceGroupAdditionRequest faceGroupAdditionRequest) { String body = JSONObject.toJSONString(faceGroupAdditionRequest); @@ -212,7 +282,7 @@ * 批量添加海康组织 * api->hik批量添加组织api->response */ - @PostMapping("/org/batch/add") + @PostMapping("/hik/org/batch/add") @ResponseBody public Object orgBatchAdd(@RequestBody List orgBatchAddRequest) { String body = JSONObject.toJSONString(orgBatchAddRequest); @@ -232,4 +302,62 @@ return ResponseData.error("批量添加组织失败"); } + /** + * 获取人员列表 + */ + @PostMapping("/hik/person/personList") + @ResponseBody + public Object personList() { + PersonListRequest request = new PersonListRequest(); + request.setPageNo(1); + request.setPageSize(100); + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi("/api/resource/v2/person/personList", body); + return resultStr; + } + + /** + * 获取组织列表 + */ + @PostMapping("/hik/org/orgList") + @ResponseBody + public Object orgList() { + PersonListRequest request = new PersonListRequest(); + request.setPageNo(1); + request.setPageSize(100); + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi("/api/resource/v1/org/orgList", body); + return resultStr; + } + + /** + * 查询访客权限下载记录 + */ + @PostMapping("/hik/auth/result") + @ResponseBody + public Object authResult() { + PersonListRequest request = new PersonListRequest(); + request.setPageNo(1); + request.setPageSize(100); + request.setOrderId("ba101db6246711edaea66f7939a13638"); + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi("/api/visitor/v1/auth/result", body); + return resultStr; + } + + /** + * 人脸图片获取 + */ + @PostMapping("/hik/face/picture") + @ResponseBody + public Object facePicture() { + FaceRequest request = new FaceRequest(); +// List list = new ArrayList<>(); +// list.add(""); + request.setCertificateNum("wanggong"); + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi("/api/frs/v1/face", body); + return resultStr; + } + } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/BlackListController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/BlackListController.java index a27f9f8..0c06661 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/BlackListController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/BlackListController.java @@ -1,13 +1,18 @@ package com.casic.missiles.modular.controller; +import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.base.controller.ExportController; import com.casic.missiles.core.page.PageFactory; import com.casic.missiles.model.response.ResponseData; import com.casic.missiles.modular.dto.BlackInfoRequest; +import com.casic.missiles.modular.dto.BlackPictureRequest; +import com.casic.missiles.modular.dto.hik.PersonInfoRequest; +import com.casic.missiles.modular.enums.HikUri; import com.casic.missiles.modular.enums.OperateTypeEnum; import com.casic.missiles.modular.model.BlackInfo; import com.casic.missiles.modular.service.BlackInfoService; +import com.casic.missiles.modular.util.HikUtil; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; @@ -56,4 +61,22 @@ return null; } + /** + * 黑名单人员照片 + */ + @PostMapping("/personPicture") + @ResponseBody + public Object personPicture(@RequestBody BlackPictureRequest blackPictureRequest){ + //获取照片 + String picUri = blackPictureRequest.getPicUri(); + String serverIndexCode = blackPictureRequest.getServerIndexCode(); + PersonInfoRequest picRequest = new PersonInfoRequest(); + picRequest.setPicUri(picUri); + picRequest.setServerIndexCode(serverIndexCode); + String reBody = JSONObject.toJSONString(picRequest); + //重定向地址获取 + String url = HikUtil.hikApiFor302(HikUri.PERSON_PICTURE, reBody); + return ResponseData.success(url); + } + } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/DeviceController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/DeviceController.java index e1c4eba..666bbee 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/DeviceController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/DeviceController.java @@ -107,7 +107,7 @@ } /** - * 设备维修管理查询(分页),需计算MTTR=总维修时间/故障次数 + * 设备状态计算与评判/设备维修管理查询(分页),需计算MTTR=总维修时间/故障次数 */ @PostMapping("/repair/listPage") @ResponseBody @@ -211,7 +211,7 @@ //需根据设备编号获取到对应的门禁点唯一标识 doorControlRequest.setDoorIndexCodes(indexCodes); doorControlRequest.setControlType(Integer.valueOf(gateGroupDTO.getStatus())); - String body = JSONObject.toJSONString(deviceCodes); + String body = JSONObject.toJSONString(doorControlRequest); String resultStr = HikUtil.hikApi(HikUri.DOOR_CONTROL, body); JSONObject resultJson = (JSONObject)JSONObject.parse(resultStr); if (!"0".equals(resultJson.get("code"))) { diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/StaffController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/StaffController.java index b58ccab..704093c 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/StaffController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/StaffController.java @@ -2,15 +2,21 @@ import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.util.StrUtil; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.base.controller.ExportController; import com.casic.missiles.core.page.PageFactory; import com.casic.missiles.model.response.ErrorResponseData; import com.casic.missiles.model.response.ResponseData; import com.casic.missiles.modular.dto.StaffInfoRequest; +import com.casic.missiles.modular.dto.hik.PersonInfoRequest; +import com.casic.missiles.modular.dto.hik.StaffCardRequest; +import com.casic.missiles.modular.enums.HikUri; import com.casic.missiles.modular.enums.OperateTypeEnum; import com.casic.missiles.modular.model.StaffInfo; import com.casic.missiles.modular.service.StaffInfoService; +import com.casic.missiles.modular.util.HikUtil; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; @@ -110,4 +116,60 @@ } return ResponseData.success(); } + + /** + * 批量开卡,添加人员之后调用,若在一个接口中添加人员成功开卡失败则第二次添加时会有问题 + */ + @PostMapping("/cardBinding") + @ResponseBody + public Object cardBinding(@RequestBody StaffCardRequest staffCardRequest) { + String body = JSONObject.toJSONString(staffCardRequest); + String resultStr = HikUtil.hikApi(HikUri.CARD_BINDING, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (!"0".equals(resultJson.get("code"))) { + log.error("请求海康,批量开卡失败,海康response:{}", resultStr); + return ResponseData.error("批量开卡失败"); + } + //保存卡号 + if(staffInfoService.saveCardInfo(staffCardRequest) > 0){ + return ResponseData.success(); + } + return ResponseData.error("批量开卡失败"); + } + + /** + * 获取员工照片,海康存储 + */ + @PostMapping("/personPicture/{staffCode}") + @ResponseBody + public Object personPicture(@PathVariable("staffCode") String staffCode){ + //获取员工详细信息,含图片服务器、uri + PersonInfoRequest request = new PersonInfoRequest(); + List list = new ArrayList<>(); + list.add(staffCode); + request.setParamName("personId"); + request.setParamValue(list); + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi(HikUri.PERSON_INFO, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (!"0".equals(resultJson.get("code"))) { + log.error("请求海康,根据人员唯一字段获取人员详细信息失败,海康response:{}", resultStr); + return ResponseData.error("获取员工照片失败"); + } + //获取照片 + JSONObject data = (JSONObject) resultJson.get("data"); + JSONArray dataArray = (JSONArray) data.get("list"); + JSONObject jsonObject = (JSONObject) dataArray.get(0); + JSONArray personPhoto = (JSONArray) jsonObject.get("personPhoto"); + JSONObject photo = (JSONObject) personPhoto.get(0); + String picUri = photo.getString("picUri"); + String serverIndexCode = photo.getString("serverIndexCode"); + PersonInfoRequest picRequest = new PersonInfoRequest(); + picRequest.setPicUri(picUri); + picRequest.setServerIndexCode(serverIndexCode); + String reBody = JSONObject.toJSONString(picRequest); + //重定向地址获取 + String url = HikUtil.hikApiFor302(HikUri.PERSON_PICTURE, reBody); + return ResponseData.success(url); + } } 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 4a07dd9..7b1dcf6 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 @@ -16,6 +16,7 @@ import com.casic.missiles.modular.redis.key.CacheKeys; import com.casic.missiles.modular.service.CockpitService; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.util.CollectionUtils; import org.springframework.web.bind.annotation.*; @@ -24,10 +25,7 @@ import java.text.NumberFormat; import java.time.LocalDateTime; import java.time.temporal.ChronoUnit; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.util.*; import java.util.stream.Collectors; /** @@ -73,6 +71,9 @@ private StatisticNumberMapper numberMapper; @Autowired + private HazardLevelMapper hazardLevelMapper; + + @Autowired private AccessGroupConfig accessGroupConfig; /** @@ -104,8 +105,24 @@ public Object buildingNumberPerHour(){ //当天按小时分组的人数 List list = numberMapper.selectListByTime(); - Map> collect = list.stream().collect(Collectors.groupingBy(BuildingNumberDTO::getStatisticPosition)); - return ResponseData.success(collect); + Map> collect = list.stream().collect(Collectors.groupingBy(BuildingNumberDTO::getStatisticTime)); + //定时任务中已将每小时三栋楼人数存到数据库 + //将一期主楼和录制楼人数合并,二期单算 + List> resultList = new ArrayList<>(); + collect.keySet().forEach(key -> { + List buildingNumberDTOS = collect.get(key); + BuildingNumberDTO mainBuildingOne = buildingNumberDTOS.get(0); + BuildingNumberDTO mainBuildingTwo = buildingNumberDTOS.get(1); + BuildingNumberDTO recordingBuilding = buildingNumberDTOS.get(2); + HashMap resultMap = new HashMap<>(); + Integer oneQuantity = Integer.valueOf(mainBuildingOne.getStatisticQuantity()); + Integer recordingQuantity = Integer.valueOf(recordingBuilding.getStatisticQuantity()); + resultMap.put("staticTime", mainBuildingOne.getStatisticTime()); + resultMap.put(mainBuildingOne.getStatisticPositionName()+"、"+recordingBuilding.getStatisticPositionName(), String.valueOf(oneQuantity+recordingQuantity)); + resultMap.put(mainBuildingTwo.getStatisticPositionName(), mainBuildingTwo.getStatisticQuantity()); + resultList.add(resultMap); + }); + return ResponseData.success(resultList); } /** @@ -151,12 +168,11 @@ public Object securityNumber() { QueryWrapper wrapper = new QueryWrapper<>(); wrapper.eq("staff_type", 2); + // TODO: 2022/9/2 后续使用产品确定的每天出勤的安保人员的数量 Integer total = staffInfoMapper.selectCount(wrapper); - //当日离岗事件个数 - QueryWrapper wrapper1 = new QueryWrapper<>(); - wrapper1.eq("hik_event_type", SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); - wrapper1.apply("date_format(now(),'%Y-%m-%d') = date_format(happen_time,'%Y-%m-%d')"); - Integer leave = caseInfoMapper.selectCount(wrapper1); + //当日离岗事件按设备去重后的个数 + // TODO: 2022/9/2 目前相当于24小时内的计算,之后看需要可改成自定义小时数计算离岗率,即离岗+6小时内仅一次离岗则恢复为100%,多次则累加离岗次数计算离岗率 + Integer leave = caseInfoMapper.selectDemobilizedCount(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); NumberFormat numberFormat = NumberFormat.getInstance(); // 设置精确到小数点后2位 numberFormat.setMaximumFractionDigits(2); @@ -179,7 +195,6 @@ @ResponseBody public Object visitorApplyDetail() { List reasonGroup = applyMapper.selectByVisitReason(); - HashMap resultMap = new HashMap<>(); NumberFormat numberFormat = NumberFormat.getInstance(); // 设置精确到小数点后2位 numberFormat.setMaximumFractionDigits(2); @@ -187,12 +202,17 @@ if(0 == sum){ return ResponseData.success(); } + List resultList = new ArrayList<>(); reasonGroup.forEach(group -> { String reasonName = dictService.getDictNameByCode(SecurityEventDict.VISIT_REASON, group.getVisitReason()); String result = numberFormat.format((float) group.getQuantity() / (float) sum * 100); - resultMap.put(reasonName, result+"%"); + ApplyReasonGroupDTO applyReasonGroupDTO = new ApplyReasonGroupDTO(); + applyReasonGroupDTO.setQuantity(group.getQuantity()); + applyReasonGroupDTO.setVisitReason(reasonName); + applyReasonGroupDTO.setRatio(result+"%"); + resultList.add(applyReasonGroupDTO); }); - return ResponseData.success(resultMap); + return ResponseData.success(resultList); } /** @@ -247,6 +267,32 @@ } /** + * 机动力量实时在岗率,在岗人数除以总应在岗人数,用离岗+6小时内恢复为100%,6小时外再计算 + */ + @GetMapping("/staff/beOnDutyRatio") + @ResponseBody + public Object beOnDutyRatio() { + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("staff_type", 2); + // TODO: 2022/9/2 后续使用产品确定的每天出勤的安保人员的数量 + Integer total = staffInfoMapper.selectCount(wrapper); + if(0 == total){ + return ResponseData.success(null); + } + //当日离岗事件按设备去重后的个数 + // TODO: 2022/9/2 目前相当于24小时内的计算,之后看需要可改成自定义小时数计算离岗率,即离岗+6小时内仅一次离岗则恢复为100%,多次则累加离岗次数计算离岗率 + List onDutyRatioDTOS = caseInfoMapper.selectDemobilizedCountByHour(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); + onDutyRatioDTOS.forEach(dto -> { + NumberFormat numberFormat = NumberFormat.getInstance(); + // 设置精确到小数点后2位 + numberFormat.setMaximumFractionDigits(2); + String result = numberFormat.format(100 - Float.valueOf(dto.getQuantity()) / (float) total * 100); + dto.setRatio(result+"%"); + }); + return ResponseData.success(onDutyRatioDTOS); + } + + /** * 闸机速通门统计-设备状态分组计算数量,devType传闸机字典key * 视频频监控摄像机统计-设备状态分组计算数量,devType传摄像头字典key */ @@ -262,12 +308,17 @@ if(sum <= 0){ return ResponseData.error("无该类设备信息"); } + List resultList = new ArrayList<>(); gateStatusGroup.forEach(group -> { String devStatus = dictService.getDictNameByCode(SecurityEventDict.DEVICE_STATUS, group.getStatus()); String result = numberFormat.format((float) group.getQuantity() / (float) sum * 100); - resultMap.put(devStatus, result+"%"); + GateStatusGroupResponse gateStatusGroupResponse = new GateStatusGroupResponse(); + gateStatusGroupResponse.setStatus(devStatus); + gateStatusGroupResponse.setRatio(result+"%"); + resultList.add(gateStatusGroupResponse); }); - resultMap.put("总", sum); + resultMap.put("total", sum); + resultMap.put("list", resultList); return ResponseData.success(resultMap); } @@ -282,17 +333,38 @@ String position = securityScoreDTO.getPosition(); List caseInfos = caseInfoMapper.selectByPosition(position); //查询各危险级别权重、各类别权重,放入map,避免循环中多次查数据库 - + HashMap hazardScoreMap = new HashMap<>(); + List caseHazardLevelList = hazardLevelMapper.getCaseHazardLevelList(null); + caseHazardLevelList.forEach(hazardLevel -> { + hazardScoreMap.put(hazardLevel.getCode(), hazardLevel.getWeight()); + }); + HashMap categoryScoreMap = new HashMap<>(); + List categoryLevelList = categoryLevelMapper.getCaseCategoryLevelList(null); + categoryLevelList.forEach(categoryLevel -> { + categoryScoreMap.put(categoryLevel.getCode(), categoryLevel.getWeight()); + }); + //事件按楼层分组,计算 List securityScoreDTOs = new ArrayList<>(); caseInfos.forEach(caseInfo -> { SecurityScoreDTO securityScoreDTO1 = new SecurityScoreDTO(); + securityScoreDTO1.setPosition(caseInfo.getPosition()); securityScoreDTO1.setArea(caseInfo.getArea()); - // TODO: 2022/8/4 楼层评分计算根据产品定义调整 -// caseInfo.get -// securityScoreDTO1.setScore(); + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); + Double score = 100 - Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + securityScoreDTO1.setScore(score); + securityScoreDTOs.add(securityScoreDTO1); }); - - return null; + 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); + }); + return ResponseData.success(securityScoreDTOs); } /** @@ -303,9 +375,13 @@ public Object SecurityFrequency(@RequestBody SecurityFrequencyDTO securityFrequencyDTO) { String year = securityFrequencyDTO.getYear(); String month = securityFrequencyDTO.getMonth(); - Integer quantity = caseInfoMapper.selectCountByMonth(year, month); - securityFrequencyDTO.setQuantity(quantity); - return ResponseData.success(securityFrequencyDTO); + if(!StringUtils.isEmpty(year) && StringUtils.isEmpty(month)){ + Integer quantity = caseInfoMapper.selectCountByMonth(year, month); + securityFrequencyDTO.setQuantity(quantity); + return ResponseData.success(securityFrequencyDTO); + } + List list = caseInfoMapper.selectPreMonthCount(); + return ResponseData.success(list); } } 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 ae4d770..f4f075c 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 @@ -1,20 +1,25 @@ package com.casic.missiles.modular.controller.cockpit; +import cn.hutool.core.date.DateUnit; import cn.hutool.core.date.DateUtil; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.casic.missiles.model.response.ResponseData; -import com.casic.missiles.modular.dao.AttendanceInfoMapper; -import com.casic.missiles.modular.dao.CaseInfoMapper; -import com.casic.missiles.modular.dao.HazardLevelMapper; -import com.casic.missiles.modular.dao.StaffInfoMapper; +import com.casic.missiles.modular.dao.*; +import com.casic.missiles.modular.dto.DeviceRepairLogDTO; +import com.casic.missiles.modular.dto.DeviceRepairRequest; import com.casic.missiles.modular.dto.statistics.*; +import com.casic.missiles.modular.enums.SecurityEventType; +import com.casic.missiles.modular.model.CaseCategoryLevel; import com.casic.missiles.modular.model.CaseHazardLevel; +import com.casic.missiles.modular.model.CaseInfo; import com.casic.missiles.modular.model.StaffInfo; +import com.casic.missiles.modular.service.DeviceInfoService; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.util.CollectionUtils; import org.springframework.web.bind.annotation.*; +import java.math.BigDecimal; import java.text.NumberFormat; import java.util.*; import java.util.stream.Collectors; @@ -40,6 +45,12 @@ @Autowired private HazardLevelMapper hazardLevelMapper; + @Autowired + private CategoryLevelMapper categoryLevelMapper; + + @Autowired + private DeviceInfoService deviceInfoService; + /** * 安防事件时域频次统计,每月的每天安防事件个数(原方案) * 月维度:展示每个月的每天的数据 @@ -89,15 +100,17 @@ List monthList = caseInfoMapper.selectPreMonthCountByYear(year); Map> collect = monthList.stream().collect(Collectors.groupingBy(PreMonthOrWeekCaseDTO::getHazardLevelCode)); HashMap strAvgMap = new HashMap<>(); + List resultList = new ArrayList<>(); for (String key : collect.keySet()) { List preMonthOrWeekCaseDTOS = collect.get(key); int sum = preMonthOrWeekCaseDTOS.stream().mapToInt(PreMonthOrWeekCaseDTO::getQuantity).sum(); //若年份是本年,则使用个安防级别数量/当前月份数 //若不是本年,除数为12 MonthAndWeekDTO monthAndWeekDTO = new MonthAndWeekDTO(); + String hazardName = hazardLevelMapper.selectHazardNameByCode(key); + monthAndWeekDTO.setLevelName(hazardName); if(year.equals(String.valueOf(DateUtil.thisYear()))){ monthAndWeekDTO.setMonthQuantity(sum / DateUtil.thisMonth()); -// monthAndWeekDTO.setLevelName(); strAvgMap.put(key, monthAndWeekDTO); }else{ monthAndWeekDTO.setMonthQuantity(sum / 12); @@ -113,27 +126,37 @@ if(year.equals(String.valueOf(DateUtil.thisYear()))){ if(!Objects.isNull(strAvgMap.get(key))){ MonthAndWeekDTO monthAndWeekDTO = strAvgMap.get(key); + String hazardName = hazardLevelMapper.selectHazardNameByCode(key); + monthAndWeekDTO.setLevelName(hazardName); monthAndWeekDTO.setWeekQuantity(sum / DateUtil.thisWeekOfYear()); strAvgMap.put(key, monthAndWeekDTO); }else{ MonthAndWeekDTO monthAndWeekDTO = new MonthAndWeekDTO(); + String hazardName = hazardLevelMapper.selectHazardNameByCode(key); + monthAndWeekDTO.setLevelName(hazardName); monthAndWeekDTO.setWeekQuantity(sum / DateUtil.thisWeekOfYear()); strAvgMap.put(key, monthAndWeekDTO); } }else{ if(!Objects.isNull(strAvgMap.get(key))){ MonthAndWeekDTO monthAndWeekDTO = strAvgMap.get(key); + String hazardName = hazardLevelMapper.selectHazardNameByCode(key); + monthAndWeekDTO.setLevelName(hazardName); monthAndWeekDTO.setWeekQuantity(sum / 52); strAvgMap.put(key, monthAndWeekDTO); }else{ MonthAndWeekDTO monthAndWeekDTO = new MonthAndWeekDTO(); + String hazardName = hazardLevelMapper.selectHazardNameByCode(key); + monthAndWeekDTO.setLevelName(hazardName); monthAndWeekDTO.setWeekQuantity(sum / 52); strAvgMap.put(key, monthAndWeekDTO); } } } - avgMonthAndWeekGroupDTO.setMap(strAvgMap); - return ResponseData.success(avgMonthAndWeekGroupDTO); + strAvgMap.keySet().forEach(key -> { + resultList.add(strAvgMap.get(key)); + }); + return ResponseData.success(resultList); } /** @@ -181,12 +204,178 @@ } /** - * 员工考勤人数变化,功能待定 + * 员工考勤人数变化,统计当天(横坐标为时)及近7天(横坐标为天)的考勤人数变化,只要发生一次考勤识别,次数的基数就正常增加(没有上班下班区分) */ + @PostMapping("/staff/attendanceNumber/{dimension}") + @ResponseBody + public Object attendanceNumber(@PathVariable("dimension") String dimension) { + List attendanceNumberDTOs = null; + List> resultList = new ArrayList<>(); + if("week".equals(dimension)){ + //近7天数据按天分组统计 + attendanceNumberDTOs = attendanceInfoMapper.getCountForWeek(); + }else if("day".equals(dimension)) { + //今天数据按小时分组统计 + attendanceNumberDTOs = attendanceInfoMapper.getCountForDay(); + } + if(CollectionUtils.isEmpty(attendanceNumberDTOs)){ + return ResponseData.error("该查询条件下,无员工出勤数据!"); + } + Map> collect = attendanceNumberDTOs.stream().collect(Collectors.groupingBy(AttendanceNumberDTO::getDate)); + collect.keySet().forEach(key -> { + List attendanceNumberDTOS = collect.get(key); + AttendanceNumberDTO attendanceNumberDTO = attendanceNumberDTOS.get(0); + AttendanceNumberDTO attendanceNumberDTO2 = attendanceNumberDTOS.get(1); + Map resultMap = new HashMap<>(); + resultMap.put(attendanceNumberDTO.getStaffType(), attendanceNumberDTO.getQuantity()); + resultMap.put(attendanceNumberDTO2.getStaffType(), attendanceNumberDTO2.getQuantity()); + resultMap.put("staticTime", attendanceNumberDTO.getDate()); + resultList.add(resultMap); + }); + return ResponseData.success(resultList); + } /** - * 近30天/近一周安保人员到岗排行 + * 早晚高峰区域安防评估 */ + @PostMapping("/security/assessment/{dimension}") + @ResponseBody + public Object securityAssessment(@PathVariable("dimension") String dimension) { + //查询各危险级别权重、各类别权重,放入map,避免循环中多次查数据库 + HashMap hazardScoreMap = new HashMap<>(); + List caseHazardLevelList = hazardLevelMapper.getCaseHazardLevelList(null); + caseHazardLevelList.forEach(hazardLevel -> { + hazardScoreMap.put(hazardLevel.getCode(), hazardLevel.getWeight()); + }); + HashMap categoryScoreMap = new HashMap<>(); + List categoryLevelList = categoryLevelMapper.getCaseCategoryLevelList(null); + categoryLevelList.forEach(categoryLevel -> { + categoryScoreMap.put(categoryLevel.getCode(), categoryLevel.getWeight()); + }); + HashMap hashMap = new HashMap<>(); + if("week".equals(dimension)){ + //近7天早晚高峰数据 + List caseInfos = caseInfoMapper.selectListBySevenDay(); + //按时间(天)进行分组 + caseInfos.forEach(caseInfo -> { + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); + Double score = Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + String[] array = caseInfo.getHappenTime().split(" "); + String dayTime = array[0]; + BigDecimal preScore; + if(hashMap.containsKey(dayTime)){ + Double aDouble = hashMap.get(dayTime); + preScore = new BigDecimal(aDouble.toString()); + + }else{ + preScore = new BigDecimal("100.0"); + } + BigDecimal nowScore = new BigDecimal(score.toString()); + hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); + }); + return ResponseData.success(hashMap); + }else if("day".equals(dimension)) { + //今天数据按小时分组统计 + List caseInfos = caseInfoMapper.selectListByToday(); + caseInfos.forEach(caseInfo -> { + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); + Double score = Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + String[] array = caseInfo.getHappenTime().split(":"); + String dayTime = array[0]; + BigDecimal preScore; + if(hashMap.containsKey(dayTime)){ + Double aDouble = hashMap.get(dayTime); + preScore = new BigDecimal(aDouble.toString()); + + }else{ + preScore = new BigDecimal("100.0"); + } + BigDecimal nowScore = new BigDecimal(score.toString()); + hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); + }); + return ResponseData.success(hashMap); + } + return null; + } + + /** + * 重点区域安防事态评估,统计重点区域6:00-23:00按小时分组数据 + */ + @GetMapping("/security/keyAreaStatistic") + @ResponseBody + public Object keyAreaStatistic() { + //查询各危险级别权重、各类别权重,放入map,避免循环中多次查数据库 + HashMap hazardScoreMap = new HashMap<>(); + List caseHazardLevelList = hazardLevelMapper.getCaseHazardLevelList(null); + caseHazardLevelList.forEach(hazardLevel -> { + hazardScoreMap.put(hazardLevel.getCode(), hazardLevel.getWeight()); + }); + HashMap categoryScoreMap = new HashMap<>(); + List categoryLevelList = categoryLevelMapper.getCaseCategoryLevelList(null); + categoryLevelList.forEach(categoryLevel -> { + categoryScoreMap.put(categoryLevel.getCode(), categoryLevel.getWeight()); + }); + HashMap hashMap = new HashMap<>(); + //今天数据按小时分组统计 + List caseInfos = caseInfoMapper.selectListByToday2(); + caseInfos.forEach(caseInfo -> { + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); + Double score = Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + String[] array = caseInfo.getHappenTime().split(":"); + String dayTime = array[0]; + BigDecimal preScore; + if(hashMap.containsKey(dayTime)){ + Double aDouble = hashMap.get(dayTime); + preScore = new BigDecimal(aDouble.toString()); + + }else{ + preScore = new BigDecimal("100.0"); + } + BigDecimal nowScore = new BigDecimal(score.toString()); + hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); + }); + return ResponseData.success(hashMap); + } + + /** + * 安防机动支援力量调配响应评估,根据事件已解决状态及已解决时间-发送时间,按时间(小时)分组统计 + */ + @GetMapping("/security/responseAssess") + @ResponseBody + public Object responseAssess() { + //查询各危险级别权重、各类别权重,放入map,避免循环中多次查数据库 + HashMap hazardScoreMap = new HashMap<>(); + List caseHazardLevelList = hazardLevelMapper.getCaseHazardLevelList(null); + caseHazardLevelList.forEach(hazardLevel -> { + hazardScoreMap.put(hazardLevel.getCode(), hazardLevel.getWeight()); + }); + HashMap hashMap = new HashMap<>(); + //今天数据按小时分组统计 + List caseInfos = caseInfoMapper.selectListByToday3(); + caseInfos.forEach(caseInfo -> { + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + //扣分=事件级别权重*未解决小时数 + Date updateTime = DateUtil.parse(caseInfo.getUpdateTime()); + Date happenTime = DateUtil.parse(caseInfo.getHappenTime()); + long between = DateUtil.between(updateTime, happenTime, DateUnit.HOUR); + Double score = Double.valueOf(hazardWeight)*between; + String[] array = caseInfo.getHappenTime().split(":"); + String dayTime = array[0]; + BigDecimal preScore; + if(hashMap.containsKey(dayTime)){ + Double aDouble = hashMap.get(dayTime); + preScore = new BigDecimal(aDouble.toString()); + }else{ + preScore = new BigDecimal("100.0"); + } + BigDecimal nowScore = new BigDecimal(score.toString()); + hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); + }); + return ResponseData.success(hashMap); + } /** * 重点区域威胁事件类型统计,优先级2,统计近7天和近30天 @@ -224,7 +413,34 @@ } /** - * 设备状态计算系数和评判,优先级3,需确认设备恢复时间是否可以获取 + * 近30天/近一周安保人员到岗排行 */ + + /** + * 安保等级评估,发生离岗事件减1分 + */ + @GetMapping("/security/levelAssess") + @ResponseBody + public Object securityLevelAssess() { + //今天数据按小时分组统计 + List resultList = caseInfoMapper.selectListByType(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); + resultList.forEach(result -> { + BigDecimal deScore = new BigDecimal(result.getQuantity()); + BigDecimal preScore = new BigDecimal("100.0"); + result.setScore(preScore.subtract(deScore).doubleValue()); + }); + return ResponseData.success(resultList); + } + + /** + * 设备状态计算系数和评判,即设备维修管理查询(不分页) + */ + @PostMapping("/device/repairList") + @ResponseBody + public Object repairList(@RequestBody DeviceRepairRequest deviceRepairRequest) { + List deviceRepairLogDTOS = deviceInfoService.deviceRepairListPage(deviceRepairRequest); + return ResponseData.success(deviceRepairLogDTOS); + } + } 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 fbf8ab6..c71a15a 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 @@ -1,13 +1,12 @@ package com.casic.missiles.modular.controller.hik; +import cn.hutool.core.date.DateTime; +import cn.hutool.core.date.DateUtil; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.casic.missiles.model.response.ResponseData; import com.casic.missiles.modular.dao.HikFaceGroupInfoMapper; -import com.casic.missiles.modular.dto.hik.EventSubscribeRequest; -import com.casic.missiles.modular.dto.hik.FaceGroupAdditionRequest; -import com.casic.missiles.modular.dto.hik.HikRecvEvent; -import com.casic.missiles.modular.dto.hik.OrgBatchAdd; +import com.casic.missiles.modular.dto.hik.*; import com.casic.missiles.modular.enums.HikUri; import com.casic.missiles.modular.enums.SecurityEventType; import com.casic.missiles.modular.model.CaseInfo; @@ -18,16 +17,20 @@ import com.casic.missiles.modular.util.CaseInfoFactoryUtil; import com.casic.missiles.modular.util.HikUtil; import com.casic.missiles.modular.util.ThreadPoolUtil; +import com.casic.missiles.modular.util.WebSocket; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; -import org.springframework.web.bind.annotation.*; +import org.springframework.util.CollectionUtils; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.RestController; -import java.net.InetAddress; -import java.net.UnknownHostException; import java.util.ArrayList; +import java.util.Iterator; import java.util.List; import java.util.Objects; @@ -38,7 +41,6 @@ */ @Slf4j @RestController -@RequestMapping("/hik") public class HikController { @Autowired @@ -53,28 +55,37 @@ @Autowired private HikService hikService; + @Autowired + private HikFaceGroupInfoMapper hikFaceGroupInfoMapper; + + @Autowired + private WebSocket webSocket; + @Value("${server.port}") private int serverPort; - @Autowired - private HikFaceGroupInfoMapper hikFaceGroupInfoMapper; /** * 海康事件订阅 */ - @PostMapping("/event/subscribe") + @PostMapping("/hik/event/subscribe") @ResponseBody - public Object eventSubscribe() throws UnknownHostException { + public Object eventSubscribe() { EventSubscribeRequest eventSubscribeRequest = new EventSubscribeRequest(); ArrayList list = new ArrayList<>(); list.add(SecurityEventType.DEVICE_OFFLINE); + list.add(SecurityEventType.DEVICE_ONLINE); list.add(SecurityEventType.KEY_PERSONNEL_IDENTIFY_EVENT); list.add(SecurityEventType.MONITORING_POINT_OFFLINE); + list.add(SecurityEventType.MONITORING_POINT_ONLINE); list.add(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); list.add(SecurityEventType.PERSONNEL_GATHER_EVENT); - InetAddress localHost = InetAddress.getLocalHost(); + list.add(SecurityEventType.VISITOR_REGISTER); + list.add(SecurityEventType.VISITOR_CHECKOUT); + list.add(SecurityEventType.HIGH_ALTITUDE_PARABOLIC); +// InetAddress localHost = InetAddress.getLocalHost(); eventSubscribeRequest.setEventTypes(list); - eventSubscribeRequest.setEventDest("https://" + localHost + ":" + serverPort + "/eventRcv"); + eventSubscribeRequest.setEventDest("http://" + "192.168.10.6" + ":" + serverPort + "/eventRcv"); //订阅类型,0-订阅原始事件,1-联动事件,2-原始事件和联动事件,不填使用默认值0 eventSubscribeRequest.setSubType(0); /** @@ -92,19 +103,25 @@ } /** + * 查询事件订阅信息 + */ + @PostMapping("/hik/event/query") + @ResponseBody + public Object eventQuery() { + String result = HikUtil.hikApi(HikUri.EVENT_INFO, ""); + return result; + } + + /** * 海康事件接收 */ @PostMapping("/eventRcv") @ResponseBody public Object eventRcv(@RequestBody HikRecvEvent hikRecvEvent) { //1、接收所需事件类型 - Long eventType = hikRecvEvent.getEventType(); + Number eventType = hikRecvEvent.getEventType(); log.info("接收到安防事件类型为:{}", eventType); CaseInfo caseInfo = caseInfoFactoryUtil.getCaseInfo(eventType); - //接收到不关心事件直接返回 - if(Objects.isNull(caseInfo)){ - return ResponseData.success(); - } //2、不同事件不同处理,caseInfoFactoryUtil已设置好事件基础定义信息 // 再为事件添加状态、设备编码、设备名称、位置、区域、时间 // 异步处理事件 @@ -114,19 +131,23 @@ caseHandle(hikRecvEvent, eventType, caseInfo); } })); +// caseHandle(hikRecvEvent, eventType, caseInfo); - return null; + return ResponseData.success(); } - private void caseHandle(HikRecvEvent hikRecvEvent, Long eventType, CaseInfo caseInfo) { + private void caseHandle(HikRecvEvent hikRecvEvent, Number eventType, CaseInfo caseInfo) { JSONArray eventArray = hikRecvEvent.getEventArray(); List caseInfos = new ArrayList<>(); - while (eventArray.stream().iterator().hasNext()) { + Iterator iterator = eventArray.iterator(); + while (iterator.hasNext()) { CaseInfo caseInfo1 = new CaseInfo(); - BeanUtils.copyProperties(caseInfo, caseInfo1); - JSONObject event = (JSONObject) eventArray.stream().iterator().next(); + if(!Objects.isNull(caseInfo)){ + BeanUtils.copyProperties(caseInfo, caseInfo1); + } + JSONObject event = (JSONObject) iterator.next(); //5种事件进行不同处理 - if(SecurityEventType.KEY_PERSONNEL_IDENTIFY_EVENT == eventType){ + if (SecurityEventType.KEY_PERSONNEL_IDENTIFY_EVENT.equals(eventType)) { //判断所属人脸分组 JSONObject data = (JSONObject) event.get("data"); JSONObject faceRecognitionResult = (JSONObject) data.get("faceRecognitionResult"); @@ -142,52 +163,101 @@ if (faceGroupCode.equals(blackListGroup.getFaceGroupCode())) { //黑名单分组处理 caseInfo1 = hikService.blackListHandle(event, caseInfo1); - }else if(faceGroupCode.equals(propertyPersonnelGroup.getFaceGroupCode())){ + } else if (faceGroupCode.equals(propertyPersonnelGroup.getFaceGroupCode())) { //考勤分组处理-物业人员,添加到考勤表 hikService.propertyAttendanceHandle(event); - }else if(faceGroupCode.equals(securityPersonnelGroup.getFaceGroupCode())){ + } else if (faceGroupCode.equals(securityPersonnelGroup.getFaceGroupCode())) { //考勤分组处理-安保人员,添加到考勤表 hikService.securityPersonnelHandle(event); - }else { + } else { return; } - }else if(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT == eventType){ + } else if (SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT.equals(eventType)) { //离岗事件处理 caseInfo1 = hikService.demobilizedHandle(event, caseInfo1); - }else if(SecurityEventType.PERSONNEL_GATHER_EVENT == eventType){ + } else if (SecurityEventType.PERSONNEL_GATHER_EVENT.equals(eventType)) { //人员聚集事件处理 caseInfo1 = hikService.personGatherHandle(event, caseInfo1); - }else if(SecurityEventType.MONITORING_POINT_OFFLINE == eventType){ + } else if (SecurityEventType.MONITORING_POINT_OFFLINE.equals(eventType)) { //监控点离线事件处理 caseInfo1 = hikService.monitorPointOfflineHandle(event, caseInfo1); - }else if(SecurityEventType.DEVICE_OFFLINE == eventType){ + } else if (SecurityEventType.MONITORING_POINT_ONLINE.equals(eventType)) { + //监控点上线事件处理 + hikService.monitorPointOnlineHandle(event); + } else if (SecurityEventType.DEVICE_OFFLINE.equals(eventType)) { //装置离线事件处理 caseInfo1 = hikService.deviceOfflineHandle(event, caseInfo1); - }else if(SecurityEventType.VISITOR_REGISTER == eventType){ + } else if (SecurityEventType.DEVICE_ONLINE.equals(eventType)) { + //装置上线处理 + hikService.deviceOnlineHandle(event); + } else if (SecurityEventType.VISITOR_REGISTER.equals(eventType)) { //记录访客登记记录,添加到访客记录表 hikService.visitorRegisterHandler(event); - }else if(SecurityEventType.VISITOR_CHECKOUT == eventType){ + } else if (SecurityEventType.VISITOR_CHECKOUT.equals(eventType)) { //记录访客签离记录 hikService.visitorCheckOutHandler(event); } - if(!Objects.isNull(caseInfo1) && !StringUtils.isEmpty(caseInfo1.getHappenTime())){ + if (!Objects.isNull(caseInfo1) && !StringUtils.isEmpty(caseInfo1.getHappenTime())) { caseInfos.add(caseInfo1); } } //3、安防事件入库 - if(!caseInfoService.insertCaseInfoBatch(caseInfos)){ - log.error("安防事件批量入库异常"); + if (!CollectionUtils.isEmpty(caseInfos) && !caseInfoService.insertCaseInfoBatch(caseInfos)) { + log.error("安防事件批量入库异常!"); } // TODO: 2022/8/15 webSocket推送 + if (CollectionUtils.isEmpty(caseInfos)) { + log.info("webSocket事件推送"); + webSocket.sendAllMessage(JSONObject.toJSONString(caseInfos)); + } return; } /** + * 以图搜图,前端用于轨迹追踪 + */ + @PostMapping("/hik/search/picture") + @ResponseBody + public Object searchPictures(@RequestBody SearchPicturesRequest searchPicturesRequest) { + DateTime startDateTime = DateUtil.parse(searchPicturesRequest.getStartTime()); + DateTime endDateTime = DateUtil.parse(searchPicturesRequest.getEndTime()); + String startTime = DateUtil.format(startDateTime, "yyyy-MM-dd'T'HH:mm:ss.SSSXXX"); + String endTime = DateUtil.format(endDateTime, "yyyy-MM-dd'T'HH:mm:ss.SSSXXX"); + searchPicturesRequest.setStartTime(startTime); + searchPicturesRequest.setEndTime(endTime); + String body = JSONObject.toJSONString(searchPicturesRequest); + String resultStr = HikUtil.hikApi(HikUri.SEARCH_PICTURES, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (!"0".equals(resultJson.get("code"))) { + log.error("请求海康,以图搜图失败,海康response:{}", resultStr); + return ResponseData.error("以图搜图失败"); + } + return ResponseData.success(resultJson); + } + + + /** + * 海康事件取消订阅 + */ + @PostMapping("/hik/event/cancel") + @ResponseBody + public Object eventCancelSubscribe(@RequestBody CancelSubscribeRequest cancelSubscribeRequest) { + String body = JSONObject.toJSONString(cancelSubscribeRequest); + String resultStr = HikUtil.hikApi(HikUri.EVENT_CANCEL, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (!"0".equals(resultJson.get("code"))) { + log.error("请求海康,取消订阅失败,海康response:{}", resultStr); + return ResponseData.error("取消订阅失败"); + } + return ResponseData.success(resultJson); + } + + /** * 单个添加海康人脸分组 * api->hik单个添加人脸分组api->response->mysql */ - @PostMapping("/faceGroup/single/add") + @PostMapping("/hik/faceGroup/single/add") @ResponseBody public Object faceGroupAddition(@RequestBody FaceGroupAdditionRequest faceGroupAdditionRequest) { String body = JSONObject.toJSONString(faceGroupAdditionRequest); @@ -212,7 +282,7 @@ * 批量添加海康组织 * api->hik批量添加组织api->response */ - @PostMapping("/org/batch/add") + @PostMapping("/hik/org/batch/add") @ResponseBody public Object orgBatchAdd(@RequestBody List orgBatchAddRequest) { String body = JSONObject.toJSONString(orgBatchAddRequest); @@ -232,4 +302,62 @@ return ResponseData.error("批量添加组织失败"); } + /** + * 获取人员列表 + */ + @PostMapping("/hik/person/personList") + @ResponseBody + public Object personList() { + PersonListRequest request = new PersonListRequest(); + request.setPageNo(1); + request.setPageSize(100); + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi("/api/resource/v2/person/personList", body); + return resultStr; + } + + /** + * 获取组织列表 + */ + @PostMapping("/hik/org/orgList") + @ResponseBody + public Object orgList() { + PersonListRequest request = new PersonListRequest(); + request.setPageNo(1); + request.setPageSize(100); + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi("/api/resource/v1/org/orgList", body); + return resultStr; + } + + /** + * 查询访客权限下载记录 + */ + @PostMapping("/hik/auth/result") + @ResponseBody + public Object authResult() { + PersonListRequest request = new PersonListRequest(); + request.setPageNo(1); + request.setPageSize(100); + request.setOrderId("ba101db6246711edaea66f7939a13638"); + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi("/api/visitor/v1/auth/result", body); + return resultStr; + } + + /** + * 人脸图片获取 + */ + @PostMapping("/hik/face/picture") + @ResponseBody + public Object facePicture() { + FaceRequest request = new FaceRequest(); +// List list = new ArrayList<>(); +// list.add(""); + request.setCertificateNum("wanggong"); + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi("/api/frs/v1/face", body); + return resultStr; + } + } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/AssetInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/AssetInfoMapper.java index 4f64e83..c0684ee 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/AssetInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/AssetInfoMapper.java @@ -17,6 +17,6 @@ @Mapper public interface AssetInfoMapper extends BaseMapper { - List getAssetInfoListPage(@Param("page") Page page, AssetInfoRequest assetInfoRequest); + List getAssetInfoListPage(@Param("page") Page page, @Param("assetInfoRequest") AssetInfoRequest assetInfoRequest); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/BlackListController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/BlackListController.java index a27f9f8..0c06661 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/BlackListController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/BlackListController.java @@ -1,13 +1,18 @@ package com.casic.missiles.modular.controller; +import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.base.controller.ExportController; import com.casic.missiles.core.page.PageFactory; import com.casic.missiles.model.response.ResponseData; import com.casic.missiles.modular.dto.BlackInfoRequest; +import com.casic.missiles.modular.dto.BlackPictureRequest; +import com.casic.missiles.modular.dto.hik.PersonInfoRequest; +import com.casic.missiles.modular.enums.HikUri; import com.casic.missiles.modular.enums.OperateTypeEnum; import com.casic.missiles.modular.model.BlackInfo; import com.casic.missiles.modular.service.BlackInfoService; +import com.casic.missiles.modular.util.HikUtil; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; @@ -56,4 +61,22 @@ return null; } + /** + * 黑名单人员照片 + */ + @PostMapping("/personPicture") + @ResponseBody + public Object personPicture(@RequestBody BlackPictureRequest blackPictureRequest){ + //获取照片 + String picUri = blackPictureRequest.getPicUri(); + String serverIndexCode = blackPictureRequest.getServerIndexCode(); + PersonInfoRequest picRequest = new PersonInfoRequest(); + picRequest.setPicUri(picUri); + picRequest.setServerIndexCode(serverIndexCode); + String reBody = JSONObject.toJSONString(picRequest); + //重定向地址获取 + String url = HikUtil.hikApiFor302(HikUri.PERSON_PICTURE, reBody); + return ResponseData.success(url); + } + } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/DeviceController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/DeviceController.java index e1c4eba..666bbee 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/DeviceController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/DeviceController.java @@ -107,7 +107,7 @@ } /** - * 设备维修管理查询(分页),需计算MTTR=总维修时间/故障次数 + * 设备状态计算与评判/设备维修管理查询(分页),需计算MTTR=总维修时间/故障次数 */ @PostMapping("/repair/listPage") @ResponseBody @@ -211,7 +211,7 @@ //需根据设备编号获取到对应的门禁点唯一标识 doorControlRequest.setDoorIndexCodes(indexCodes); doorControlRequest.setControlType(Integer.valueOf(gateGroupDTO.getStatus())); - String body = JSONObject.toJSONString(deviceCodes); + String body = JSONObject.toJSONString(doorControlRequest); String resultStr = HikUtil.hikApi(HikUri.DOOR_CONTROL, body); JSONObject resultJson = (JSONObject)JSONObject.parse(resultStr); if (!"0".equals(resultJson.get("code"))) { diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/StaffController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/StaffController.java index b58ccab..704093c 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/StaffController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/StaffController.java @@ -2,15 +2,21 @@ import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.util.StrUtil; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.base.controller.ExportController; import com.casic.missiles.core.page.PageFactory; import com.casic.missiles.model.response.ErrorResponseData; import com.casic.missiles.model.response.ResponseData; import com.casic.missiles.modular.dto.StaffInfoRequest; +import com.casic.missiles.modular.dto.hik.PersonInfoRequest; +import com.casic.missiles.modular.dto.hik.StaffCardRequest; +import com.casic.missiles.modular.enums.HikUri; import com.casic.missiles.modular.enums.OperateTypeEnum; import com.casic.missiles.modular.model.StaffInfo; import com.casic.missiles.modular.service.StaffInfoService; +import com.casic.missiles.modular.util.HikUtil; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; @@ -110,4 +116,60 @@ } return ResponseData.success(); } + + /** + * 批量开卡,添加人员之后调用,若在一个接口中添加人员成功开卡失败则第二次添加时会有问题 + */ + @PostMapping("/cardBinding") + @ResponseBody + public Object cardBinding(@RequestBody StaffCardRequest staffCardRequest) { + String body = JSONObject.toJSONString(staffCardRequest); + String resultStr = HikUtil.hikApi(HikUri.CARD_BINDING, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (!"0".equals(resultJson.get("code"))) { + log.error("请求海康,批量开卡失败,海康response:{}", resultStr); + return ResponseData.error("批量开卡失败"); + } + //保存卡号 + if(staffInfoService.saveCardInfo(staffCardRequest) > 0){ + return ResponseData.success(); + } + return ResponseData.error("批量开卡失败"); + } + + /** + * 获取员工照片,海康存储 + */ + @PostMapping("/personPicture/{staffCode}") + @ResponseBody + public Object personPicture(@PathVariable("staffCode") String staffCode){ + //获取员工详细信息,含图片服务器、uri + PersonInfoRequest request = new PersonInfoRequest(); + List list = new ArrayList<>(); + list.add(staffCode); + request.setParamName("personId"); + request.setParamValue(list); + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi(HikUri.PERSON_INFO, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (!"0".equals(resultJson.get("code"))) { + log.error("请求海康,根据人员唯一字段获取人员详细信息失败,海康response:{}", resultStr); + return ResponseData.error("获取员工照片失败"); + } + //获取照片 + JSONObject data = (JSONObject) resultJson.get("data"); + JSONArray dataArray = (JSONArray) data.get("list"); + JSONObject jsonObject = (JSONObject) dataArray.get(0); + JSONArray personPhoto = (JSONArray) jsonObject.get("personPhoto"); + JSONObject photo = (JSONObject) personPhoto.get(0); + String picUri = photo.getString("picUri"); + String serverIndexCode = photo.getString("serverIndexCode"); + PersonInfoRequest picRequest = new PersonInfoRequest(); + picRequest.setPicUri(picUri); + picRequest.setServerIndexCode(serverIndexCode); + String reBody = JSONObject.toJSONString(picRequest); + //重定向地址获取 + String url = HikUtil.hikApiFor302(HikUri.PERSON_PICTURE, reBody); + return ResponseData.success(url); + } } 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 4a07dd9..7b1dcf6 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 @@ -16,6 +16,7 @@ import com.casic.missiles.modular.redis.key.CacheKeys; import com.casic.missiles.modular.service.CockpitService; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.util.CollectionUtils; import org.springframework.web.bind.annotation.*; @@ -24,10 +25,7 @@ import java.text.NumberFormat; import java.time.LocalDateTime; import java.time.temporal.ChronoUnit; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.util.*; import java.util.stream.Collectors; /** @@ -73,6 +71,9 @@ private StatisticNumberMapper numberMapper; @Autowired + private HazardLevelMapper hazardLevelMapper; + + @Autowired private AccessGroupConfig accessGroupConfig; /** @@ -104,8 +105,24 @@ public Object buildingNumberPerHour(){ //当天按小时分组的人数 List list = numberMapper.selectListByTime(); - Map> collect = list.stream().collect(Collectors.groupingBy(BuildingNumberDTO::getStatisticPosition)); - return ResponseData.success(collect); + Map> collect = list.stream().collect(Collectors.groupingBy(BuildingNumberDTO::getStatisticTime)); + //定时任务中已将每小时三栋楼人数存到数据库 + //将一期主楼和录制楼人数合并,二期单算 + List> resultList = new ArrayList<>(); + collect.keySet().forEach(key -> { + List buildingNumberDTOS = collect.get(key); + BuildingNumberDTO mainBuildingOne = buildingNumberDTOS.get(0); + BuildingNumberDTO mainBuildingTwo = buildingNumberDTOS.get(1); + BuildingNumberDTO recordingBuilding = buildingNumberDTOS.get(2); + HashMap resultMap = new HashMap<>(); + Integer oneQuantity = Integer.valueOf(mainBuildingOne.getStatisticQuantity()); + Integer recordingQuantity = Integer.valueOf(recordingBuilding.getStatisticQuantity()); + resultMap.put("staticTime", mainBuildingOne.getStatisticTime()); + resultMap.put(mainBuildingOne.getStatisticPositionName()+"、"+recordingBuilding.getStatisticPositionName(), String.valueOf(oneQuantity+recordingQuantity)); + resultMap.put(mainBuildingTwo.getStatisticPositionName(), mainBuildingTwo.getStatisticQuantity()); + resultList.add(resultMap); + }); + return ResponseData.success(resultList); } /** @@ -151,12 +168,11 @@ public Object securityNumber() { QueryWrapper wrapper = new QueryWrapper<>(); wrapper.eq("staff_type", 2); + // TODO: 2022/9/2 后续使用产品确定的每天出勤的安保人员的数量 Integer total = staffInfoMapper.selectCount(wrapper); - //当日离岗事件个数 - QueryWrapper wrapper1 = new QueryWrapper<>(); - wrapper1.eq("hik_event_type", SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); - wrapper1.apply("date_format(now(),'%Y-%m-%d') = date_format(happen_time,'%Y-%m-%d')"); - Integer leave = caseInfoMapper.selectCount(wrapper1); + //当日离岗事件按设备去重后的个数 + // TODO: 2022/9/2 目前相当于24小时内的计算,之后看需要可改成自定义小时数计算离岗率,即离岗+6小时内仅一次离岗则恢复为100%,多次则累加离岗次数计算离岗率 + Integer leave = caseInfoMapper.selectDemobilizedCount(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); NumberFormat numberFormat = NumberFormat.getInstance(); // 设置精确到小数点后2位 numberFormat.setMaximumFractionDigits(2); @@ -179,7 +195,6 @@ @ResponseBody public Object visitorApplyDetail() { List reasonGroup = applyMapper.selectByVisitReason(); - HashMap resultMap = new HashMap<>(); NumberFormat numberFormat = NumberFormat.getInstance(); // 设置精确到小数点后2位 numberFormat.setMaximumFractionDigits(2); @@ -187,12 +202,17 @@ if(0 == sum){ return ResponseData.success(); } + List resultList = new ArrayList<>(); reasonGroup.forEach(group -> { String reasonName = dictService.getDictNameByCode(SecurityEventDict.VISIT_REASON, group.getVisitReason()); String result = numberFormat.format((float) group.getQuantity() / (float) sum * 100); - resultMap.put(reasonName, result+"%"); + ApplyReasonGroupDTO applyReasonGroupDTO = new ApplyReasonGroupDTO(); + applyReasonGroupDTO.setQuantity(group.getQuantity()); + applyReasonGroupDTO.setVisitReason(reasonName); + applyReasonGroupDTO.setRatio(result+"%"); + resultList.add(applyReasonGroupDTO); }); - return ResponseData.success(resultMap); + return ResponseData.success(resultList); } /** @@ -247,6 +267,32 @@ } /** + * 机动力量实时在岗率,在岗人数除以总应在岗人数,用离岗+6小时内恢复为100%,6小时外再计算 + */ + @GetMapping("/staff/beOnDutyRatio") + @ResponseBody + public Object beOnDutyRatio() { + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("staff_type", 2); + // TODO: 2022/9/2 后续使用产品确定的每天出勤的安保人员的数量 + Integer total = staffInfoMapper.selectCount(wrapper); + if(0 == total){ + return ResponseData.success(null); + } + //当日离岗事件按设备去重后的个数 + // TODO: 2022/9/2 目前相当于24小时内的计算,之后看需要可改成自定义小时数计算离岗率,即离岗+6小时内仅一次离岗则恢复为100%,多次则累加离岗次数计算离岗率 + List onDutyRatioDTOS = caseInfoMapper.selectDemobilizedCountByHour(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); + onDutyRatioDTOS.forEach(dto -> { + NumberFormat numberFormat = NumberFormat.getInstance(); + // 设置精确到小数点后2位 + numberFormat.setMaximumFractionDigits(2); + String result = numberFormat.format(100 - Float.valueOf(dto.getQuantity()) / (float) total * 100); + dto.setRatio(result+"%"); + }); + return ResponseData.success(onDutyRatioDTOS); + } + + /** * 闸机速通门统计-设备状态分组计算数量,devType传闸机字典key * 视频频监控摄像机统计-设备状态分组计算数量,devType传摄像头字典key */ @@ -262,12 +308,17 @@ if(sum <= 0){ return ResponseData.error("无该类设备信息"); } + List resultList = new ArrayList<>(); gateStatusGroup.forEach(group -> { String devStatus = dictService.getDictNameByCode(SecurityEventDict.DEVICE_STATUS, group.getStatus()); String result = numberFormat.format((float) group.getQuantity() / (float) sum * 100); - resultMap.put(devStatus, result+"%"); + GateStatusGroupResponse gateStatusGroupResponse = new GateStatusGroupResponse(); + gateStatusGroupResponse.setStatus(devStatus); + gateStatusGroupResponse.setRatio(result+"%"); + resultList.add(gateStatusGroupResponse); }); - resultMap.put("总", sum); + resultMap.put("total", sum); + resultMap.put("list", resultList); return ResponseData.success(resultMap); } @@ -282,17 +333,38 @@ String position = securityScoreDTO.getPosition(); List caseInfos = caseInfoMapper.selectByPosition(position); //查询各危险级别权重、各类别权重,放入map,避免循环中多次查数据库 - + HashMap hazardScoreMap = new HashMap<>(); + List caseHazardLevelList = hazardLevelMapper.getCaseHazardLevelList(null); + caseHazardLevelList.forEach(hazardLevel -> { + hazardScoreMap.put(hazardLevel.getCode(), hazardLevel.getWeight()); + }); + HashMap categoryScoreMap = new HashMap<>(); + List categoryLevelList = categoryLevelMapper.getCaseCategoryLevelList(null); + categoryLevelList.forEach(categoryLevel -> { + categoryScoreMap.put(categoryLevel.getCode(), categoryLevel.getWeight()); + }); + //事件按楼层分组,计算 List securityScoreDTOs = new ArrayList<>(); caseInfos.forEach(caseInfo -> { SecurityScoreDTO securityScoreDTO1 = new SecurityScoreDTO(); + securityScoreDTO1.setPosition(caseInfo.getPosition()); securityScoreDTO1.setArea(caseInfo.getArea()); - // TODO: 2022/8/4 楼层评分计算根据产品定义调整 -// caseInfo.get -// securityScoreDTO1.setScore(); + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); + Double score = 100 - Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + securityScoreDTO1.setScore(score); + securityScoreDTOs.add(securityScoreDTO1); }); - - return null; + 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); + }); + return ResponseData.success(securityScoreDTOs); } /** @@ -303,9 +375,13 @@ public Object SecurityFrequency(@RequestBody SecurityFrequencyDTO securityFrequencyDTO) { String year = securityFrequencyDTO.getYear(); String month = securityFrequencyDTO.getMonth(); - Integer quantity = caseInfoMapper.selectCountByMonth(year, month); - securityFrequencyDTO.setQuantity(quantity); - return ResponseData.success(securityFrequencyDTO); + if(!StringUtils.isEmpty(year) && StringUtils.isEmpty(month)){ + Integer quantity = caseInfoMapper.selectCountByMonth(year, month); + securityFrequencyDTO.setQuantity(quantity); + return ResponseData.success(securityFrequencyDTO); + } + List list = caseInfoMapper.selectPreMonthCount(); + return ResponseData.success(list); } } 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 ae4d770..f4f075c 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 @@ -1,20 +1,25 @@ package com.casic.missiles.modular.controller.cockpit; +import cn.hutool.core.date.DateUnit; import cn.hutool.core.date.DateUtil; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.casic.missiles.model.response.ResponseData; -import com.casic.missiles.modular.dao.AttendanceInfoMapper; -import com.casic.missiles.modular.dao.CaseInfoMapper; -import com.casic.missiles.modular.dao.HazardLevelMapper; -import com.casic.missiles.modular.dao.StaffInfoMapper; +import com.casic.missiles.modular.dao.*; +import com.casic.missiles.modular.dto.DeviceRepairLogDTO; +import com.casic.missiles.modular.dto.DeviceRepairRequest; import com.casic.missiles.modular.dto.statistics.*; +import com.casic.missiles.modular.enums.SecurityEventType; +import com.casic.missiles.modular.model.CaseCategoryLevel; import com.casic.missiles.modular.model.CaseHazardLevel; +import com.casic.missiles.modular.model.CaseInfo; import com.casic.missiles.modular.model.StaffInfo; +import com.casic.missiles.modular.service.DeviceInfoService; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.util.CollectionUtils; import org.springframework.web.bind.annotation.*; +import java.math.BigDecimal; import java.text.NumberFormat; import java.util.*; import java.util.stream.Collectors; @@ -40,6 +45,12 @@ @Autowired private HazardLevelMapper hazardLevelMapper; + @Autowired + private CategoryLevelMapper categoryLevelMapper; + + @Autowired + private DeviceInfoService deviceInfoService; + /** * 安防事件时域频次统计,每月的每天安防事件个数(原方案) * 月维度:展示每个月的每天的数据 @@ -89,15 +100,17 @@ List monthList = caseInfoMapper.selectPreMonthCountByYear(year); Map> collect = monthList.stream().collect(Collectors.groupingBy(PreMonthOrWeekCaseDTO::getHazardLevelCode)); HashMap strAvgMap = new HashMap<>(); + List resultList = new ArrayList<>(); for (String key : collect.keySet()) { List preMonthOrWeekCaseDTOS = collect.get(key); int sum = preMonthOrWeekCaseDTOS.stream().mapToInt(PreMonthOrWeekCaseDTO::getQuantity).sum(); //若年份是本年,则使用个安防级别数量/当前月份数 //若不是本年,除数为12 MonthAndWeekDTO monthAndWeekDTO = new MonthAndWeekDTO(); + String hazardName = hazardLevelMapper.selectHazardNameByCode(key); + monthAndWeekDTO.setLevelName(hazardName); if(year.equals(String.valueOf(DateUtil.thisYear()))){ monthAndWeekDTO.setMonthQuantity(sum / DateUtil.thisMonth()); -// monthAndWeekDTO.setLevelName(); strAvgMap.put(key, monthAndWeekDTO); }else{ monthAndWeekDTO.setMonthQuantity(sum / 12); @@ -113,27 +126,37 @@ if(year.equals(String.valueOf(DateUtil.thisYear()))){ if(!Objects.isNull(strAvgMap.get(key))){ MonthAndWeekDTO monthAndWeekDTO = strAvgMap.get(key); + String hazardName = hazardLevelMapper.selectHazardNameByCode(key); + monthAndWeekDTO.setLevelName(hazardName); monthAndWeekDTO.setWeekQuantity(sum / DateUtil.thisWeekOfYear()); strAvgMap.put(key, monthAndWeekDTO); }else{ MonthAndWeekDTO monthAndWeekDTO = new MonthAndWeekDTO(); + String hazardName = hazardLevelMapper.selectHazardNameByCode(key); + monthAndWeekDTO.setLevelName(hazardName); monthAndWeekDTO.setWeekQuantity(sum / DateUtil.thisWeekOfYear()); strAvgMap.put(key, monthAndWeekDTO); } }else{ if(!Objects.isNull(strAvgMap.get(key))){ MonthAndWeekDTO monthAndWeekDTO = strAvgMap.get(key); + String hazardName = hazardLevelMapper.selectHazardNameByCode(key); + monthAndWeekDTO.setLevelName(hazardName); monthAndWeekDTO.setWeekQuantity(sum / 52); strAvgMap.put(key, monthAndWeekDTO); }else{ MonthAndWeekDTO monthAndWeekDTO = new MonthAndWeekDTO(); + String hazardName = hazardLevelMapper.selectHazardNameByCode(key); + monthAndWeekDTO.setLevelName(hazardName); monthAndWeekDTO.setWeekQuantity(sum / 52); strAvgMap.put(key, monthAndWeekDTO); } } } - avgMonthAndWeekGroupDTO.setMap(strAvgMap); - return ResponseData.success(avgMonthAndWeekGroupDTO); + strAvgMap.keySet().forEach(key -> { + resultList.add(strAvgMap.get(key)); + }); + return ResponseData.success(resultList); } /** @@ -181,12 +204,178 @@ } /** - * 员工考勤人数变化,功能待定 + * 员工考勤人数变化,统计当天(横坐标为时)及近7天(横坐标为天)的考勤人数变化,只要发生一次考勤识别,次数的基数就正常增加(没有上班下班区分) */ + @PostMapping("/staff/attendanceNumber/{dimension}") + @ResponseBody + public Object attendanceNumber(@PathVariable("dimension") String dimension) { + List attendanceNumberDTOs = null; + List> resultList = new ArrayList<>(); + if("week".equals(dimension)){ + //近7天数据按天分组统计 + attendanceNumberDTOs = attendanceInfoMapper.getCountForWeek(); + }else if("day".equals(dimension)) { + //今天数据按小时分组统计 + attendanceNumberDTOs = attendanceInfoMapper.getCountForDay(); + } + if(CollectionUtils.isEmpty(attendanceNumberDTOs)){ + return ResponseData.error("该查询条件下,无员工出勤数据!"); + } + Map> collect = attendanceNumberDTOs.stream().collect(Collectors.groupingBy(AttendanceNumberDTO::getDate)); + collect.keySet().forEach(key -> { + List attendanceNumberDTOS = collect.get(key); + AttendanceNumberDTO attendanceNumberDTO = attendanceNumberDTOS.get(0); + AttendanceNumberDTO attendanceNumberDTO2 = attendanceNumberDTOS.get(1); + Map resultMap = new HashMap<>(); + resultMap.put(attendanceNumberDTO.getStaffType(), attendanceNumberDTO.getQuantity()); + resultMap.put(attendanceNumberDTO2.getStaffType(), attendanceNumberDTO2.getQuantity()); + resultMap.put("staticTime", attendanceNumberDTO.getDate()); + resultList.add(resultMap); + }); + return ResponseData.success(resultList); + } /** - * 近30天/近一周安保人员到岗排行 + * 早晚高峰区域安防评估 */ + @PostMapping("/security/assessment/{dimension}") + @ResponseBody + public Object securityAssessment(@PathVariable("dimension") String dimension) { + //查询各危险级别权重、各类别权重,放入map,避免循环中多次查数据库 + HashMap hazardScoreMap = new HashMap<>(); + List caseHazardLevelList = hazardLevelMapper.getCaseHazardLevelList(null); + caseHazardLevelList.forEach(hazardLevel -> { + hazardScoreMap.put(hazardLevel.getCode(), hazardLevel.getWeight()); + }); + HashMap categoryScoreMap = new HashMap<>(); + List categoryLevelList = categoryLevelMapper.getCaseCategoryLevelList(null); + categoryLevelList.forEach(categoryLevel -> { + categoryScoreMap.put(categoryLevel.getCode(), categoryLevel.getWeight()); + }); + HashMap hashMap = new HashMap<>(); + if("week".equals(dimension)){ + //近7天早晚高峰数据 + List caseInfos = caseInfoMapper.selectListBySevenDay(); + //按时间(天)进行分组 + caseInfos.forEach(caseInfo -> { + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); + Double score = Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + String[] array = caseInfo.getHappenTime().split(" "); + String dayTime = array[0]; + BigDecimal preScore; + if(hashMap.containsKey(dayTime)){ + Double aDouble = hashMap.get(dayTime); + preScore = new BigDecimal(aDouble.toString()); + + }else{ + preScore = new BigDecimal("100.0"); + } + BigDecimal nowScore = new BigDecimal(score.toString()); + hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); + }); + return ResponseData.success(hashMap); + }else if("day".equals(dimension)) { + //今天数据按小时分组统计 + List caseInfos = caseInfoMapper.selectListByToday(); + caseInfos.forEach(caseInfo -> { + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); + Double score = Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + String[] array = caseInfo.getHappenTime().split(":"); + String dayTime = array[0]; + BigDecimal preScore; + if(hashMap.containsKey(dayTime)){ + Double aDouble = hashMap.get(dayTime); + preScore = new BigDecimal(aDouble.toString()); + + }else{ + preScore = new BigDecimal("100.0"); + } + BigDecimal nowScore = new BigDecimal(score.toString()); + hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); + }); + return ResponseData.success(hashMap); + } + return null; + } + + /** + * 重点区域安防事态评估,统计重点区域6:00-23:00按小时分组数据 + */ + @GetMapping("/security/keyAreaStatistic") + @ResponseBody + public Object keyAreaStatistic() { + //查询各危险级别权重、各类别权重,放入map,避免循环中多次查数据库 + HashMap hazardScoreMap = new HashMap<>(); + List caseHazardLevelList = hazardLevelMapper.getCaseHazardLevelList(null); + caseHazardLevelList.forEach(hazardLevel -> { + hazardScoreMap.put(hazardLevel.getCode(), hazardLevel.getWeight()); + }); + HashMap categoryScoreMap = new HashMap<>(); + List categoryLevelList = categoryLevelMapper.getCaseCategoryLevelList(null); + categoryLevelList.forEach(categoryLevel -> { + categoryScoreMap.put(categoryLevel.getCode(), categoryLevel.getWeight()); + }); + HashMap hashMap = new HashMap<>(); + //今天数据按小时分组统计 + List caseInfos = caseInfoMapper.selectListByToday2(); + caseInfos.forEach(caseInfo -> { + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); + Double score = Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + String[] array = caseInfo.getHappenTime().split(":"); + String dayTime = array[0]; + BigDecimal preScore; + if(hashMap.containsKey(dayTime)){ + Double aDouble = hashMap.get(dayTime); + preScore = new BigDecimal(aDouble.toString()); + + }else{ + preScore = new BigDecimal("100.0"); + } + BigDecimal nowScore = new BigDecimal(score.toString()); + hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); + }); + return ResponseData.success(hashMap); + } + + /** + * 安防机动支援力量调配响应评估,根据事件已解决状态及已解决时间-发送时间,按时间(小时)分组统计 + */ + @GetMapping("/security/responseAssess") + @ResponseBody + public Object responseAssess() { + //查询各危险级别权重、各类别权重,放入map,避免循环中多次查数据库 + HashMap hazardScoreMap = new HashMap<>(); + List caseHazardLevelList = hazardLevelMapper.getCaseHazardLevelList(null); + caseHazardLevelList.forEach(hazardLevel -> { + hazardScoreMap.put(hazardLevel.getCode(), hazardLevel.getWeight()); + }); + HashMap hashMap = new HashMap<>(); + //今天数据按小时分组统计 + List caseInfos = caseInfoMapper.selectListByToday3(); + caseInfos.forEach(caseInfo -> { + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + //扣分=事件级别权重*未解决小时数 + Date updateTime = DateUtil.parse(caseInfo.getUpdateTime()); + Date happenTime = DateUtil.parse(caseInfo.getHappenTime()); + long between = DateUtil.between(updateTime, happenTime, DateUnit.HOUR); + Double score = Double.valueOf(hazardWeight)*between; + String[] array = caseInfo.getHappenTime().split(":"); + String dayTime = array[0]; + BigDecimal preScore; + if(hashMap.containsKey(dayTime)){ + Double aDouble = hashMap.get(dayTime); + preScore = new BigDecimal(aDouble.toString()); + }else{ + preScore = new BigDecimal("100.0"); + } + BigDecimal nowScore = new BigDecimal(score.toString()); + hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); + }); + return ResponseData.success(hashMap); + } /** * 重点区域威胁事件类型统计,优先级2,统计近7天和近30天 @@ -224,7 +413,34 @@ } /** - * 设备状态计算系数和评判,优先级3,需确认设备恢复时间是否可以获取 + * 近30天/近一周安保人员到岗排行 */ + + /** + * 安保等级评估,发生离岗事件减1分 + */ + @GetMapping("/security/levelAssess") + @ResponseBody + public Object securityLevelAssess() { + //今天数据按小时分组统计 + List resultList = caseInfoMapper.selectListByType(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); + resultList.forEach(result -> { + BigDecimal deScore = new BigDecimal(result.getQuantity()); + BigDecimal preScore = new BigDecimal("100.0"); + result.setScore(preScore.subtract(deScore).doubleValue()); + }); + return ResponseData.success(resultList); + } + + /** + * 设备状态计算系数和评判,即设备维修管理查询(不分页) + */ + @PostMapping("/device/repairList") + @ResponseBody + public Object repairList(@RequestBody DeviceRepairRequest deviceRepairRequest) { + List deviceRepairLogDTOS = deviceInfoService.deviceRepairListPage(deviceRepairRequest); + return ResponseData.success(deviceRepairLogDTOS); + } + } 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 fbf8ab6..c71a15a 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 @@ -1,13 +1,12 @@ package com.casic.missiles.modular.controller.hik; +import cn.hutool.core.date.DateTime; +import cn.hutool.core.date.DateUtil; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.casic.missiles.model.response.ResponseData; import com.casic.missiles.modular.dao.HikFaceGroupInfoMapper; -import com.casic.missiles.modular.dto.hik.EventSubscribeRequest; -import com.casic.missiles.modular.dto.hik.FaceGroupAdditionRequest; -import com.casic.missiles.modular.dto.hik.HikRecvEvent; -import com.casic.missiles.modular.dto.hik.OrgBatchAdd; +import com.casic.missiles.modular.dto.hik.*; import com.casic.missiles.modular.enums.HikUri; import com.casic.missiles.modular.enums.SecurityEventType; import com.casic.missiles.modular.model.CaseInfo; @@ -18,16 +17,20 @@ import com.casic.missiles.modular.util.CaseInfoFactoryUtil; import com.casic.missiles.modular.util.HikUtil; import com.casic.missiles.modular.util.ThreadPoolUtil; +import com.casic.missiles.modular.util.WebSocket; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; -import org.springframework.web.bind.annotation.*; +import org.springframework.util.CollectionUtils; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.RestController; -import java.net.InetAddress; -import java.net.UnknownHostException; import java.util.ArrayList; +import java.util.Iterator; import java.util.List; import java.util.Objects; @@ -38,7 +41,6 @@ */ @Slf4j @RestController -@RequestMapping("/hik") public class HikController { @Autowired @@ -53,28 +55,37 @@ @Autowired private HikService hikService; + @Autowired + private HikFaceGroupInfoMapper hikFaceGroupInfoMapper; + + @Autowired + private WebSocket webSocket; + @Value("${server.port}") private int serverPort; - @Autowired - private HikFaceGroupInfoMapper hikFaceGroupInfoMapper; /** * 海康事件订阅 */ - @PostMapping("/event/subscribe") + @PostMapping("/hik/event/subscribe") @ResponseBody - public Object eventSubscribe() throws UnknownHostException { + public Object eventSubscribe() { EventSubscribeRequest eventSubscribeRequest = new EventSubscribeRequest(); ArrayList list = new ArrayList<>(); list.add(SecurityEventType.DEVICE_OFFLINE); + list.add(SecurityEventType.DEVICE_ONLINE); list.add(SecurityEventType.KEY_PERSONNEL_IDENTIFY_EVENT); list.add(SecurityEventType.MONITORING_POINT_OFFLINE); + list.add(SecurityEventType.MONITORING_POINT_ONLINE); list.add(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); list.add(SecurityEventType.PERSONNEL_GATHER_EVENT); - InetAddress localHost = InetAddress.getLocalHost(); + list.add(SecurityEventType.VISITOR_REGISTER); + list.add(SecurityEventType.VISITOR_CHECKOUT); + list.add(SecurityEventType.HIGH_ALTITUDE_PARABOLIC); +// InetAddress localHost = InetAddress.getLocalHost(); eventSubscribeRequest.setEventTypes(list); - eventSubscribeRequest.setEventDest("https://" + localHost + ":" + serverPort + "/eventRcv"); + eventSubscribeRequest.setEventDest("http://" + "192.168.10.6" + ":" + serverPort + "/eventRcv"); //订阅类型,0-订阅原始事件,1-联动事件,2-原始事件和联动事件,不填使用默认值0 eventSubscribeRequest.setSubType(0); /** @@ -92,19 +103,25 @@ } /** + * 查询事件订阅信息 + */ + @PostMapping("/hik/event/query") + @ResponseBody + public Object eventQuery() { + String result = HikUtil.hikApi(HikUri.EVENT_INFO, ""); + return result; + } + + /** * 海康事件接收 */ @PostMapping("/eventRcv") @ResponseBody public Object eventRcv(@RequestBody HikRecvEvent hikRecvEvent) { //1、接收所需事件类型 - Long eventType = hikRecvEvent.getEventType(); + Number eventType = hikRecvEvent.getEventType(); log.info("接收到安防事件类型为:{}", eventType); CaseInfo caseInfo = caseInfoFactoryUtil.getCaseInfo(eventType); - //接收到不关心事件直接返回 - if(Objects.isNull(caseInfo)){ - return ResponseData.success(); - } //2、不同事件不同处理,caseInfoFactoryUtil已设置好事件基础定义信息 // 再为事件添加状态、设备编码、设备名称、位置、区域、时间 // 异步处理事件 @@ -114,19 +131,23 @@ caseHandle(hikRecvEvent, eventType, caseInfo); } })); +// caseHandle(hikRecvEvent, eventType, caseInfo); - return null; + return ResponseData.success(); } - private void caseHandle(HikRecvEvent hikRecvEvent, Long eventType, CaseInfo caseInfo) { + private void caseHandle(HikRecvEvent hikRecvEvent, Number eventType, CaseInfo caseInfo) { JSONArray eventArray = hikRecvEvent.getEventArray(); List caseInfos = new ArrayList<>(); - while (eventArray.stream().iterator().hasNext()) { + Iterator iterator = eventArray.iterator(); + while (iterator.hasNext()) { CaseInfo caseInfo1 = new CaseInfo(); - BeanUtils.copyProperties(caseInfo, caseInfo1); - JSONObject event = (JSONObject) eventArray.stream().iterator().next(); + if(!Objects.isNull(caseInfo)){ + BeanUtils.copyProperties(caseInfo, caseInfo1); + } + JSONObject event = (JSONObject) iterator.next(); //5种事件进行不同处理 - if(SecurityEventType.KEY_PERSONNEL_IDENTIFY_EVENT == eventType){ + if (SecurityEventType.KEY_PERSONNEL_IDENTIFY_EVENT.equals(eventType)) { //判断所属人脸分组 JSONObject data = (JSONObject) event.get("data"); JSONObject faceRecognitionResult = (JSONObject) data.get("faceRecognitionResult"); @@ -142,52 +163,101 @@ if (faceGroupCode.equals(blackListGroup.getFaceGroupCode())) { //黑名单分组处理 caseInfo1 = hikService.blackListHandle(event, caseInfo1); - }else if(faceGroupCode.equals(propertyPersonnelGroup.getFaceGroupCode())){ + } else if (faceGroupCode.equals(propertyPersonnelGroup.getFaceGroupCode())) { //考勤分组处理-物业人员,添加到考勤表 hikService.propertyAttendanceHandle(event); - }else if(faceGroupCode.equals(securityPersonnelGroup.getFaceGroupCode())){ + } else if (faceGroupCode.equals(securityPersonnelGroup.getFaceGroupCode())) { //考勤分组处理-安保人员,添加到考勤表 hikService.securityPersonnelHandle(event); - }else { + } else { return; } - }else if(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT == eventType){ + } else if (SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT.equals(eventType)) { //离岗事件处理 caseInfo1 = hikService.demobilizedHandle(event, caseInfo1); - }else if(SecurityEventType.PERSONNEL_GATHER_EVENT == eventType){ + } else if (SecurityEventType.PERSONNEL_GATHER_EVENT.equals(eventType)) { //人员聚集事件处理 caseInfo1 = hikService.personGatherHandle(event, caseInfo1); - }else if(SecurityEventType.MONITORING_POINT_OFFLINE == eventType){ + } else if (SecurityEventType.MONITORING_POINT_OFFLINE.equals(eventType)) { //监控点离线事件处理 caseInfo1 = hikService.monitorPointOfflineHandle(event, caseInfo1); - }else if(SecurityEventType.DEVICE_OFFLINE == eventType){ + } else if (SecurityEventType.MONITORING_POINT_ONLINE.equals(eventType)) { + //监控点上线事件处理 + hikService.monitorPointOnlineHandle(event); + } else if (SecurityEventType.DEVICE_OFFLINE.equals(eventType)) { //装置离线事件处理 caseInfo1 = hikService.deviceOfflineHandle(event, caseInfo1); - }else if(SecurityEventType.VISITOR_REGISTER == eventType){ + } else if (SecurityEventType.DEVICE_ONLINE.equals(eventType)) { + //装置上线处理 + hikService.deviceOnlineHandle(event); + } else if (SecurityEventType.VISITOR_REGISTER.equals(eventType)) { //记录访客登记记录,添加到访客记录表 hikService.visitorRegisterHandler(event); - }else if(SecurityEventType.VISITOR_CHECKOUT == eventType){ + } else if (SecurityEventType.VISITOR_CHECKOUT.equals(eventType)) { //记录访客签离记录 hikService.visitorCheckOutHandler(event); } - if(!Objects.isNull(caseInfo1) && !StringUtils.isEmpty(caseInfo1.getHappenTime())){ + if (!Objects.isNull(caseInfo1) && !StringUtils.isEmpty(caseInfo1.getHappenTime())) { caseInfos.add(caseInfo1); } } //3、安防事件入库 - if(!caseInfoService.insertCaseInfoBatch(caseInfos)){ - log.error("安防事件批量入库异常"); + if (!CollectionUtils.isEmpty(caseInfos) && !caseInfoService.insertCaseInfoBatch(caseInfos)) { + log.error("安防事件批量入库异常!"); } // TODO: 2022/8/15 webSocket推送 + if (CollectionUtils.isEmpty(caseInfos)) { + log.info("webSocket事件推送"); + webSocket.sendAllMessage(JSONObject.toJSONString(caseInfos)); + } return; } /** + * 以图搜图,前端用于轨迹追踪 + */ + @PostMapping("/hik/search/picture") + @ResponseBody + public Object searchPictures(@RequestBody SearchPicturesRequest searchPicturesRequest) { + DateTime startDateTime = DateUtil.parse(searchPicturesRequest.getStartTime()); + DateTime endDateTime = DateUtil.parse(searchPicturesRequest.getEndTime()); + String startTime = DateUtil.format(startDateTime, "yyyy-MM-dd'T'HH:mm:ss.SSSXXX"); + String endTime = DateUtil.format(endDateTime, "yyyy-MM-dd'T'HH:mm:ss.SSSXXX"); + searchPicturesRequest.setStartTime(startTime); + searchPicturesRequest.setEndTime(endTime); + String body = JSONObject.toJSONString(searchPicturesRequest); + String resultStr = HikUtil.hikApi(HikUri.SEARCH_PICTURES, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (!"0".equals(resultJson.get("code"))) { + log.error("请求海康,以图搜图失败,海康response:{}", resultStr); + return ResponseData.error("以图搜图失败"); + } + return ResponseData.success(resultJson); + } + + + /** + * 海康事件取消订阅 + */ + @PostMapping("/hik/event/cancel") + @ResponseBody + public Object eventCancelSubscribe(@RequestBody CancelSubscribeRequest cancelSubscribeRequest) { + String body = JSONObject.toJSONString(cancelSubscribeRequest); + String resultStr = HikUtil.hikApi(HikUri.EVENT_CANCEL, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (!"0".equals(resultJson.get("code"))) { + log.error("请求海康,取消订阅失败,海康response:{}", resultStr); + return ResponseData.error("取消订阅失败"); + } + return ResponseData.success(resultJson); + } + + /** * 单个添加海康人脸分组 * api->hik单个添加人脸分组api->response->mysql */ - @PostMapping("/faceGroup/single/add") + @PostMapping("/hik/faceGroup/single/add") @ResponseBody public Object faceGroupAddition(@RequestBody FaceGroupAdditionRequest faceGroupAdditionRequest) { String body = JSONObject.toJSONString(faceGroupAdditionRequest); @@ -212,7 +282,7 @@ * 批量添加海康组织 * api->hik批量添加组织api->response */ - @PostMapping("/org/batch/add") + @PostMapping("/hik/org/batch/add") @ResponseBody public Object orgBatchAdd(@RequestBody List orgBatchAddRequest) { String body = JSONObject.toJSONString(orgBatchAddRequest); @@ -232,4 +302,62 @@ return ResponseData.error("批量添加组织失败"); } + /** + * 获取人员列表 + */ + @PostMapping("/hik/person/personList") + @ResponseBody + public Object personList() { + PersonListRequest request = new PersonListRequest(); + request.setPageNo(1); + request.setPageSize(100); + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi("/api/resource/v2/person/personList", body); + return resultStr; + } + + /** + * 获取组织列表 + */ + @PostMapping("/hik/org/orgList") + @ResponseBody + public Object orgList() { + PersonListRequest request = new PersonListRequest(); + request.setPageNo(1); + request.setPageSize(100); + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi("/api/resource/v1/org/orgList", body); + return resultStr; + } + + /** + * 查询访客权限下载记录 + */ + @PostMapping("/hik/auth/result") + @ResponseBody + public Object authResult() { + PersonListRequest request = new PersonListRequest(); + request.setPageNo(1); + request.setPageSize(100); + request.setOrderId("ba101db6246711edaea66f7939a13638"); + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi("/api/visitor/v1/auth/result", body); + return resultStr; + } + + /** + * 人脸图片获取 + */ + @PostMapping("/hik/face/picture") + @ResponseBody + public Object facePicture() { + FaceRequest request = new FaceRequest(); +// List list = new ArrayList<>(); +// list.add(""); + request.setCertificateNum("wanggong"); + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi("/api/frs/v1/face", body); + return resultStr; + } + } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/AssetInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/AssetInfoMapper.java index 4f64e83..c0684ee 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/AssetInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/AssetInfoMapper.java @@ -17,6 +17,6 @@ @Mapper public interface AssetInfoMapper extends BaseMapper { - List getAssetInfoListPage(@Param("page") Page page, AssetInfoRequest assetInfoRequest); + List getAssetInfoListPage(@Param("page") Page page, @Param("assetInfoRequest") AssetInfoRequest assetInfoRequest); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/AttendanceInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/AttendanceInfoMapper.java index f9e793e..ec87e46 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/AttendanceInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/AttendanceInfoMapper.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.statistics.AttendanceNumberDTO; import com.casic.missiles.modular.dto.statistics.AttendanceRatioDTO; import com.casic.missiles.modular.model.AttendanceInfo; import org.apache.ibatis.annotations.Mapper; @@ -17,7 +18,7 @@ */ @Mapper public interface AttendanceInfoMapper extends BaseMapper { - List getAttendanceInfoListPage(@Param("page") Page page, StaffInfoRequest attendanceInfoRequest); + List getAttendanceInfoListPage(@Param("page") Page page, @Param("attendanceInfoRequest") StaffInfoRequest attendanceInfoRequest); AttendanceInfo selectByCodeAndDate(@Param("staffCode") String staffCode); @@ -26,4 +27,8 @@ List getCountByTypeAndDateForMonth(@Param("staffType")String staffType); List getCountByTypeAndDateForYear(@Param("staffType")String staffType); + + List getCountForWeek(); + + List getCountForDay(); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/BlackListController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/BlackListController.java index a27f9f8..0c06661 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/BlackListController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/BlackListController.java @@ -1,13 +1,18 @@ package com.casic.missiles.modular.controller; +import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.base.controller.ExportController; import com.casic.missiles.core.page.PageFactory; import com.casic.missiles.model.response.ResponseData; import com.casic.missiles.modular.dto.BlackInfoRequest; +import com.casic.missiles.modular.dto.BlackPictureRequest; +import com.casic.missiles.modular.dto.hik.PersonInfoRequest; +import com.casic.missiles.modular.enums.HikUri; import com.casic.missiles.modular.enums.OperateTypeEnum; import com.casic.missiles.modular.model.BlackInfo; import com.casic.missiles.modular.service.BlackInfoService; +import com.casic.missiles.modular.util.HikUtil; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; @@ -56,4 +61,22 @@ return null; } + /** + * 黑名单人员照片 + */ + @PostMapping("/personPicture") + @ResponseBody + public Object personPicture(@RequestBody BlackPictureRequest blackPictureRequest){ + //获取照片 + String picUri = blackPictureRequest.getPicUri(); + String serverIndexCode = blackPictureRequest.getServerIndexCode(); + PersonInfoRequest picRequest = new PersonInfoRequest(); + picRequest.setPicUri(picUri); + picRequest.setServerIndexCode(serverIndexCode); + String reBody = JSONObject.toJSONString(picRequest); + //重定向地址获取 + String url = HikUtil.hikApiFor302(HikUri.PERSON_PICTURE, reBody); + return ResponseData.success(url); + } + } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/DeviceController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/DeviceController.java index e1c4eba..666bbee 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/DeviceController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/DeviceController.java @@ -107,7 +107,7 @@ } /** - * 设备维修管理查询(分页),需计算MTTR=总维修时间/故障次数 + * 设备状态计算与评判/设备维修管理查询(分页),需计算MTTR=总维修时间/故障次数 */ @PostMapping("/repair/listPage") @ResponseBody @@ -211,7 +211,7 @@ //需根据设备编号获取到对应的门禁点唯一标识 doorControlRequest.setDoorIndexCodes(indexCodes); doorControlRequest.setControlType(Integer.valueOf(gateGroupDTO.getStatus())); - String body = JSONObject.toJSONString(deviceCodes); + String body = JSONObject.toJSONString(doorControlRequest); String resultStr = HikUtil.hikApi(HikUri.DOOR_CONTROL, body); JSONObject resultJson = (JSONObject)JSONObject.parse(resultStr); if (!"0".equals(resultJson.get("code"))) { diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/StaffController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/StaffController.java index b58ccab..704093c 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/StaffController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/StaffController.java @@ -2,15 +2,21 @@ import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.util.StrUtil; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.base.controller.ExportController; import com.casic.missiles.core.page.PageFactory; import com.casic.missiles.model.response.ErrorResponseData; import com.casic.missiles.model.response.ResponseData; import com.casic.missiles.modular.dto.StaffInfoRequest; +import com.casic.missiles.modular.dto.hik.PersonInfoRequest; +import com.casic.missiles.modular.dto.hik.StaffCardRequest; +import com.casic.missiles.modular.enums.HikUri; import com.casic.missiles.modular.enums.OperateTypeEnum; import com.casic.missiles.modular.model.StaffInfo; import com.casic.missiles.modular.service.StaffInfoService; +import com.casic.missiles.modular.util.HikUtil; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; @@ -110,4 +116,60 @@ } return ResponseData.success(); } + + /** + * 批量开卡,添加人员之后调用,若在一个接口中添加人员成功开卡失败则第二次添加时会有问题 + */ + @PostMapping("/cardBinding") + @ResponseBody + public Object cardBinding(@RequestBody StaffCardRequest staffCardRequest) { + String body = JSONObject.toJSONString(staffCardRequest); + String resultStr = HikUtil.hikApi(HikUri.CARD_BINDING, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (!"0".equals(resultJson.get("code"))) { + log.error("请求海康,批量开卡失败,海康response:{}", resultStr); + return ResponseData.error("批量开卡失败"); + } + //保存卡号 + if(staffInfoService.saveCardInfo(staffCardRequest) > 0){ + return ResponseData.success(); + } + return ResponseData.error("批量开卡失败"); + } + + /** + * 获取员工照片,海康存储 + */ + @PostMapping("/personPicture/{staffCode}") + @ResponseBody + public Object personPicture(@PathVariable("staffCode") String staffCode){ + //获取员工详细信息,含图片服务器、uri + PersonInfoRequest request = new PersonInfoRequest(); + List list = new ArrayList<>(); + list.add(staffCode); + request.setParamName("personId"); + request.setParamValue(list); + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi(HikUri.PERSON_INFO, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (!"0".equals(resultJson.get("code"))) { + log.error("请求海康,根据人员唯一字段获取人员详细信息失败,海康response:{}", resultStr); + return ResponseData.error("获取员工照片失败"); + } + //获取照片 + JSONObject data = (JSONObject) resultJson.get("data"); + JSONArray dataArray = (JSONArray) data.get("list"); + JSONObject jsonObject = (JSONObject) dataArray.get(0); + JSONArray personPhoto = (JSONArray) jsonObject.get("personPhoto"); + JSONObject photo = (JSONObject) personPhoto.get(0); + String picUri = photo.getString("picUri"); + String serverIndexCode = photo.getString("serverIndexCode"); + PersonInfoRequest picRequest = new PersonInfoRequest(); + picRequest.setPicUri(picUri); + picRequest.setServerIndexCode(serverIndexCode); + String reBody = JSONObject.toJSONString(picRequest); + //重定向地址获取 + String url = HikUtil.hikApiFor302(HikUri.PERSON_PICTURE, reBody); + return ResponseData.success(url); + } } 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 4a07dd9..7b1dcf6 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 @@ -16,6 +16,7 @@ import com.casic.missiles.modular.redis.key.CacheKeys; import com.casic.missiles.modular.service.CockpitService; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.util.CollectionUtils; import org.springframework.web.bind.annotation.*; @@ -24,10 +25,7 @@ import java.text.NumberFormat; import java.time.LocalDateTime; import java.time.temporal.ChronoUnit; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.util.*; import java.util.stream.Collectors; /** @@ -73,6 +71,9 @@ private StatisticNumberMapper numberMapper; @Autowired + private HazardLevelMapper hazardLevelMapper; + + @Autowired private AccessGroupConfig accessGroupConfig; /** @@ -104,8 +105,24 @@ public Object buildingNumberPerHour(){ //当天按小时分组的人数 List list = numberMapper.selectListByTime(); - Map> collect = list.stream().collect(Collectors.groupingBy(BuildingNumberDTO::getStatisticPosition)); - return ResponseData.success(collect); + Map> collect = list.stream().collect(Collectors.groupingBy(BuildingNumberDTO::getStatisticTime)); + //定时任务中已将每小时三栋楼人数存到数据库 + //将一期主楼和录制楼人数合并,二期单算 + List> resultList = new ArrayList<>(); + collect.keySet().forEach(key -> { + List buildingNumberDTOS = collect.get(key); + BuildingNumberDTO mainBuildingOne = buildingNumberDTOS.get(0); + BuildingNumberDTO mainBuildingTwo = buildingNumberDTOS.get(1); + BuildingNumberDTO recordingBuilding = buildingNumberDTOS.get(2); + HashMap resultMap = new HashMap<>(); + Integer oneQuantity = Integer.valueOf(mainBuildingOne.getStatisticQuantity()); + Integer recordingQuantity = Integer.valueOf(recordingBuilding.getStatisticQuantity()); + resultMap.put("staticTime", mainBuildingOne.getStatisticTime()); + resultMap.put(mainBuildingOne.getStatisticPositionName()+"、"+recordingBuilding.getStatisticPositionName(), String.valueOf(oneQuantity+recordingQuantity)); + resultMap.put(mainBuildingTwo.getStatisticPositionName(), mainBuildingTwo.getStatisticQuantity()); + resultList.add(resultMap); + }); + return ResponseData.success(resultList); } /** @@ -151,12 +168,11 @@ public Object securityNumber() { QueryWrapper wrapper = new QueryWrapper<>(); wrapper.eq("staff_type", 2); + // TODO: 2022/9/2 后续使用产品确定的每天出勤的安保人员的数量 Integer total = staffInfoMapper.selectCount(wrapper); - //当日离岗事件个数 - QueryWrapper wrapper1 = new QueryWrapper<>(); - wrapper1.eq("hik_event_type", SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); - wrapper1.apply("date_format(now(),'%Y-%m-%d') = date_format(happen_time,'%Y-%m-%d')"); - Integer leave = caseInfoMapper.selectCount(wrapper1); + //当日离岗事件按设备去重后的个数 + // TODO: 2022/9/2 目前相当于24小时内的计算,之后看需要可改成自定义小时数计算离岗率,即离岗+6小时内仅一次离岗则恢复为100%,多次则累加离岗次数计算离岗率 + Integer leave = caseInfoMapper.selectDemobilizedCount(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); NumberFormat numberFormat = NumberFormat.getInstance(); // 设置精确到小数点后2位 numberFormat.setMaximumFractionDigits(2); @@ -179,7 +195,6 @@ @ResponseBody public Object visitorApplyDetail() { List reasonGroup = applyMapper.selectByVisitReason(); - HashMap resultMap = new HashMap<>(); NumberFormat numberFormat = NumberFormat.getInstance(); // 设置精确到小数点后2位 numberFormat.setMaximumFractionDigits(2); @@ -187,12 +202,17 @@ if(0 == sum){ return ResponseData.success(); } + List resultList = new ArrayList<>(); reasonGroup.forEach(group -> { String reasonName = dictService.getDictNameByCode(SecurityEventDict.VISIT_REASON, group.getVisitReason()); String result = numberFormat.format((float) group.getQuantity() / (float) sum * 100); - resultMap.put(reasonName, result+"%"); + ApplyReasonGroupDTO applyReasonGroupDTO = new ApplyReasonGroupDTO(); + applyReasonGroupDTO.setQuantity(group.getQuantity()); + applyReasonGroupDTO.setVisitReason(reasonName); + applyReasonGroupDTO.setRatio(result+"%"); + resultList.add(applyReasonGroupDTO); }); - return ResponseData.success(resultMap); + return ResponseData.success(resultList); } /** @@ -247,6 +267,32 @@ } /** + * 机动力量实时在岗率,在岗人数除以总应在岗人数,用离岗+6小时内恢复为100%,6小时外再计算 + */ + @GetMapping("/staff/beOnDutyRatio") + @ResponseBody + public Object beOnDutyRatio() { + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("staff_type", 2); + // TODO: 2022/9/2 后续使用产品确定的每天出勤的安保人员的数量 + Integer total = staffInfoMapper.selectCount(wrapper); + if(0 == total){ + return ResponseData.success(null); + } + //当日离岗事件按设备去重后的个数 + // TODO: 2022/9/2 目前相当于24小时内的计算,之后看需要可改成自定义小时数计算离岗率,即离岗+6小时内仅一次离岗则恢复为100%,多次则累加离岗次数计算离岗率 + List onDutyRatioDTOS = caseInfoMapper.selectDemobilizedCountByHour(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); + onDutyRatioDTOS.forEach(dto -> { + NumberFormat numberFormat = NumberFormat.getInstance(); + // 设置精确到小数点后2位 + numberFormat.setMaximumFractionDigits(2); + String result = numberFormat.format(100 - Float.valueOf(dto.getQuantity()) / (float) total * 100); + dto.setRatio(result+"%"); + }); + return ResponseData.success(onDutyRatioDTOS); + } + + /** * 闸机速通门统计-设备状态分组计算数量,devType传闸机字典key * 视频频监控摄像机统计-设备状态分组计算数量,devType传摄像头字典key */ @@ -262,12 +308,17 @@ if(sum <= 0){ return ResponseData.error("无该类设备信息"); } + List resultList = new ArrayList<>(); gateStatusGroup.forEach(group -> { String devStatus = dictService.getDictNameByCode(SecurityEventDict.DEVICE_STATUS, group.getStatus()); String result = numberFormat.format((float) group.getQuantity() / (float) sum * 100); - resultMap.put(devStatus, result+"%"); + GateStatusGroupResponse gateStatusGroupResponse = new GateStatusGroupResponse(); + gateStatusGroupResponse.setStatus(devStatus); + gateStatusGroupResponse.setRatio(result+"%"); + resultList.add(gateStatusGroupResponse); }); - resultMap.put("总", sum); + resultMap.put("total", sum); + resultMap.put("list", resultList); return ResponseData.success(resultMap); } @@ -282,17 +333,38 @@ String position = securityScoreDTO.getPosition(); List caseInfos = caseInfoMapper.selectByPosition(position); //查询各危险级别权重、各类别权重,放入map,避免循环中多次查数据库 - + HashMap hazardScoreMap = new HashMap<>(); + List caseHazardLevelList = hazardLevelMapper.getCaseHazardLevelList(null); + caseHazardLevelList.forEach(hazardLevel -> { + hazardScoreMap.put(hazardLevel.getCode(), hazardLevel.getWeight()); + }); + HashMap categoryScoreMap = new HashMap<>(); + List categoryLevelList = categoryLevelMapper.getCaseCategoryLevelList(null); + categoryLevelList.forEach(categoryLevel -> { + categoryScoreMap.put(categoryLevel.getCode(), categoryLevel.getWeight()); + }); + //事件按楼层分组,计算 List securityScoreDTOs = new ArrayList<>(); caseInfos.forEach(caseInfo -> { SecurityScoreDTO securityScoreDTO1 = new SecurityScoreDTO(); + securityScoreDTO1.setPosition(caseInfo.getPosition()); securityScoreDTO1.setArea(caseInfo.getArea()); - // TODO: 2022/8/4 楼层评分计算根据产品定义调整 -// caseInfo.get -// securityScoreDTO1.setScore(); + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); + Double score = 100 - Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + securityScoreDTO1.setScore(score); + securityScoreDTOs.add(securityScoreDTO1); }); - - return null; + 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); + }); + return ResponseData.success(securityScoreDTOs); } /** @@ -303,9 +375,13 @@ public Object SecurityFrequency(@RequestBody SecurityFrequencyDTO securityFrequencyDTO) { String year = securityFrequencyDTO.getYear(); String month = securityFrequencyDTO.getMonth(); - Integer quantity = caseInfoMapper.selectCountByMonth(year, month); - securityFrequencyDTO.setQuantity(quantity); - return ResponseData.success(securityFrequencyDTO); + if(!StringUtils.isEmpty(year) && StringUtils.isEmpty(month)){ + Integer quantity = caseInfoMapper.selectCountByMonth(year, month); + securityFrequencyDTO.setQuantity(quantity); + return ResponseData.success(securityFrequencyDTO); + } + List list = caseInfoMapper.selectPreMonthCount(); + return ResponseData.success(list); } } 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 ae4d770..f4f075c 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 @@ -1,20 +1,25 @@ package com.casic.missiles.modular.controller.cockpit; +import cn.hutool.core.date.DateUnit; import cn.hutool.core.date.DateUtil; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.casic.missiles.model.response.ResponseData; -import com.casic.missiles.modular.dao.AttendanceInfoMapper; -import com.casic.missiles.modular.dao.CaseInfoMapper; -import com.casic.missiles.modular.dao.HazardLevelMapper; -import com.casic.missiles.modular.dao.StaffInfoMapper; +import com.casic.missiles.modular.dao.*; +import com.casic.missiles.modular.dto.DeviceRepairLogDTO; +import com.casic.missiles.modular.dto.DeviceRepairRequest; import com.casic.missiles.modular.dto.statistics.*; +import com.casic.missiles.modular.enums.SecurityEventType; +import com.casic.missiles.modular.model.CaseCategoryLevel; import com.casic.missiles.modular.model.CaseHazardLevel; +import com.casic.missiles.modular.model.CaseInfo; import com.casic.missiles.modular.model.StaffInfo; +import com.casic.missiles.modular.service.DeviceInfoService; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.util.CollectionUtils; import org.springframework.web.bind.annotation.*; +import java.math.BigDecimal; import java.text.NumberFormat; import java.util.*; import java.util.stream.Collectors; @@ -40,6 +45,12 @@ @Autowired private HazardLevelMapper hazardLevelMapper; + @Autowired + private CategoryLevelMapper categoryLevelMapper; + + @Autowired + private DeviceInfoService deviceInfoService; + /** * 安防事件时域频次统计,每月的每天安防事件个数(原方案) * 月维度:展示每个月的每天的数据 @@ -89,15 +100,17 @@ List monthList = caseInfoMapper.selectPreMonthCountByYear(year); Map> collect = monthList.stream().collect(Collectors.groupingBy(PreMonthOrWeekCaseDTO::getHazardLevelCode)); HashMap strAvgMap = new HashMap<>(); + List resultList = new ArrayList<>(); for (String key : collect.keySet()) { List preMonthOrWeekCaseDTOS = collect.get(key); int sum = preMonthOrWeekCaseDTOS.stream().mapToInt(PreMonthOrWeekCaseDTO::getQuantity).sum(); //若年份是本年,则使用个安防级别数量/当前月份数 //若不是本年,除数为12 MonthAndWeekDTO monthAndWeekDTO = new MonthAndWeekDTO(); + String hazardName = hazardLevelMapper.selectHazardNameByCode(key); + monthAndWeekDTO.setLevelName(hazardName); if(year.equals(String.valueOf(DateUtil.thisYear()))){ monthAndWeekDTO.setMonthQuantity(sum / DateUtil.thisMonth()); -// monthAndWeekDTO.setLevelName(); strAvgMap.put(key, monthAndWeekDTO); }else{ monthAndWeekDTO.setMonthQuantity(sum / 12); @@ -113,27 +126,37 @@ if(year.equals(String.valueOf(DateUtil.thisYear()))){ if(!Objects.isNull(strAvgMap.get(key))){ MonthAndWeekDTO monthAndWeekDTO = strAvgMap.get(key); + String hazardName = hazardLevelMapper.selectHazardNameByCode(key); + monthAndWeekDTO.setLevelName(hazardName); monthAndWeekDTO.setWeekQuantity(sum / DateUtil.thisWeekOfYear()); strAvgMap.put(key, monthAndWeekDTO); }else{ MonthAndWeekDTO monthAndWeekDTO = new MonthAndWeekDTO(); + String hazardName = hazardLevelMapper.selectHazardNameByCode(key); + monthAndWeekDTO.setLevelName(hazardName); monthAndWeekDTO.setWeekQuantity(sum / DateUtil.thisWeekOfYear()); strAvgMap.put(key, monthAndWeekDTO); } }else{ if(!Objects.isNull(strAvgMap.get(key))){ MonthAndWeekDTO monthAndWeekDTO = strAvgMap.get(key); + String hazardName = hazardLevelMapper.selectHazardNameByCode(key); + monthAndWeekDTO.setLevelName(hazardName); monthAndWeekDTO.setWeekQuantity(sum / 52); strAvgMap.put(key, monthAndWeekDTO); }else{ MonthAndWeekDTO monthAndWeekDTO = new MonthAndWeekDTO(); + String hazardName = hazardLevelMapper.selectHazardNameByCode(key); + monthAndWeekDTO.setLevelName(hazardName); monthAndWeekDTO.setWeekQuantity(sum / 52); strAvgMap.put(key, monthAndWeekDTO); } } } - avgMonthAndWeekGroupDTO.setMap(strAvgMap); - return ResponseData.success(avgMonthAndWeekGroupDTO); + strAvgMap.keySet().forEach(key -> { + resultList.add(strAvgMap.get(key)); + }); + return ResponseData.success(resultList); } /** @@ -181,12 +204,178 @@ } /** - * 员工考勤人数变化,功能待定 + * 员工考勤人数变化,统计当天(横坐标为时)及近7天(横坐标为天)的考勤人数变化,只要发生一次考勤识别,次数的基数就正常增加(没有上班下班区分) */ + @PostMapping("/staff/attendanceNumber/{dimension}") + @ResponseBody + public Object attendanceNumber(@PathVariable("dimension") String dimension) { + List attendanceNumberDTOs = null; + List> resultList = new ArrayList<>(); + if("week".equals(dimension)){ + //近7天数据按天分组统计 + attendanceNumberDTOs = attendanceInfoMapper.getCountForWeek(); + }else if("day".equals(dimension)) { + //今天数据按小时分组统计 + attendanceNumberDTOs = attendanceInfoMapper.getCountForDay(); + } + if(CollectionUtils.isEmpty(attendanceNumberDTOs)){ + return ResponseData.error("该查询条件下,无员工出勤数据!"); + } + Map> collect = attendanceNumberDTOs.stream().collect(Collectors.groupingBy(AttendanceNumberDTO::getDate)); + collect.keySet().forEach(key -> { + List attendanceNumberDTOS = collect.get(key); + AttendanceNumberDTO attendanceNumberDTO = attendanceNumberDTOS.get(0); + AttendanceNumberDTO attendanceNumberDTO2 = attendanceNumberDTOS.get(1); + Map resultMap = new HashMap<>(); + resultMap.put(attendanceNumberDTO.getStaffType(), attendanceNumberDTO.getQuantity()); + resultMap.put(attendanceNumberDTO2.getStaffType(), attendanceNumberDTO2.getQuantity()); + resultMap.put("staticTime", attendanceNumberDTO.getDate()); + resultList.add(resultMap); + }); + return ResponseData.success(resultList); + } /** - * 近30天/近一周安保人员到岗排行 + * 早晚高峰区域安防评估 */ + @PostMapping("/security/assessment/{dimension}") + @ResponseBody + public Object securityAssessment(@PathVariable("dimension") String dimension) { + //查询各危险级别权重、各类别权重,放入map,避免循环中多次查数据库 + HashMap hazardScoreMap = new HashMap<>(); + List caseHazardLevelList = hazardLevelMapper.getCaseHazardLevelList(null); + caseHazardLevelList.forEach(hazardLevel -> { + hazardScoreMap.put(hazardLevel.getCode(), hazardLevel.getWeight()); + }); + HashMap categoryScoreMap = new HashMap<>(); + List categoryLevelList = categoryLevelMapper.getCaseCategoryLevelList(null); + categoryLevelList.forEach(categoryLevel -> { + categoryScoreMap.put(categoryLevel.getCode(), categoryLevel.getWeight()); + }); + HashMap hashMap = new HashMap<>(); + if("week".equals(dimension)){ + //近7天早晚高峰数据 + List caseInfos = caseInfoMapper.selectListBySevenDay(); + //按时间(天)进行分组 + caseInfos.forEach(caseInfo -> { + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); + Double score = Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + String[] array = caseInfo.getHappenTime().split(" "); + String dayTime = array[0]; + BigDecimal preScore; + if(hashMap.containsKey(dayTime)){ + Double aDouble = hashMap.get(dayTime); + preScore = new BigDecimal(aDouble.toString()); + + }else{ + preScore = new BigDecimal("100.0"); + } + BigDecimal nowScore = new BigDecimal(score.toString()); + hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); + }); + return ResponseData.success(hashMap); + }else if("day".equals(dimension)) { + //今天数据按小时分组统计 + List caseInfos = caseInfoMapper.selectListByToday(); + caseInfos.forEach(caseInfo -> { + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); + Double score = Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + String[] array = caseInfo.getHappenTime().split(":"); + String dayTime = array[0]; + BigDecimal preScore; + if(hashMap.containsKey(dayTime)){ + Double aDouble = hashMap.get(dayTime); + preScore = new BigDecimal(aDouble.toString()); + + }else{ + preScore = new BigDecimal("100.0"); + } + BigDecimal nowScore = new BigDecimal(score.toString()); + hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); + }); + return ResponseData.success(hashMap); + } + return null; + } + + /** + * 重点区域安防事态评估,统计重点区域6:00-23:00按小时分组数据 + */ + @GetMapping("/security/keyAreaStatistic") + @ResponseBody + public Object keyAreaStatistic() { + //查询各危险级别权重、各类别权重,放入map,避免循环中多次查数据库 + HashMap hazardScoreMap = new HashMap<>(); + List caseHazardLevelList = hazardLevelMapper.getCaseHazardLevelList(null); + caseHazardLevelList.forEach(hazardLevel -> { + hazardScoreMap.put(hazardLevel.getCode(), hazardLevel.getWeight()); + }); + HashMap categoryScoreMap = new HashMap<>(); + List categoryLevelList = categoryLevelMapper.getCaseCategoryLevelList(null); + categoryLevelList.forEach(categoryLevel -> { + categoryScoreMap.put(categoryLevel.getCode(), categoryLevel.getWeight()); + }); + HashMap hashMap = new HashMap<>(); + //今天数据按小时分组统计 + List caseInfos = caseInfoMapper.selectListByToday2(); + caseInfos.forEach(caseInfo -> { + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); + Double score = Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + String[] array = caseInfo.getHappenTime().split(":"); + String dayTime = array[0]; + BigDecimal preScore; + if(hashMap.containsKey(dayTime)){ + Double aDouble = hashMap.get(dayTime); + preScore = new BigDecimal(aDouble.toString()); + + }else{ + preScore = new BigDecimal("100.0"); + } + BigDecimal nowScore = new BigDecimal(score.toString()); + hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); + }); + return ResponseData.success(hashMap); + } + + /** + * 安防机动支援力量调配响应评估,根据事件已解决状态及已解决时间-发送时间,按时间(小时)分组统计 + */ + @GetMapping("/security/responseAssess") + @ResponseBody + public Object responseAssess() { + //查询各危险级别权重、各类别权重,放入map,避免循环中多次查数据库 + HashMap hazardScoreMap = new HashMap<>(); + List caseHazardLevelList = hazardLevelMapper.getCaseHazardLevelList(null); + caseHazardLevelList.forEach(hazardLevel -> { + hazardScoreMap.put(hazardLevel.getCode(), hazardLevel.getWeight()); + }); + HashMap hashMap = new HashMap<>(); + //今天数据按小时分组统计 + List caseInfos = caseInfoMapper.selectListByToday3(); + caseInfos.forEach(caseInfo -> { + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + //扣分=事件级别权重*未解决小时数 + Date updateTime = DateUtil.parse(caseInfo.getUpdateTime()); + Date happenTime = DateUtil.parse(caseInfo.getHappenTime()); + long between = DateUtil.between(updateTime, happenTime, DateUnit.HOUR); + Double score = Double.valueOf(hazardWeight)*between; + String[] array = caseInfo.getHappenTime().split(":"); + String dayTime = array[0]; + BigDecimal preScore; + if(hashMap.containsKey(dayTime)){ + Double aDouble = hashMap.get(dayTime); + preScore = new BigDecimal(aDouble.toString()); + }else{ + preScore = new BigDecimal("100.0"); + } + BigDecimal nowScore = new BigDecimal(score.toString()); + hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); + }); + return ResponseData.success(hashMap); + } /** * 重点区域威胁事件类型统计,优先级2,统计近7天和近30天 @@ -224,7 +413,34 @@ } /** - * 设备状态计算系数和评判,优先级3,需确认设备恢复时间是否可以获取 + * 近30天/近一周安保人员到岗排行 */ + + /** + * 安保等级评估,发生离岗事件减1分 + */ + @GetMapping("/security/levelAssess") + @ResponseBody + public Object securityLevelAssess() { + //今天数据按小时分组统计 + List resultList = caseInfoMapper.selectListByType(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); + resultList.forEach(result -> { + BigDecimal deScore = new BigDecimal(result.getQuantity()); + BigDecimal preScore = new BigDecimal("100.0"); + result.setScore(preScore.subtract(deScore).doubleValue()); + }); + return ResponseData.success(resultList); + } + + /** + * 设备状态计算系数和评判,即设备维修管理查询(不分页) + */ + @PostMapping("/device/repairList") + @ResponseBody + public Object repairList(@RequestBody DeviceRepairRequest deviceRepairRequest) { + List deviceRepairLogDTOS = deviceInfoService.deviceRepairListPage(deviceRepairRequest); + return ResponseData.success(deviceRepairLogDTOS); + } + } 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 fbf8ab6..c71a15a 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 @@ -1,13 +1,12 @@ package com.casic.missiles.modular.controller.hik; +import cn.hutool.core.date.DateTime; +import cn.hutool.core.date.DateUtil; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.casic.missiles.model.response.ResponseData; import com.casic.missiles.modular.dao.HikFaceGroupInfoMapper; -import com.casic.missiles.modular.dto.hik.EventSubscribeRequest; -import com.casic.missiles.modular.dto.hik.FaceGroupAdditionRequest; -import com.casic.missiles.modular.dto.hik.HikRecvEvent; -import com.casic.missiles.modular.dto.hik.OrgBatchAdd; +import com.casic.missiles.modular.dto.hik.*; import com.casic.missiles.modular.enums.HikUri; import com.casic.missiles.modular.enums.SecurityEventType; import com.casic.missiles.modular.model.CaseInfo; @@ -18,16 +17,20 @@ import com.casic.missiles.modular.util.CaseInfoFactoryUtil; import com.casic.missiles.modular.util.HikUtil; import com.casic.missiles.modular.util.ThreadPoolUtil; +import com.casic.missiles.modular.util.WebSocket; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; -import org.springframework.web.bind.annotation.*; +import org.springframework.util.CollectionUtils; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.RestController; -import java.net.InetAddress; -import java.net.UnknownHostException; import java.util.ArrayList; +import java.util.Iterator; import java.util.List; import java.util.Objects; @@ -38,7 +41,6 @@ */ @Slf4j @RestController -@RequestMapping("/hik") public class HikController { @Autowired @@ -53,28 +55,37 @@ @Autowired private HikService hikService; + @Autowired + private HikFaceGroupInfoMapper hikFaceGroupInfoMapper; + + @Autowired + private WebSocket webSocket; + @Value("${server.port}") private int serverPort; - @Autowired - private HikFaceGroupInfoMapper hikFaceGroupInfoMapper; /** * 海康事件订阅 */ - @PostMapping("/event/subscribe") + @PostMapping("/hik/event/subscribe") @ResponseBody - public Object eventSubscribe() throws UnknownHostException { + public Object eventSubscribe() { EventSubscribeRequest eventSubscribeRequest = new EventSubscribeRequest(); ArrayList list = new ArrayList<>(); list.add(SecurityEventType.DEVICE_OFFLINE); + list.add(SecurityEventType.DEVICE_ONLINE); list.add(SecurityEventType.KEY_PERSONNEL_IDENTIFY_EVENT); list.add(SecurityEventType.MONITORING_POINT_OFFLINE); + list.add(SecurityEventType.MONITORING_POINT_ONLINE); list.add(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); list.add(SecurityEventType.PERSONNEL_GATHER_EVENT); - InetAddress localHost = InetAddress.getLocalHost(); + list.add(SecurityEventType.VISITOR_REGISTER); + list.add(SecurityEventType.VISITOR_CHECKOUT); + list.add(SecurityEventType.HIGH_ALTITUDE_PARABOLIC); +// InetAddress localHost = InetAddress.getLocalHost(); eventSubscribeRequest.setEventTypes(list); - eventSubscribeRequest.setEventDest("https://" + localHost + ":" + serverPort + "/eventRcv"); + eventSubscribeRequest.setEventDest("http://" + "192.168.10.6" + ":" + serverPort + "/eventRcv"); //订阅类型,0-订阅原始事件,1-联动事件,2-原始事件和联动事件,不填使用默认值0 eventSubscribeRequest.setSubType(0); /** @@ -92,19 +103,25 @@ } /** + * 查询事件订阅信息 + */ + @PostMapping("/hik/event/query") + @ResponseBody + public Object eventQuery() { + String result = HikUtil.hikApi(HikUri.EVENT_INFO, ""); + return result; + } + + /** * 海康事件接收 */ @PostMapping("/eventRcv") @ResponseBody public Object eventRcv(@RequestBody HikRecvEvent hikRecvEvent) { //1、接收所需事件类型 - Long eventType = hikRecvEvent.getEventType(); + Number eventType = hikRecvEvent.getEventType(); log.info("接收到安防事件类型为:{}", eventType); CaseInfo caseInfo = caseInfoFactoryUtil.getCaseInfo(eventType); - //接收到不关心事件直接返回 - if(Objects.isNull(caseInfo)){ - return ResponseData.success(); - } //2、不同事件不同处理,caseInfoFactoryUtil已设置好事件基础定义信息 // 再为事件添加状态、设备编码、设备名称、位置、区域、时间 // 异步处理事件 @@ -114,19 +131,23 @@ caseHandle(hikRecvEvent, eventType, caseInfo); } })); +// caseHandle(hikRecvEvent, eventType, caseInfo); - return null; + return ResponseData.success(); } - private void caseHandle(HikRecvEvent hikRecvEvent, Long eventType, CaseInfo caseInfo) { + private void caseHandle(HikRecvEvent hikRecvEvent, Number eventType, CaseInfo caseInfo) { JSONArray eventArray = hikRecvEvent.getEventArray(); List caseInfos = new ArrayList<>(); - while (eventArray.stream().iterator().hasNext()) { + Iterator iterator = eventArray.iterator(); + while (iterator.hasNext()) { CaseInfo caseInfo1 = new CaseInfo(); - BeanUtils.copyProperties(caseInfo, caseInfo1); - JSONObject event = (JSONObject) eventArray.stream().iterator().next(); + if(!Objects.isNull(caseInfo)){ + BeanUtils.copyProperties(caseInfo, caseInfo1); + } + JSONObject event = (JSONObject) iterator.next(); //5种事件进行不同处理 - if(SecurityEventType.KEY_PERSONNEL_IDENTIFY_EVENT == eventType){ + if (SecurityEventType.KEY_PERSONNEL_IDENTIFY_EVENT.equals(eventType)) { //判断所属人脸分组 JSONObject data = (JSONObject) event.get("data"); JSONObject faceRecognitionResult = (JSONObject) data.get("faceRecognitionResult"); @@ -142,52 +163,101 @@ if (faceGroupCode.equals(blackListGroup.getFaceGroupCode())) { //黑名单分组处理 caseInfo1 = hikService.blackListHandle(event, caseInfo1); - }else if(faceGroupCode.equals(propertyPersonnelGroup.getFaceGroupCode())){ + } else if (faceGroupCode.equals(propertyPersonnelGroup.getFaceGroupCode())) { //考勤分组处理-物业人员,添加到考勤表 hikService.propertyAttendanceHandle(event); - }else if(faceGroupCode.equals(securityPersonnelGroup.getFaceGroupCode())){ + } else if (faceGroupCode.equals(securityPersonnelGroup.getFaceGroupCode())) { //考勤分组处理-安保人员,添加到考勤表 hikService.securityPersonnelHandle(event); - }else { + } else { return; } - }else if(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT == eventType){ + } else if (SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT.equals(eventType)) { //离岗事件处理 caseInfo1 = hikService.demobilizedHandle(event, caseInfo1); - }else if(SecurityEventType.PERSONNEL_GATHER_EVENT == eventType){ + } else if (SecurityEventType.PERSONNEL_GATHER_EVENT.equals(eventType)) { //人员聚集事件处理 caseInfo1 = hikService.personGatherHandle(event, caseInfo1); - }else if(SecurityEventType.MONITORING_POINT_OFFLINE == eventType){ + } else if (SecurityEventType.MONITORING_POINT_OFFLINE.equals(eventType)) { //监控点离线事件处理 caseInfo1 = hikService.monitorPointOfflineHandle(event, caseInfo1); - }else if(SecurityEventType.DEVICE_OFFLINE == eventType){ + } else if (SecurityEventType.MONITORING_POINT_ONLINE.equals(eventType)) { + //监控点上线事件处理 + hikService.monitorPointOnlineHandle(event); + } else if (SecurityEventType.DEVICE_OFFLINE.equals(eventType)) { //装置离线事件处理 caseInfo1 = hikService.deviceOfflineHandle(event, caseInfo1); - }else if(SecurityEventType.VISITOR_REGISTER == eventType){ + } else if (SecurityEventType.DEVICE_ONLINE.equals(eventType)) { + //装置上线处理 + hikService.deviceOnlineHandle(event); + } else if (SecurityEventType.VISITOR_REGISTER.equals(eventType)) { //记录访客登记记录,添加到访客记录表 hikService.visitorRegisterHandler(event); - }else if(SecurityEventType.VISITOR_CHECKOUT == eventType){ + } else if (SecurityEventType.VISITOR_CHECKOUT.equals(eventType)) { //记录访客签离记录 hikService.visitorCheckOutHandler(event); } - if(!Objects.isNull(caseInfo1) && !StringUtils.isEmpty(caseInfo1.getHappenTime())){ + if (!Objects.isNull(caseInfo1) && !StringUtils.isEmpty(caseInfo1.getHappenTime())) { caseInfos.add(caseInfo1); } } //3、安防事件入库 - if(!caseInfoService.insertCaseInfoBatch(caseInfos)){ - log.error("安防事件批量入库异常"); + if (!CollectionUtils.isEmpty(caseInfos) && !caseInfoService.insertCaseInfoBatch(caseInfos)) { + log.error("安防事件批量入库异常!"); } // TODO: 2022/8/15 webSocket推送 + if (CollectionUtils.isEmpty(caseInfos)) { + log.info("webSocket事件推送"); + webSocket.sendAllMessage(JSONObject.toJSONString(caseInfos)); + } return; } /** + * 以图搜图,前端用于轨迹追踪 + */ + @PostMapping("/hik/search/picture") + @ResponseBody + public Object searchPictures(@RequestBody SearchPicturesRequest searchPicturesRequest) { + DateTime startDateTime = DateUtil.parse(searchPicturesRequest.getStartTime()); + DateTime endDateTime = DateUtil.parse(searchPicturesRequest.getEndTime()); + String startTime = DateUtil.format(startDateTime, "yyyy-MM-dd'T'HH:mm:ss.SSSXXX"); + String endTime = DateUtil.format(endDateTime, "yyyy-MM-dd'T'HH:mm:ss.SSSXXX"); + searchPicturesRequest.setStartTime(startTime); + searchPicturesRequest.setEndTime(endTime); + String body = JSONObject.toJSONString(searchPicturesRequest); + String resultStr = HikUtil.hikApi(HikUri.SEARCH_PICTURES, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (!"0".equals(resultJson.get("code"))) { + log.error("请求海康,以图搜图失败,海康response:{}", resultStr); + return ResponseData.error("以图搜图失败"); + } + return ResponseData.success(resultJson); + } + + + /** + * 海康事件取消订阅 + */ + @PostMapping("/hik/event/cancel") + @ResponseBody + public Object eventCancelSubscribe(@RequestBody CancelSubscribeRequest cancelSubscribeRequest) { + String body = JSONObject.toJSONString(cancelSubscribeRequest); + String resultStr = HikUtil.hikApi(HikUri.EVENT_CANCEL, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (!"0".equals(resultJson.get("code"))) { + log.error("请求海康,取消订阅失败,海康response:{}", resultStr); + return ResponseData.error("取消订阅失败"); + } + return ResponseData.success(resultJson); + } + + /** * 单个添加海康人脸分组 * api->hik单个添加人脸分组api->response->mysql */ - @PostMapping("/faceGroup/single/add") + @PostMapping("/hik/faceGroup/single/add") @ResponseBody public Object faceGroupAddition(@RequestBody FaceGroupAdditionRequest faceGroupAdditionRequest) { String body = JSONObject.toJSONString(faceGroupAdditionRequest); @@ -212,7 +282,7 @@ * 批量添加海康组织 * api->hik批量添加组织api->response */ - @PostMapping("/org/batch/add") + @PostMapping("/hik/org/batch/add") @ResponseBody public Object orgBatchAdd(@RequestBody List orgBatchAddRequest) { String body = JSONObject.toJSONString(orgBatchAddRequest); @@ -232,4 +302,62 @@ return ResponseData.error("批量添加组织失败"); } + /** + * 获取人员列表 + */ + @PostMapping("/hik/person/personList") + @ResponseBody + public Object personList() { + PersonListRequest request = new PersonListRequest(); + request.setPageNo(1); + request.setPageSize(100); + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi("/api/resource/v2/person/personList", body); + return resultStr; + } + + /** + * 获取组织列表 + */ + @PostMapping("/hik/org/orgList") + @ResponseBody + public Object orgList() { + PersonListRequest request = new PersonListRequest(); + request.setPageNo(1); + request.setPageSize(100); + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi("/api/resource/v1/org/orgList", body); + return resultStr; + } + + /** + * 查询访客权限下载记录 + */ + @PostMapping("/hik/auth/result") + @ResponseBody + public Object authResult() { + PersonListRequest request = new PersonListRequest(); + request.setPageNo(1); + request.setPageSize(100); + request.setOrderId("ba101db6246711edaea66f7939a13638"); + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi("/api/visitor/v1/auth/result", body); + return resultStr; + } + + /** + * 人脸图片获取 + */ + @PostMapping("/hik/face/picture") + @ResponseBody + public Object facePicture() { + FaceRequest request = new FaceRequest(); +// List list = new ArrayList<>(); +// list.add(""); + request.setCertificateNum("wanggong"); + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi("/api/frs/v1/face", body); + return resultStr; + } + } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/AssetInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/AssetInfoMapper.java index 4f64e83..c0684ee 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/AssetInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/AssetInfoMapper.java @@ -17,6 +17,6 @@ @Mapper public interface AssetInfoMapper extends BaseMapper { - List getAssetInfoListPage(@Param("page") Page page, AssetInfoRequest assetInfoRequest); + List getAssetInfoListPage(@Param("page") Page page, @Param("assetInfoRequest") AssetInfoRequest assetInfoRequest); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/AttendanceInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/AttendanceInfoMapper.java index f9e793e..ec87e46 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/AttendanceInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/AttendanceInfoMapper.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.statistics.AttendanceNumberDTO; import com.casic.missiles.modular.dto.statistics.AttendanceRatioDTO; import com.casic.missiles.modular.model.AttendanceInfo; import org.apache.ibatis.annotations.Mapper; @@ -17,7 +18,7 @@ */ @Mapper public interface AttendanceInfoMapper extends BaseMapper { - List getAttendanceInfoListPage(@Param("page") Page page, StaffInfoRequest attendanceInfoRequest); + List getAttendanceInfoListPage(@Param("page") Page page, @Param("attendanceInfoRequest") StaffInfoRequest attendanceInfoRequest); AttendanceInfo selectByCodeAndDate(@Param("staffCode") String staffCode); @@ -26,4 +27,8 @@ List getCountByTypeAndDateForMonth(@Param("staffType")String staffType); List getCountByTypeAndDateForYear(@Param("staffType")String staffType); + + List getCountForWeek(); + + List getCountForDay(); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java index ce94b8f..6137a7d 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java @@ -17,5 +17,5 @@ @Mapper public interface BlackInfoMapper extends BaseMapper { - List getBlackInfoListPage(@Param("page") Page page, BlackInfoRequest blackInfoRequest); + List getBlackInfoListPage(@Param("page") Page page, @Param("blackInfoRequest") BlackInfoRequest blackInfoRequest); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/BlackListController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/BlackListController.java index a27f9f8..0c06661 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/BlackListController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/BlackListController.java @@ -1,13 +1,18 @@ package com.casic.missiles.modular.controller; +import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.base.controller.ExportController; import com.casic.missiles.core.page.PageFactory; import com.casic.missiles.model.response.ResponseData; import com.casic.missiles.modular.dto.BlackInfoRequest; +import com.casic.missiles.modular.dto.BlackPictureRequest; +import com.casic.missiles.modular.dto.hik.PersonInfoRequest; +import com.casic.missiles.modular.enums.HikUri; import com.casic.missiles.modular.enums.OperateTypeEnum; import com.casic.missiles.modular.model.BlackInfo; import com.casic.missiles.modular.service.BlackInfoService; +import com.casic.missiles.modular.util.HikUtil; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; @@ -56,4 +61,22 @@ return null; } + /** + * 黑名单人员照片 + */ + @PostMapping("/personPicture") + @ResponseBody + public Object personPicture(@RequestBody BlackPictureRequest blackPictureRequest){ + //获取照片 + String picUri = blackPictureRequest.getPicUri(); + String serverIndexCode = blackPictureRequest.getServerIndexCode(); + PersonInfoRequest picRequest = new PersonInfoRequest(); + picRequest.setPicUri(picUri); + picRequest.setServerIndexCode(serverIndexCode); + String reBody = JSONObject.toJSONString(picRequest); + //重定向地址获取 + String url = HikUtil.hikApiFor302(HikUri.PERSON_PICTURE, reBody); + return ResponseData.success(url); + } + } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/DeviceController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/DeviceController.java index e1c4eba..666bbee 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/DeviceController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/DeviceController.java @@ -107,7 +107,7 @@ } /** - * 设备维修管理查询(分页),需计算MTTR=总维修时间/故障次数 + * 设备状态计算与评判/设备维修管理查询(分页),需计算MTTR=总维修时间/故障次数 */ @PostMapping("/repair/listPage") @ResponseBody @@ -211,7 +211,7 @@ //需根据设备编号获取到对应的门禁点唯一标识 doorControlRequest.setDoorIndexCodes(indexCodes); doorControlRequest.setControlType(Integer.valueOf(gateGroupDTO.getStatus())); - String body = JSONObject.toJSONString(deviceCodes); + String body = JSONObject.toJSONString(doorControlRequest); String resultStr = HikUtil.hikApi(HikUri.DOOR_CONTROL, body); JSONObject resultJson = (JSONObject)JSONObject.parse(resultStr); if (!"0".equals(resultJson.get("code"))) { diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/StaffController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/StaffController.java index b58ccab..704093c 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/StaffController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/StaffController.java @@ -2,15 +2,21 @@ import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.util.StrUtil; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.base.controller.ExportController; import com.casic.missiles.core.page.PageFactory; import com.casic.missiles.model.response.ErrorResponseData; import com.casic.missiles.model.response.ResponseData; import com.casic.missiles.modular.dto.StaffInfoRequest; +import com.casic.missiles.modular.dto.hik.PersonInfoRequest; +import com.casic.missiles.modular.dto.hik.StaffCardRequest; +import com.casic.missiles.modular.enums.HikUri; import com.casic.missiles.modular.enums.OperateTypeEnum; import com.casic.missiles.modular.model.StaffInfo; import com.casic.missiles.modular.service.StaffInfoService; +import com.casic.missiles.modular.util.HikUtil; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; @@ -110,4 +116,60 @@ } return ResponseData.success(); } + + /** + * 批量开卡,添加人员之后调用,若在一个接口中添加人员成功开卡失败则第二次添加时会有问题 + */ + @PostMapping("/cardBinding") + @ResponseBody + public Object cardBinding(@RequestBody StaffCardRequest staffCardRequest) { + String body = JSONObject.toJSONString(staffCardRequest); + String resultStr = HikUtil.hikApi(HikUri.CARD_BINDING, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (!"0".equals(resultJson.get("code"))) { + log.error("请求海康,批量开卡失败,海康response:{}", resultStr); + return ResponseData.error("批量开卡失败"); + } + //保存卡号 + if(staffInfoService.saveCardInfo(staffCardRequest) > 0){ + return ResponseData.success(); + } + return ResponseData.error("批量开卡失败"); + } + + /** + * 获取员工照片,海康存储 + */ + @PostMapping("/personPicture/{staffCode}") + @ResponseBody + public Object personPicture(@PathVariable("staffCode") String staffCode){ + //获取员工详细信息,含图片服务器、uri + PersonInfoRequest request = new PersonInfoRequest(); + List list = new ArrayList<>(); + list.add(staffCode); + request.setParamName("personId"); + request.setParamValue(list); + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi(HikUri.PERSON_INFO, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (!"0".equals(resultJson.get("code"))) { + log.error("请求海康,根据人员唯一字段获取人员详细信息失败,海康response:{}", resultStr); + return ResponseData.error("获取员工照片失败"); + } + //获取照片 + JSONObject data = (JSONObject) resultJson.get("data"); + JSONArray dataArray = (JSONArray) data.get("list"); + JSONObject jsonObject = (JSONObject) dataArray.get(0); + JSONArray personPhoto = (JSONArray) jsonObject.get("personPhoto"); + JSONObject photo = (JSONObject) personPhoto.get(0); + String picUri = photo.getString("picUri"); + String serverIndexCode = photo.getString("serverIndexCode"); + PersonInfoRequest picRequest = new PersonInfoRequest(); + picRequest.setPicUri(picUri); + picRequest.setServerIndexCode(serverIndexCode); + String reBody = JSONObject.toJSONString(picRequest); + //重定向地址获取 + String url = HikUtil.hikApiFor302(HikUri.PERSON_PICTURE, reBody); + return ResponseData.success(url); + } } 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 4a07dd9..7b1dcf6 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 @@ -16,6 +16,7 @@ import com.casic.missiles.modular.redis.key.CacheKeys; import com.casic.missiles.modular.service.CockpitService; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.util.CollectionUtils; import org.springframework.web.bind.annotation.*; @@ -24,10 +25,7 @@ import java.text.NumberFormat; import java.time.LocalDateTime; import java.time.temporal.ChronoUnit; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.util.*; import java.util.stream.Collectors; /** @@ -73,6 +71,9 @@ private StatisticNumberMapper numberMapper; @Autowired + private HazardLevelMapper hazardLevelMapper; + + @Autowired private AccessGroupConfig accessGroupConfig; /** @@ -104,8 +105,24 @@ public Object buildingNumberPerHour(){ //当天按小时分组的人数 List list = numberMapper.selectListByTime(); - Map> collect = list.stream().collect(Collectors.groupingBy(BuildingNumberDTO::getStatisticPosition)); - return ResponseData.success(collect); + Map> collect = list.stream().collect(Collectors.groupingBy(BuildingNumberDTO::getStatisticTime)); + //定时任务中已将每小时三栋楼人数存到数据库 + //将一期主楼和录制楼人数合并,二期单算 + List> resultList = new ArrayList<>(); + collect.keySet().forEach(key -> { + List buildingNumberDTOS = collect.get(key); + BuildingNumberDTO mainBuildingOne = buildingNumberDTOS.get(0); + BuildingNumberDTO mainBuildingTwo = buildingNumberDTOS.get(1); + BuildingNumberDTO recordingBuilding = buildingNumberDTOS.get(2); + HashMap resultMap = new HashMap<>(); + Integer oneQuantity = Integer.valueOf(mainBuildingOne.getStatisticQuantity()); + Integer recordingQuantity = Integer.valueOf(recordingBuilding.getStatisticQuantity()); + resultMap.put("staticTime", mainBuildingOne.getStatisticTime()); + resultMap.put(mainBuildingOne.getStatisticPositionName()+"、"+recordingBuilding.getStatisticPositionName(), String.valueOf(oneQuantity+recordingQuantity)); + resultMap.put(mainBuildingTwo.getStatisticPositionName(), mainBuildingTwo.getStatisticQuantity()); + resultList.add(resultMap); + }); + return ResponseData.success(resultList); } /** @@ -151,12 +168,11 @@ public Object securityNumber() { QueryWrapper wrapper = new QueryWrapper<>(); wrapper.eq("staff_type", 2); + // TODO: 2022/9/2 后续使用产品确定的每天出勤的安保人员的数量 Integer total = staffInfoMapper.selectCount(wrapper); - //当日离岗事件个数 - QueryWrapper wrapper1 = new QueryWrapper<>(); - wrapper1.eq("hik_event_type", SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); - wrapper1.apply("date_format(now(),'%Y-%m-%d') = date_format(happen_time,'%Y-%m-%d')"); - Integer leave = caseInfoMapper.selectCount(wrapper1); + //当日离岗事件按设备去重后的个数 + // TODO: 2022/9/2 目前相当于24小时内的计算,之后看需要可改成自定义小时数计算离岗率,即离岗+6小时内仅一次离岗则恢复为100%,多次则累加离岗次数计算离岗率 + Integer leave = caseInfoMapper.selectDemobilizedCount(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); NumberFormat numberFormat = NumberFormat.getInstance(); // 设置精确到小数点后2位 numberFormat.setMaximumFractionDigits(2); @@ -179,7 +195,6 @@ @ResponseBody public Object visitorApplyDetail() { List reasonGroup = applyMapper.selectByVisitReason(); - HashMap resultMap = new HashMap<>(); NumberFormat numberFormat = NumberFormat.getInstance(); // 设置精确到小数点后2位 numberFormat.setMaximumFractionDigits(2); @@ -187,12 +202,17 @@ if(0 == sum){ return ResponseData.success(); } + List resultList = new ArrayList<>(); reasonGroup.forEach(group -> { String reasonName = dictService.getDictNameByCode(SecurityEventDict.VISIT_REASON, group.getVisitReason()); String result = numberFormat.format((float) group.getQuantity() / (float) sum * 100); - resultMap.put(reasonName, result+"%"); + ApplyReasonGroupDTO applyReasonGroupDTO = new ApplyReasonGroupDTO(); + applyReasonGroupDTO.setQuantity(group.getQuantity()); + applyReasonGroupDTO.setVisitReason(reasonName); + applyReasonGroupDTO.setRatio(result+"%"); + resultList.add(applyReasonGroupDTO); }); - return ResponseData.success(resultMap); + return ResponseData.success(resultList); } /** @@ -247,6 +267,32 @@ } /** + * 机动力量实时在岗率,在岗人数除以总应在岗人数,用离岗+6小时内恢复为100%,6小时外再计算 + */ + @GetMapping("/staff/beOnDutyRatio") + @ResponseBody + public Object beOnDutyRatio() { + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("staff_type", 2); + // TODO: 2022/9/2 后续使用产品确定的每天出勤的安保人员的数量 + Integer total = staffInfoMapper.selectCount(wrapper); + if(0 == total){ + return ResponseData.success(null); + } + //当日离岗事件按设备去重后的个数 + // TODO: 2022/9/2 目前相当于24小时内的计算,之后看需要可改成自定义小时数计算离岗率,即离岗+6小时内仅一次离岗则恢复为100%,多次则累加离岗次数计算离岗率 + List onDutyRatioDTOS = caseInfoMapper.selectDemobilizedCountByHour(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); + onDutyRatioDTOS.forEach(dto -> { + NumberFormat numberFormat = NumberFormat.getInstance(); + // 设置精确到小数点后2位 + numberFormat.setMaximumFractionDigits(2); + String result = numberFormat.format(100 - Float.valueOf(dto.getQuantity()) / (float) total * 100); + dto.setRatio(result+"%"); + }); + return ResponseData.success(onDutyRatioDTOS); + } + + /** * 闸机速通门统计-设备状态分组计算数量,devType传闸机字典key * 视频频监控摄像机统计-设备状态分组计算数量,devType传摄像头字典key */ @@ -262,12 +308,17 @@ if(sum <= 0){ return ResponseData.error("无该类设备信息"); } + List resultList = new ArrayList<>(); gateStatusGroup.forEach(group -> { String devStatus = dictService.getDictNameByCode(SecurityEventDict.DEVICE_STATUS, group.getStatus()); String result = numberFormat.format((float) group.getQuantity() / (float) sum * 100); - resultMap.put(devStatus, result+"%"); + GateStatusGroupResponse gateStatusGroupResponse = new GateStatusGroupResponse(); + gateStatusGroupResponse.setStatus(devStatus); + gateStatusGroupResponse.setRatio(result+"%"); + resultList.add(gateStatusGroupResponse); }); - resultMap.put("总", sum); + resultMap.put("total", sum); + resultMap.put("list", resultList); return ResponseData.success(resultMap); } @@ -282,17 +333,38 @@ String position = securityScoreDTO.getPosition(); List caseInfos = caseInfoMapper.selectByPosition(position); //查询各危险级别权重、各类别权重,放入map,避免循环中多次查数据库 - + HashMap hazardScoreMap = new HashMap<>(); + List caseHazardLevelList = hazardLevelMapper.getCaseHazardLevelList(null); + caseHazardLevelList.forEach(hazardLevel -> { + hazardScoreMap.put(hazardLevel.getCode(), hazardLevel.getWeight()); + }); + HashMap categoryScoreMap = new HashMap<>(); + List categoryLevelList = categoryLevelMapper.getCaseCategoryLevelList(null); + categoryLevelList.forEach(categoryLevel -> { + categoryScoreMap.put(categoryLevel.getCode(), categoryLevel.getWeight()); + }); + //事件按楼层分组,计算 List securityScoreDTOs = new ArrayList<>(); caseInfos.forEach(caseInfo -> { SecurityScoreDTO securityScoreDTO1 = new SecurityScoreDTO(); + securityScoreDTO1.setPosition(caseInfo.getPosition()); securityScoreDTO1.setArea(caseInfo.getArea()); - // TODO: 2022/8/4 楼层评分计算根据产品定义调整 -// caseInfo.get -// securityScoreDTO1.setScore(); + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); + Double score = 100 - Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + securityScoreDTO1.setScore(score); + securityScoreDTOs.add(securityScoreDTO1); }); - - return null; + 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); + }); + return ResponseData.success(securityScoreDTOs); } /** @@ -303,9 +375,13 @@ public Object SecurityFrequency(@RequestBody SecurityFrequencyDTO securityFrequencyDTO) { String year = securityFrequencyDTO.getYear(); String month = securityFrequencyDTO.getMonth(); - Integer quantity = caseInfoMapper.selectCountByMonth(year, month); - securityFrequencyDTO.setQuantity(quantity); - return ResponseData.success(securityFrequencyDTO); + if(!StringUtils.isEmpty(year) && StringUtils.isEmpty(month)){ + Integer quantity = caseInfoMapper.selectCountByMonth(year, month); + securityFrequencyDTO.setQuantity(quantity); + return ResponseData.success(securityFrequencyDTO); + } + List list = caseInfoMapper.selectPreMonthCount(); + return ResponseData.success(list); } } 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 ae4d770..f4f075c 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 @@ -1,20 +1,25 @@ package com.casic.missiles.modular.controller.cockpit; +import cn.hutool.core.date.DateUnit; import cn.hutool.core.date.DateUtil; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.casic.missiles.model.response.ResponseData; -import com.casic.missiles.modular.dao.AttendanceInfoMapper; -import com.casic.missiles.modular.dao.CaseInfoMapper; -import com.casic.missiles.modular.dao.HazardLevelMapper; -import com.casic.missiles.modular.dao.StaffInfoMapper; +import com.casic.missiles.modular.dao.*; +import com.casic.missiles.modular.dto.DeviceRepairLogDTO; +import com.casic.missiles.modular.dto.DeviceRepairRequest; import com.casic.missiles.modular.dto.statistics.*; +import com.casic.missiles.modular.enums.SecurityEventType; +import com.casic.missiles.modular.model.CaseCategoryLevel; import com.casic.missiles.modular.model.CaseHazardLevel; +import com.casic.missiles.modular.model.CaseInfo; import com.casic.missiles.modular.model.StaffInfo; +import com.casic.missiles.modular.service.DeviceInfoService; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.util.CollectionUtils; import org.springframework.web.bind.annotation.*; +import java.math.BigDecimal; import java.text.NumberFormat; import java.util.*; import java.util.stream.Collectors; @@ -40,6 +45,12 @@ @Autowired private HazardLevelMapper hazardLevelMapper; + @Autowired + private CategoryLevelMapper categoryLevelMapper; + + @Autowired + private DeviceInfoService deviceInfoService; + /** * 安防事件时域频次统计,每月的每天安防事件个数(原方案) * 月维度:展示每个月的每天的数据 @@ -89,15 +100,17 @@ List monthList = caseInfoMapper.selectPreMonthCountByYear(year); Map> collect = monthList.stream().collect(Collectors.groupingBy(PreMonthOrWeekCaseDTO::getHazardLevelCode)); HashMap strAvgMap = new HashMap<>(); + List resultList = new ArrayList<>(); for (String key : collect.keySet()) { List preMonthOrWeekCaseDTOS = collect.get(key); int sum = preMonthOrWeekCaseDTOS.stream().mapToInt(PreMonthOrWeekCaseDTO::getQuantity).sum(); //若年份是本年,则使用个安防级别数量/当前月份数 //若不是本年,除数为12 MonthAndWeekDTO monthAndWeekDTO = new MonthAndWeekDTO(); + String hazardName = hazardLevelMapper.selectHazardNameByCode(key); + monthAndWeekDTO.setLevelName(hazardName); if(year.equals(String.valueOf(DateUtil.thisYear()))){ monthAndWeekDTO.setMonthQuantity(sum / DateUtil.thisMonth()); -// monthAndWeekDTO.setLevelName(); strAvgMap.put(key, monthAndWeekDTO); }else{ monthAndWeekDTO.setMonthQuantity(sum / 12); @@ -113,27 +126,37 @@ if(year.equals(String.valueOf(DateUtil.thisYear()))){ if(!Objects.isNull(strAvgMap.get(key))){ MonthAndWeekDTO monthAndWeekDTO = strAvgMap.get(key); + String hazardName = hazardLevelMapper.selectHazardNameByCode(key); + monthAndWeekDTO.setLevelName(hazardName); monthAndWeekDTO.setWeekQuantity(sum / DateUtil.thisWeekOfYear()); strAvgMap.put(key, monthAndWeekDTO); }else{ MonthAndWeekDTO monthAndWeekDTO = new MonthAndWeekDTO(); + String hazardName = hazardLevelMapper.selectHazardNameByCode(key); + monthAndWeekDTO.setLevelName(hazardName); monthAndWeekDTO.setWeekQuantity(sum / DateUtil.thisWeekOfYear()); strAvgMap.put(key, monthAndWeekDTO); } }else{ if(!Objects.isNull(strAvgMap.get(key))){ MonthAndWeekDTO monthAndWeekDTO = strAvgMap.get(key); + String hazardName = hazardLevelMapper.selectHazardNameByCode(key); + monthAndWeekDTO.setLevelName(hazardName); monthAndWeekDTO.setWeekQuantity(sum / 52); strAvgMap.put(key, monthAndWeekDTO); }else{ MonthAndWeekDTO monthAndWeekDTO = new MonthAndWeekDTO(); + String hazardName = hazardLevelMapper.selectHazardNameByCode(key); + monthAndWeekDTO.setLevelName(hazardName); monthAndWeekDTO.setWeekQuantity(sum / 52); strAvgMap.put(key, monthAndWeekDTO); } } } - avgMonthAndWeekGroupDTO.setMap(strAvgMap); - return ResponseData.success(avgMonthAndWeekGroupDTO); + strAvgMap.keySet().forEach(key -> { + resultList.add(strAvgMap.get(key)); + }); + return ResponseData.success(resultList); } /** @@ -181,12 +204,178 @@ } /** - * 员工考勤人数变化,功能待定 + * 员工考勤人数变化,统计当天(横坐标为时)及近7天(横坐标为天)的考勤人数变化,只要发生一次考勤识别,次数的基数就正常增加(没有上班下班区分) */ + @PostMapping("/staff/attendanceNumber/{dimension}") + @ResponseBody + public Object attendanceNumber(@PathVariable("dimension") String dimension) { + List attendanceNumberDTOs = null; + List> resultList = new ArrayList<>(); + if("week".equals(dimension)){ + //近7天数据按天分组统计 + attendanceNumberDTOs = attendanceInfoMapper.getCountForWeek(); + }else if("day".equals(dimension)) { + //今天数据按小时分组统计 + attendanceNumberDTOs = attendanceInfoMapper.getCountForDay(); + } + if(CollectionUtils.isEmpty(attendanceNumberDTOs)){ + return ResponseData.error("该查询条件下,无员工出勤数据!"); + } + Map> collect = attendanceNumberDTOs.stream().collect(Collectors.groupingBy(AttendanceNumberDTO::getDate)); + collect.keySet().forEach(key -> { + List attendanceNumberDTOS = collect.get(key); + AttendanceNumberDTO attendanceNumberDTO = attendanceNumberDTOS.get(0); + AttendanceNumberDTO attendanceNumberDTO2 = attendanceNumberDTOS.get(1); + Map resultMap = new HashMap<>(); + resultMap.put(attendanceNumberDTO.getStaffType(), attendanceNumberDTO.getQuantity()); + resultMap.put(attendanceNumberDTO2.getStaffType(), attendanceNumberDTO2.getQuantity()); + resultMap.put("staticTime", attendanceNumberDTO.getDate()); + resultList.add(resultMap); + }); + return ResponseData.success(resultList); + } /** - * 近30天/近一周安保人员到岗排行 + * 早晚高峰区域安防评估 */ + @PostMapping("/security/assessment/{dimension}") + @ResponseBody + public Object securityAssessment(@PathVariable("dimension") String dimension) { + //查询各危险级别权重、各类别权重,放入map,避免循环中多次查数据库 + HashMap hazardScoreMap = new HashMap<>(); + List caseHazardLevelList = hazardLevelMapper.getCaseHazardLevelList(null); + caseHazardLevelList.forEach(hazardLevel -> { + hazardScoreMap.put(hazardLevel.getCode(), hazardLevel.getWeight()); + }); + HashMap categoryScoreMap = new HashMap<>(); + List categoryLevelList = categoryLevelMapper.getCaseCategoryLevelList(null); + categoryLevelList.forEach(categoryLevel -> { + categoryScoreMap.put(categoryLevel.getCode(), categoryLevel.getWeight()); + }); + HashMap hashMap = new HashMap<>(); + if("week".equals(dimension)){ + //近7天早晚高峰数据 + List caseInfos = caseInfoMapper.selectListBySevenDay(); + //按时间(天)进行分组 + caseInfos.forEach(caseInfo -> { + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); + Double score = Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + String[] array = caseInfo.getHappenTime().split(" "); + String dayTime = array[0]; + BigDecimal preScore; + if(hashMap.containsKey(dayTime)){ + Double aDouble = hashMap.get(dayTime); + preScore = new BigDecimal(aDouble.toString()); + + }else{ + preScore = new BigDecimal("100.0"); + } + BigDecimal nowScore = new BigDecimal(score.toString()); + hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); + }); + return ResponseData.success(hashMap); + }else if("day".equals(dimension)) { + //今天数据按小时分组统计 + List caseInfos = caseInfoMapper.selectListByToday(); + caseInfos.forEach(caseInfo -> { + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); + Double score = Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + String[] array = caseInfo.getHappenTime().split(":"); + String dayTime = array[0]; + BigDecimal preScore; + if(hashMap.containsKey(dayTime)){ + Double aDouble = hashMap.get(dayTime); + preScore = new BigDecimal(aDouble.toString()); + + }else{ + preScore = new BigDecimal("100.0"); + } + BigDecimal nowScore = new BigDecimal(score.toString()); + hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); + }); + return ResponseData.success(hashMap); + } + return null; + } + + /** + * 重点区域安防事态评估,统计重点区域6:00-23:00按小时分组数据 + */ + @GetMapping("/security/keyAreaStatistic") + @ResponseBody + public Object keyAreaStatistic() { + //查询各危险级别权重、各类别权重,放入map,避免循环中多次查数据库 + HashMap hazardScoreMap = new HashMap<>(); + List caseHazardLevelList = hazardLevelMapper.getCaseHazardLevelList(null); + caseHazardLevelList.forEach(hazardLevel -> { + hazardScoreMap.put(hazardLevel.getCode(), hazardLevel.getWeight()); + }); + HashMap categoryScoreMap = new HashMap<>(); + List categoryLevelList = categoryLevelMapper.getCaseCategoryLevelList(null); + categoryLevelList.forEach(categoryLevel -> { + categoryScoreMap.put(categoryLevel.getCode(), categoryLevel.getWeight()); + }); + HashMap hashMap = new HashMap<>(); + //今天数据按小时分组统计 + List caseInfos = caseInfoMapper.selectListByToday2(); + caseInfos.forEach(caseInfo -> { + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); + Double score = Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + String[] array = caseInfo.getHappenTime().split(":"); + String dayTime = array[0]; + BigDecimal preScore; + if(hashMap.containsKey(dayTime)){ + Double aDouble = hashMap.get(dayTime); + preScore = new BigDecimal(aDouble.toString()); + + }else{ + preScore = new BigDecimal("100.0"); + } + BigDecimal nowScore = new BigDecimal(score.toString()); + hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); + }); + return ResponseData.success(hashMap); + } + + /** + * 安防机动支援力量调配响应评估,根据事件已解决状态及已解决时间-发送时间,按时间(小时)分组统计 + */ + @GetMapping("/security/responseAssess") + @ResponseBody + public Object responseAssess() { + //查询各危险级别权重、各类别权重,放入map,避免循环中多次查数据库 + HashMap hazardScoreMap = new HashMap<>(); + List caseHazardLevelList = hazardLevelMapper.getCaseHazardLevelList(null); + caseHazardLevelList.forEach(hazardLevel -> { + hazardScoreMap.put(hazardLevel.getCode(), hazardLevel.getWeight()); + }); + HashMap hashMap = new HashMap<>(); + //今天数据按小时分组统计 + List caseInfos = caseInfoMapper.selectListByToday3(); + caseInfos.forEach(caseInfo -> { + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + //扣分=事件级别权重*未解决小时数 + Date updateTime = DateUtil.parse(caseInfo.getUpdateTime()); + Date happenTime = DateUtil.parse(caseInfo.getHappenTime()); + long between = DateUtil.between(updateTime, happenTime, DateUnit.HOUR); + Double score = Double.valueOf(hazardWeight)*between; + String[] array = caseInfo.getHappenTime().split(":"); + String dayTime = array[0]; + BigDecimal preScore; + if(hashMap.containsKey(dayTime)){ + Double aDouble = hashMap.get(dayTime); + preScore = new BigDecimal(aDouble.toString()); + }else{ + preScore = new BigDecimal("100.0"); + } + BigDecimal nowScore = new BigDecimal(score.toString()); + hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); + }); + return ResponseData.success(hashMap); + } /** * 重点区域威胁事件类型统计,优先级2,统计近7天和近30天 @@ -224,7 +413,34 @@ } /** - * 设备状态计算系数和评判,优先级3,需确认设备恢复时间是否可以获取 + * 近30天/近一周安保人员到岗排行 */ + + /** + * 安保等级评估,发生离岗事件减1分 + */ + @GetMapping("/security/levelAssess") + @ResponseBody + public Object securityLevelAssess() { + //今天数据按小时分组统计 + List resultList = caseInfoMapper.selectListByType(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); + resultList.forEach(result -> { + BigDecimal deScore = new BigDecimal(result.getQuantity()); + BigDecimal preScore = new BigDecimal("100.0"); + result.setScore(preScore.subtract(deScore).doubleValue()); + }); + return ResponseData.success(resultList); + } + + /** + * 设备状态计算系数和评判,即设备维修管理查询(不分页) + */ + @PostMapping("/device/repairList") + @ResponseBody + public Object repairList(@RequestBody DeviceRepairRequest deviceRepairRequest) { + List deviceRepairLogDTOS = deviceInfoService.deviceRepairListPage(deviceRepairRequest); + return ResponseData.success(deviceRepairLogDTOS); + } + } 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 fbf8ab6..c71a15a 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 @@ -1,13 +1,12 @@ package com.casic.missiles.modular.controller.hik; +import cn.hutool.core.date.DateTime; +import cn.hutool.core.date.DateUtil; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.casic.missiles.model.response.ResponseData; import com.casic.missiles.modular.dao.HikFaceGroupInfoMapper; -import com.casic.missiles.modular.dto.hik.EventSubscribeRequest; -import com.casic.missiles.modular.dto.hik.FaceGroupAdditionRequest; -import com.casic.missiles.modular.dto.hik.HikRecvEvent; -import com.casic.missiles.modular.dto.hik.OrgBatchAdd; +import com.casic.missiles.modular.dto.hik.*; import com.casic.missiles.modular.enums.HikUri; import com.casic.missiles.modular.enums.SecurityEventType; import com.casic.missiles.modular.model.CaseInfo; @@ -18,16 +17,20 @@ import com.casic.missiles.modular.util.CaseInfoFactoryUtil; import com.casic.missiles.modular.util.HikUtil; import com.casic.missiles.modular.util.ThreadPoolUtil; +import com.casic.missiles.modular.util.WebSocket; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; -import org.springframework.web.bind.annotation.*; +import org.springframework.util.CollectionUtils; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.RestController; -import java.net.InetAddress; -import java.net.UnknownHostException; import java.util.ArrayList; +import java.util.Iterator; import java.util.List; import java.util.Objects; @@ -38,7 +41,6 @@ */ @Slf4j @RestController -@RequestMapping("/hik") public class HikController { @Autowired @@ -53,28 +55,37 @@ @Autowired private HikService hikService; + @Autowired + private HikFaceGroupInfoMapper hikFaceGroupInfoMapper; + + @Autowired + private WebSocket webSocket; + @Value("${server.port}") private int serverPort; - @Autowired - private HikFaceGroupInfoMapper hikFaceGroupInfoMapper; /** * 海康事件订阅 */ - @PostMapping("/event/subscribe") + @PostMapping("/hik/event/subscribe") @ResponseBody - public Object eventSubscribe() throws UnknownHostException { + public Object eventSubscribe() { EventSubscribeRequest eventSubscribeRequest = new EventSubscribeRequest(); ArrayList list = new ArrayList<>(); list.add(SecurityEventType.DEVICE_OFFLINE); + list.add(SecurityEventType.DEVICE_ONLINE); list.add(SecurityEventType.KEY_PERSONNEL_IDENTIFY_EVENT); list.add(SecurityEventType.MONITORING_POINT_OFFLINE); + list.add(SecurityEventType.MONITORING_POINT_ONLINE); list.add(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); list.add(SecurityEventType.PERSONNEL_GATHER_EVENT); - InetAddress localHost = InetAddress.getLocalHost(); + list.add(SecurityEventType.VISITOR_REGISTER); + list.add(SecurityEventType.VISITOR_CHECKOUT); + list.add(SecurityEventType.HIGH_ALTITUDE_PARABOLIC); +// InetAddress localHost = InetAddress.getLocalHost(); eventSubscribeRequest.setEventTypes(list); - eventSubscribeRequest.setEventDest("https://" + localHost + ":" + serverPort + "/eventRcv"); + eventSubscribeRequest.setEventDest("http://" + "192.168.10.6" + ":" + serverPort + "/eventRcv"); //订阅类型,0-订阅原始事件,1-联动事件,2-原始事件和联动事件,不填使用默认值0 eventSubscribeRequest.setSubType(0); /** @@ -92,19 +103,25 @@ } /** + * 查询事件订阅信息 + */ + @PostMapping("/hik/event/query") + @ResponseBody + public Object eventQuery() { + String result = HikUtil.hikApi(HikUri.EVENT_INFO, ""); + return result; + } + + /** * 海康事件接收 */ @PostMapping("/eventRcv") @ResponseBody public Object eventRcv(@RequestBody HikRecvEvent hikRecvEvent) { //1、接收所需事件类型 - Long eventType = hikRecvEvent.getEventType(); + Number eventType = hikRecvEvent.getEventType(); log.info("接收到安防事件类型为:{}", eventType); CaseInfo caseInfo = caseInfoFactoryUtil.getCaseInfo(eventType); - //接收到不关心事件直接返回 - if(Objects.isNull(caseInfo)){ - return ResponseData.success(); - } //2、不同事件不同处理,caseInfoFactoryUtil已设置好事件基础定义信息 // 再为事件添加状态、设备编码、设备名称、位置、区域、时间 // 异步处理事件 @@ -114,19 +131,23 @@ caseHandle(hikRecvEvent, eventType, caseInfo); } })); +// caseHandle(hikRecvEvent, eventType, caseInfo); - return null; + return ResponseData.success(); } - private void caseHandle(HikRecvEvent hikRecvEvent, Long eventType, CaseInfo caseInfo) { + private void caseHandle(HikRecvEvent hikRecvEvent, Number eventType, CaseInfo caseInfo) { JSONArray eventArray = hikRecvEvent.getEventArray(); List caseInfos = new ArrayList<>(); - while (eventArray.stream().iterator().hasNext()) { + Iterator iterator = eventArray.iterator(); + while (iterator.hasNext()) { CaseInfo caseInfo1 = new CaseInfo(); - BeanUtils.copyProperties(caseInfo, caseInfo1); - JSONObject event = (JSONObject) eventArray.stream().iterator().next(); + if(!Objects.isNull(caseInfo)){ + BeanUtils.copyProperties(caseInfo, caseInfo1); + } + JSONObject event = (JSONObject) iterator.next(); //5种事件进行不同处理 - if(SecurityEventType.KEY_PERSONNEL_IDENTIFY_EVENT == eventType){ + if (SecurityEventType.KEY_PERSONNEL_IDENTIFY_EVENT.equals(eventType)) { //判断所属人脸分组 JSONObject data = (JSONObject) event.get("data"); JSONObject faceRecognitionResult = (JSONObject) data.get("faceRecognitionResult"); @@ -142,52 +163,101 @@ if (faceGroupCode.equals(blackListGroup.getFaceGroupCode())) { //黑名单分组处理 caseInfo1 = hikService.blackListHandle(event, caseInfo1); - }else if(faceGroupCode.equals(propertyPersonnelGroup.getFaceGroupCode())){ + } else if (faceGroupCode.equals(propertyPersonnelGroup.getFaceGroupCode())) { //考勤分组处理-物业人员,添加到考勤表 hikService.propertyAttendanceHandle(event); - }else if(faceGroupCode.equals(securityPersonnelGroup.getFaceGroupCode())){ + } else if (faceGroupCode.equals(securityPersonnelGroup.getFaceGroupCode())) { //考勤分组处理-安保人员,添加到考勤表 hikService.securityPersonnelHandle(event); - }else { + } else { return; } - }else if(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT == eventType){ + } else if (SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT.equals(eventType)) { //离岗事件处理 caseInfo1 = hikService.demobilizedHandle(event, caseInfo1); - }else if(SecurityEventType.PERSONNEL_GATHER_EVENT == eventType){ + } else if (SecurityEventType.PERSONNEL_GATHER_EVENT.equals(eventType)) { //人员聚集事件处理 caseInfo1 = hikService.personGatherHandle(event, caseInfo1); - }else if(SecurityEventType.MONITORING_POINT_OFFLINE == eventType){ + } else if (SecurityEventType.MONITORING_POINT_OFFLINE.equals(eventType)) { //监控点离线事件处理 caseInfo1 = hikService.monitorPointOfflineHandle(event, caseInfo1); - }else if(SecurityEventType.DEVICE_OFFLINE == eventType){ + } else if (SecurityEventType.MONITORING_POINT_ONLINE.equals(eventType)) { + //监控点上线事件处理 + hikService.monitorPointOnlineHandle(event); + } else if (SecurityEventType.DEVICE_OFFLINE.equals(eventType)) { //装置离线事件处理 caseInfo1 = hikService.deviceOfflineHandle(event, caseInfo1); - }else if(SecurityEventType.VISITOR_REGISTER == eventType){ + } else if (SecurityEventType.DEVICE_ONLINE.equals(eventType)) { + //装置上线处理 + hikService.deviceOnlineHandle(event); + } else if (SecurityEventType.VISITOR_REGISTER.equals(eventType)) { //记录访客登记记录,添加到访客记录表 hikService.visitorRegisterHandler(event); - }else if(SecurityEventType.VISITOR_CHECKOUT == eventType){ + } else if (SecurityEventType.VISITOR_CHECKOUT.equals(eventType)) { //记录访客签离记录 hikService.visitorCheckOutHandler(event); } - if(!Objects.isNull(caseInfo1) && !StringUtils.isEmpty(caseInfo1.getHappenTime())){ + if (!Objects.isNull(caseInfo1) && !StringUtils.isEmpty(caseInfo1.getHappenTime())) { caseInfos.add(caseInfo1); } } //3、安防事件入库 - if(!caseInfoService.insertCaseInfoBatch(caseInfos)){ - log.error("安防事件批量入库异常"); + if (!CollectionUtils.isEmpty(caseInfos) && !caseInfoService.insertCaseInfoBatch(caseInfos)) { + log.error("安防事件批量入库异常!"); } // TODO: 2022/8/15 webSocket推送 + if (CollectionUtils.isEmpty(caseInfos)) { + log.info("webSocket事件推送"); + webSocket.sendAllMessage(JSONObject.toJSONString(caseInfos)); + } return; } /** + * 以图搜图,前端用于轨迹追踪 + */ + @PostMapping("/hik/search/picture") + @ResponseBody + public Object searchPictures(@RequestBody SearchPicturesRequest searchPicturesRequest) { + DateTime startDateTime = DateUtil.parse(searchPicturesRequest.getStartTime()); + DateTime endDateTime = DateUtil.parse(searchPicturesRequest.getEndTime()); + String startTime = DateUtil.format(startDateTime, "yyyy-MM-dd'T'HH:mm:ss.SSSXXX"); + String endTime = DateUtil.format(endDateTime, "yyyy-MM-dd'T'HH:mm:ss.SSSXXX"); + searchPicturesRequest.setStartTime(startTime); + searchPicturesRequest.setEndTime(endTime); + String body = JSONObject.toJSONString(searchPicturesRequest); + String resultStr = HikUtil.hikApi(HikUri.SEARCH_PICTURES, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (!"0".equals(resultJson.get("code"))) { + log.error("请求海康,以图搜图失败,海康response:{}", resultStr); + return ResponseData.error("以图搜图失败"); + } + return ResponseData.success(resultJson); + } + + + /** + * 海康事件取消订阅 + */ + @PostMapping("/hik/event/cancel") + @ResponseBody + public Object eventCancelSubscribe(@RequestBody CancelSubscribeRequest cancelSubscribeRequest) { + String body = JSONObject.toJSONString(cancelSubscribeRequest); + String resultStr = HikUtil.hikApi(HikUri.EVENT_CANCEL, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (!"0".equals(resultJson.get("code"))) { + log.error("请求海康,取消订阅失败,海康response:{}", resultStr); + return ResponseData.error("取消订阅失败"); + } + return ResponseData.success(resultJson); + } + + /** * 单个添加海康人脸分组 * api->hik单个添加人脸分组api->response->mysql */ - @PostMapping("/faceGroup/single/add") + @PostMapping("/hik/faceGroup/single/add") @ResponseBody public Object faceGroupAddition(@RequestBody FaceGroupAdditionRequest faceGroupAdditionRequest) { String body = JSONObject.toJSONString(faceGroupAdditionRequest); @@ -212,7 +282,7 @@ * 批量添加海康组织 * api->hik批量添加组织api->response */ - @PostMapping("/org/batch/add") + @PostMapping("/hik/org/batch/add") @ResponseBody public Object orgBatchAdd(@RequestBody List orgBatchAddRequest) { String body = JSONObject.toJSONString(orgBatchAddRequest); @@ -232,4 +302,62 @@ return ResponseData.error("批量添加组织失败"); } + /** + * 获取人员列表 + */ + @PostMapping("/hik/person/personList") + @ResponseBody + public Object personList() { + PersonListRequest request = new PersonListRequest(); + request.setPageNo(1); + request.setPageSize(100); + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi("/api/resource/v2/person/personList", body); + return resultStr; + } + + /** + * 获取组织列表 + */ + @PostMapping("/hik/org/orgList") + @ResponseBody + public Object orgList() { + PersonListRequest request = new PersonListRequest(); + request.setPageNo(1); + request.setPageSize(100); + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi("/api/resource/v1/org/orgList", body); + return resultStr; + } + + /** + * 查询访客权限下载记录 + */ + @PostMapping("/hik/auth/result") + @ResponseBody + public Object authResult() { + PersonListRequest request = new PersonListRequest(); + request.setPageNo(1); + request.setPageSize(100); + request.setOrderId("ba101db6246711edaea66f7939a13638"); + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi("/api/visitor/v1/auth/result", body); + return resultStr; + } + + /** + * 人脸图片获取 + */ + @PostMapping("/hik/face/picture") + @ResponseBody + public Object facePicture() { + FaceRequest request = new FaceRequest(); +// List list = new ArrayList<>(); +// list.add(""); + request.setCertificateNum("wanggong"); + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi("/api/frs/v1/face", body); + return resultStr; + } + } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/AssetInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/AssetInfoMapper.java index 4f64e83..c0684ee 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/AssetInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/AssetInfoMapper.java @@ -17,6 +17,6 @@ @Mapper public interface AssetInfoMapper extends BaseMapper { - List getAssetInfoListPage(@Param("page") Page page, AssetInfoRequest assetInfoRequest); + List getAssetInfoListPage(@Param("page") Page page, @Param("assetInfoRequest") AssetInfoRequest assetInfoRequest); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/AttendanceInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/AttendanceInfoMapper.java index f9e793e..ec87e46 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/AttendanceInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/AttendanceInfoMapper.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.statistics.AttendanceNumberDTO; import com.casic.missiles.modular.dto.statistics.AttendanceRatioDTO; import com.casic.missiles.modular.model.AttendanceInfo; import org.apache.ibatis.annotations.Mapper; @@ -17,7 +18,7 @@ */ @Mapper public interface AttendanceInfoMapper extends BaseMapper { - List getAttendanceInfoListPage(@Param("page") Page page, StaffInfoRequest attendanceInfoRequest); + List getAttendanceInfoListPage(@Param("page") Page page, @Param("attendanceInfoRequest") StaffInfoRequest attendanceInfoRequest); AttendanceInfo selectByCodeAndDate(@Param("staffCode") String staffCode); @@ -26,4 +27,8 @@ List getCountByTypeAndDateForMonth(@Param("staffType")String staffType); List getCountByTypeAndDateForYear(@Param("staffType")String staffType); + + List getCountForWeek(); + + List getCountForDay(); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java index ce94b8f..6137a7d 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java @@ -17,5 +17,5 @@ @Mapper public interface BlackInfoMapper extends BaseMapper { - List getBlackInfoListPage(@Param("page") Page page, BlackInfoRequest blackInfoRequest); + List getBlackInfoListPage(@Param("page") Page page, @Param("blackInfoRequest") BlackInfoRequest blackInfoRequest); } 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 efda6b3..50aaa6f 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 @@ -20,7 +20,7 @@ List getCaseInfoListPage(@Param("page") Page page, @Param("caseInfoRequest") CaseInfoRequest caseInfoRequest); - int updateStatusById(CaseInfoRequest caseInfoRequest); + int updateStatusById(@Param("caseInfoRequest") CaseInfoRequest caseInfoRequest); List selectByLevelAndMonth(@Param("year") String year); @@ -47,4 +47,20 @@ List selectPreWeekCountByThirtyDay(); List selectPreDayCountBySevenDay(); + + Integer selectDemobilizedCount(@Param("eventType") Number personnelDemobilizedEvent); + + List selectPreMonthCount(); + + List selectListBySevenDay(); + + List selectListByToday(); + + List selectListByToday2(); + + List selectListByToday3(); + + List selectListByType(@Param("eventType") Number eventType); + + List selectDemobilizedCountByHour(@Param("eventType") Number eventType); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/BlackListController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/BlackListController.java index a27f9f8..0c06661 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/BlackListController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/BlackListController.java @@ -1,13 +1,18 @@ package com.casic.missiles.modular.controller; +import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.base.controller.ExportController; import com.casic.missiles.core.page.PageFactory; import com.casic.missiles.model.response.ResponseData; import com.casic.missiles.modular.dto.BlackInfoRequest; +import com.casic.missiles.modular.dto.BlackPictureRequest; +import com.casic.missiles.modular.dto.hik.PersonInfoRequest; +import com.casic.missiles.modular.enums.HikUri; import com.casic.missiles.modular.enums.OperateTypeEnum; import com.casic.missiles.modular.model.BlackInfo; import com.casic.missiles.modular.service.BlackInfoService; +import com.casic.missiles.modular.util.HikUtil; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; @@ -56,4 +61,22 @@ return null; } + /** + * 黑名单人员照片 + */ + @PostMapping("/personPicture") + @ResponseBody + public Object personPicture(@RequestBody BlackPictureRequest blackPictureRequest){ + //获取照片 + String picUri = blackPictureRequest.getPicUri(); + String serverIndexCode = blackPictureRequest.getServerIndexCode(); + PersonInfoRequest picRequest = new PersonInfoRequest(); + picRequest.setPicUri(picUri); + picRequest.setServerIndexCode(serverIndexCode); + String reBody = JSONObject.toJSONString(picRequest); + //重定向地址获取 + String url = HikUtil.hikApiFor302(HikUri.PERSON_PICTURE, reBody); + return ResponseData.success(url); + } + } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/DeviceController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/DeviceController.java index e1c4eba..666bbee 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/DeviceController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/DeviceController.java @@ -107,7 +107,7 @@ } /** - * 设备维修管理查询(分页),需计算MTTR=总维修时间/故障次数 + * 设备状态计算与评判/设备维修管理查询(分页),需计算MTTR=总维修时间/故障次数 */ @PostMapping("/repair/listPage") @ResponseBody @@ -211,7 +211,7 @@ //需根据设备编号获取到对应的门禁点唯一标识 doorControlRequest.setDoorIndexCodes(indexCodes); doorControlRequest.setControlType(Integer.valueOf(gateGroupDTO.getStatus())); - String body = JSONObject.toJSONString(deviceCodes); + String body = JSONObject.toJSONString(doorControlRequest); String resultStr = HikUtil.hikApi(HikUri.DOOR_CONTROL, body); JSONObject resultJson = (JSONObject)JSONObject.parse(resultStr); if (!"0".equals(resultJson.get("code"))) { diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/StaffController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/StaffController.java index b58ccab..704093c 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/StaffController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/StaffController.java @@ -2,15 +2,21 @@ import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.util.StrUtil; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.base.controller.ExportController; import com.casic.missiles.core.page.PageFactory; import com.casic.missiles.model.response.ErrorResponseData; import com.casic.missiles.model.response.ResponseData; import com.casic.missiles.modular.dto.StaffInfoRequest; +import com.casic.missiles.modular.dto.hik.PersonInfoRequest; +import com.casic.missiles.modular.dto.hik.StaffCardRequest; +import com.casic.missiles.modular.enums.HikUri; import com.casic.missiles.modular.enums.OperateTypeEnum; import com.casic.missiles.modular.model.StaffInfo; import com.casic.missiles.modular.service.StaffInfoService; +import com.casic.missiles.modular.util.HikUtil; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; @@ -110,4 +116,60 @@ } return ResponseData.success(); } + + /** + * 批量开卡,添加人员之后调用,若在一个接口中添加人员成功开卡失败则第二次添加时会有问题 + */ + @PostMapping("/cardBinding") + @ResponseBody + public Object cardBinding(@RequestBody StaffCardRequest staffCardRequest) { + String body = JSONObject.toJSONString(staffCardRequest); + String resultStr = HikUtil.hikApi(HikUri.CARD_BINDING, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (!"0".equals(resultJson.get("code"))) { + log.error("请求海康,批量开卡失败,海康response:{}", resultStr); + return ResponseData.error("批量开卡失败"); + } + //保存卡号 + if(staffInfoService.saveCardInfo(staffCardRequest) > 0){ + return ResponseData.success(); + } + return ResponseData.error("批量开卡失败"); + } + + /** + * 获取员工照片,海康存储 + */ + @PostMapping("/personPicture/{staffCode}") + @ResponseBody + public Object personPicture(@PathVariable("staffCode") String staffCode){ + //获取员工详细信息,含图片服务器、uri + PersonInfoRequest request = new PersonInfoRequest(); + List list = new ArrayList<>(); + list.add(staffCode); + request.setParamName("personId"); + request.setParamValue(list); + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi(HikUri.PERSON_INFO, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (!"0".equals(resultJson.get("code"))) { + log.error("请求海康,根据人员唯一字段获取人员详细信息失败,海康response:{}", resultStr); + return ResponseData.error("获取员工照片失败"); + } + //获取照片 + JSONObject data = (JSONObject) resultJson.get("data"); + JSONArray dataArray = (JSONArray) data.get("list"); + JSONObject jsonObject = (JSONObject) dataArray.get(0); + JSONArray personPhoto = (JSONArray) jsonObject.get("personPhoto"); + JSONObject photo = (JSONObject) personPhoto.get(0); + String picUri = photo.getString("picUri"); + String serverIndexCode = photo.getString("serverIndexCode"); + PersonInfoRequest picRequest = new PersonInfoRequest(); + picRequest.setPicUri(picUri); + picRequest.setServerIndexCode(serverIndexCode); + String reBody = JSONObject.toJSONString(picRequest); + //重定向地址获取 + String url = HikUtil.hikApiFor302(HikUri.PERSON_PICTURE, reBody); + return ResponseData.success(url); + } } 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 4a07dd9..7b1dcf6 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 @@ -16,6 +16,7 @@ import com.casic.missiles.modular.redis.key.CacheKeys; import com.casic.missiles.modular.service.CockpitService; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.util.CollectionUtils; import org.springframework.web.bind.annotation.*; @@ -24,10 +25,7 @@ import java.text.NumberFormat; import java.time.LocalDateTime; import java.time.temporal.ChronoUnit; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.util.*; import java.util.stream.Collectors; /** @@ -73,6 +71,9 @@ private StatisticNumberMapper numberMapper; @Autowired + private HazardLevelMapper hazardLevelMapper; + + @Autowired private AccessGroupConfig accessGroupConfig; /** @@ -104,8 +105,24 @@ public Object buildingNumberPerHour(){ //当天按小时分组的人数 List list = numberMapper.selectListByTime(); - Map> collect = list.stream().collect(Collectors.groupingBy(BuildingNumberDTO::getStatisticPosition)); - return ResponseData.success(collect); + Map> collect = list.stream().collect(Collectors.groupingBy(BuildingNumberDTO::getStatisticTime)); + //定时任务中已将每小时三栋楼人数存到数据库 + //将一期主楼和录制楼人数合并,二期单算 + List> resultList = new ArrayList<>(); + collect.keySet().forEach(key -> { + List buildingNumberDTOS = collect.get(key); + BuildingNumberDTO mainBuildingOne = buildingNumberDTOS.get(0); + BuildingNumberDTO mainBuildingTwo = buildingNumberDTOS.get(1); + BuildingNumberDTO recordingBuilding = buildingNumberDTOS.get(2); + HashMap resultMap = new HashMap<>(); + Integer oneQuantity = Integer.valueOf(mainBuildingOne.getStatisticQuantity()); + Integer recordingQuantity = Integer.valueOf(recordingBuilding.getStatisticQuantity()); + resultMap.put("staticTime", mainBuildingOne.getStatisticTime()); + resultMap.put(mainBuildingOne.getStatisticPositionName()+"、"+recordingBuilding.getStatisticPositionName(), String.valueOf(oneQuantity+recordingQuantity)); + resultMap.put(mainBuildingTwo.getStatisticPositionName(), mainBuildingTwo.getStatisticQuantity()); + resultList.add(resultMap); + }); + return ResponseData.success(resultList); } /** @@ -151,12 +168,11 @@ public Object securityNumber() { QueryWrapper wrapper = new QueryWrapper<>(); wrapper.eq("staff_type", 2); + // TODO: 2022/9/2 后续使用产品确定的每天出勤的安保人员的数量 Integer total = staffInfoMapper.selectCount(wrapper); - //当日离岗事件个数 - QueryWrapper wrapper1 = new QueryWrapper<>(); - wrapper1.eq("hik_event_type", SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); - wrapper1.apply("date_format(now(),'%Y-%m-%d') = date_format(happen_time,'%Y-%m-%d')"); - Integer leave = caseInfoMapper.selectCount(wrapper1); + //当日离岗事件按设备去重后的个数 + // TODO: 2022/9/2 目前相当于24小时内的计算,之后看需要可改成自定义小时数计算离岗率,即离岗+6小时内仅一次离岗则恢复为100%,多次则累加离岗次数计算离岗率 + Integer leave = caseInfoMapper.selectDemobilizedCount(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); NumberFormat numberFormat = NumberFormat.getInstance(); // 设置精确到小数点后2位 numberFormat.setMaximumFractionDigits(2); @@ -179,7 +195,6 @@ @ResponseBody public Object visitorApplyDetail() { List reasonGroup = applyMapper.selectByVisitReason(); - HashMap resultMap = new HashMap<>(); NumberFormat numberFormat = NumberFormat.getInstance(); // 设置精确到小数点后2位 numberFormat.setMaximumFractionDigits(2); @@ -187,12 +202,17 @@ if(0 == sum){ return ResponseData.success(); } + List resultList = new ArrayList<>(); reasonGroup.forEach(group -> { String reasonName = dictService.getDictNameByCode(SecurityEventDict.VISIT_REASON, group.getVisitReason()); String result = numberFormat.format((float) group.getQuantity() / (float) sum * 100); - resultMap.put(reasonName, result+"%"); + ApplyReasonGroupDTO applyReasonGroupDTO = new ApplyReasonGroupDTO(); + applyReasonGroupDTO.setQuantity(group.getQuantity()); + applyReasonGroupDTO.setVisitReason(reasonName); + applyReasonGroupDTO.setRatio(result+"%"); + resultList.add(applyReasonGroupDTO); }); - return ResponseData.success(resultMap); + return ResponseData.success(resultList); } /** @@ -247,6 +267,32 @@ } /** + * 机动力量实时在岗率,在岗人数除以总应在岗人数,用离岗+6小时内恢复为100%,6小时外再计算 + */ + @GetMapping("/staff/beOnDutyRatio") + @ResponseBody + public Object beOnDutyRatio() { + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("staff_type", 2); + // TODO: 2022/9/2 后续使用产品确定的每天出勤的安保人员的数量 + Integer total = staffInfoMapper.selectCount(wrapper); + if(0 == total){ + return ResponseData.success(null); + } + //当日离岗事件按设备去重后的个数 + // TODO: 2022/9/2 目前相当于24小时内的计算,之后看需要可改成自定义小时数计算离岗率,即离岗+6小时内仅一次离岗则恢复为100%,多次则累加离岗次数计算离岗率 + List onDutyRatioDTOS = caseInfoMapper.selectDemobilizedCountByHour(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); + onDutyRatioDTOS.forEach(dto -> { + NumberFormat numberFormat = NumberFormat.getInstance(); + // 设置精确到小数点后2位 + numberFormat.setMaximumFractionDigits(2); + String result = numberFormat.format(100 - Float.valueOf(dto.getQuantity()) / (float) total * 100); + dto.setRatio(result+"%"); + }); + return ResponseData.success(onDutyRatioDTOS); + } + + /** * 闸机速通门统计-设备状态分组计算数量,devType传闸机字典key * 视频频监控摄像机统计-设备状态分组计算数量,devType传摄像头字典key */ @@ -262,12 +308,17 @@ if(sum <= 0){ return ResponseData.error("无该类设备信息"); } + List resultList = new ArrayList<>(); gateStatusGroup.forEach(group -> { String devStatus = dictService.getDictNameByCode(SecurityEventDict.DEVICE_STATUS, group.getStatus()); String result = numberFormat.format((float) group.getQuantity() / (float) sum * 100); - resultMap.put(devStatus, result+"%"); + GateStatusGroupResponse gateStatusGroupResponse = new GateStatusGroupResponse(); + gateStatusGroupResponse.setStatus(devStatus); + gateStatusGroupResponse.setRatio(result+"%"); + resultList.add(gateStatusGroupResponse); }); - resultMap.put("总", sum); + resultMap.put("total", sum); + resultMap.put("list", resultList); return ResponseData.success(resultMap); } @@ -282,17 +333,38 @@ String position = securityScoreDTO.getPosition(); List caseInfos = caseInfoMapper.selectByPosition(position); //查询各危险级别权重、各类别权重,放入map,避免循环中多次查数据库 - + HashMap hazardScoreMap = new HashMap<>(); + List caseHazardLevelList = hazardLevelMapper.getCaseHazardLevelList(null); + caseHazardLevelList.forEach(hazardLevel -> { + hazardScoreMap.put(hazardLevel.getCode(), hazardLevel.getWeight()); + }); + HashMap categoryScoreMap = new HashMap<>(); + List categoryLevelList = categoryLevelMapper.getCaseCategoryLevelList(null); + categoryLevelList.forEach(categoryLevel -> { + categoryScoreMap.put(categoryLevel.getCode(), categoryLevel.getWeight()); + }); + //事件按楼层分组,计算 List securityScoreDTOs = new ArrayList<>(); caseInfos.forEach(caseInfo -> { SecurityScoreDTO securityScoreDTO1 = new SecurityScoreDTO(); + securityScoreDTO1.setPosition(caseInfo.getPosition()); securityScoreDTO1.setArea(caseInfo.getArea()); - // TODO: 2022/8/4 楼层评分计算根据产品定义调整 -// caseInfo.get -// securityScoreDTO1.setScore(); + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); + Double score = 100 - Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + securityScoreDTO1.setScore(score); + securityScoreDTOs.add(securityScoreDTO1); }); - - return null; + 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); + }); + return ResponseData.success(securityScoreDTOs); } /** @@ -303,9 +375,13 @@ public Object SecurityFrequency(@RequestBody SecurityFrequencyDTO securityFrequencyDTO) { String year = securityFrequencyDTO.getYear(); String month = securityFrequencyDTO.getMonth(); - Integer quantity = caseInfoMapper.selectCountByMonth(year, month); - securityFrequencyDTO.setQuantity(quantity); - return ResponseData.success(securityFrequencyDTO); + if(!StringUtils.isEmpty(year) && StringUtils.isEmpty(month)){ + Integer quantity = caseInfoMapper.selectCountByMonth(year, month); + securityFrequencyDTO.setQuantity(quantity); + return ResponseData.success(securityFrequencyDTO); + } + List list = caseInfoMapper.selectPreMonthCount(); + return ResponseData.success(list); } } 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 ae4d770..f4f075c 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 @@ -1,20 +1,25 @@ package com.casic.missiles.modular.controller.cockpit; +import cn.hutool.core.date.DateUnit; import cn.hutool.core.date.DateUtil; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.casic.missiles.model.response.ResponseData; -import com.casic.missiles.modular.dao.AttendanceInfoMapper; -import com.casic.missiles.modular.dao.CaseInfoMapper; -import com.casic.missiles.modular.dao.HazardLevelMapper; -import com.casic.missiles.modular.dao.StaffInfoMapper; +import com.casic.missiles.modular.dao.*; +import com.casic.missiles.modular.dto.DeviceRepairLogDTO; +import com.casic.missiles.modular.dto.DeviceRepairRequest; import com.casic.missiles.modular.dto.statistics.*; +import com.casic.missiles.modular.enums.SecurityEventType; +import com.casic.missiles.modular.model.CaseCategoryLevel; import com.casic.missiles.modular.model.CaseHazardLevel; +import com.casic.missiles.modular.model.CaseInfo; import com.casic.missiles.modular.model.StaffInfo; +import com.casic.missiles.modular.service.DeviceInfoService; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.util.CollectionUtils; import org.springframework.web.bind.annotation.*; +import java.math.BigDecimal; import java.text.NumberFormat; import java.util.*; import java.util.stream.Collectors; @@ -40,6 +45,12 @@ @Autowired private HazardLevelMapper hazardLevelMapper; + @Autowired + private CategoryLevelMapper categoryLevelMapper; + + @Autowired + private DeviceInfoService deviceInfoService; + /** * 安防事件时域频次统计,每月的每天安防事件个数(原方案) * 月维度:展示每个月的每天的数据 @@ -89,15 +100,17 @@ List monthList = caseInfoMapper.selectPreMonthCountByYear(year); Map> collect = monthList.stream().collect(Collectors.groupingBy(PreMonthOrWeekCaseDTO::getHazardLevelCode)); HashMap strAvgMap = new HashMap<>(); + List resultList = new ArrayList<>(); for (String key : collect.keySet()) { List preMonthOrWeekCaseDTOS = collect.get(key); int sum = preMonthOrWeekCaseDTOS.stream().mapToInt(PreMonthOrWeekCaseDTO::getQuantity).sum(); //若年份是本年,则使用个安防级别数量/当前月份数 //若不是本年,除数为12 MonthAndWeekDTO monthAndWeekDTO = new MonthAndWeekDTO(); + String hazardName = hazardLevelMapper.selectHazardNameByCode(key); + monthAndWeekDTO.setLevelName(hazardName); if(year.equals(String.valueOf(DateUtil.thisYear()))){ monthAndWeekDTO.setMonthQuantity(sum / DateUtil.thisMonth()); -// monthAndWeekDTO.setLevelName(); strAvgMap.put(key, monthAndWeekDTO); }else{ monthAndWeekDTO.setMonthQuantity(sum / 12); @@ -113,27 +126,37 @@ if(year.equals(String.valueOf(DateUtil.thisYear()))){ if(!Objects.isNull(strAvgMap.get(key))){ MonthAndWeekDTO monthAndWeekDTO = strAvgMap.get(key); + String hazardName = hazardLevelMapper.selectHazardNameByCode(key); + monthAndWeekDTO.setLevelName(hazardName); monthAndWeekDTO.setWeekQuantity(sum / DateUtil.thisWeekOfYear()); strAvgMap.put(key, monthAndWeekDTO); }else{ MonthAndWeekDTO monthAndWeekDTO = new MonthAndWeekDTO(); + String hazardName = hazardLevelMapper.selectHazardNameByCode(key); + monthAndWeekDTO.setLevelName(hazardName); monthAndWeekDTO.setWeekQuantity(sum / DateUtil.thisWeekOfYear()); strAvgMap.put(key, monthAndWeekDTO); } }else{ if(!Objects.isNull(strAvgMap.get(key))){ MonthAndWeekDTO monthAndWeekDTO = strAvgMap.get(key); + String hazardName = hazardLevelMapper.selectHazardNameByCode(key); + monthAndWeekDTO.setLevelName(hazardName); monthAndWeekDTO.setWeekQuantity(sum / 52); strAvgMap.put(key, monthAndWeekDTO); }else{ MonthAndWeekDTO monthAndWeekDTO = new MonthAndWeekDTO(); + String hazardName = hazardLevelMapper.selectHazardNameByCode(key); + monthAndWeekDTO.setLevelName(hazardName); monthAndWeekDTO.setWeekQuantity(sum / 52); strAvgMap.put(key, monthAndWeekDTO); } } } - avgMonthAndWeekGroupDTO.setMap(strAvgMap); - return ResponseData.success(avgMonthAndWeekGroupDTO); + strAvgMap.keySet().forEach(key -> { + resultList.add(strAvgMap.get(key)); + }); + return ResponseData.success(resultList); } /** @@ -181,12 +204,178 @@ } /** - * 员工考勤人数变化,功能待定 + * 员工考勤人数变化,统计当天(横坐标为时)及近7天(横坐标为天)的考勤人数变化,只要发生一次考勤识别,次数的基数就正常增加(没有上班下班区分) */ + @PostMapping("/staff/attendanceNumber/{dimension}") + @ResponseBody + public Object attendanceNumber(@PathVariable("dimension") String dimension) { + List attendanceNumberDTOs = null; + List> resultList = new ArrayList<>(); + if("week".equals(dimension)){ + //近7天数据按天分组统计 + attendanceNumberDTOs = attendanceInfoMapper.getCountForWeek(); + }else if("day".equals(dimension)) { + //今天数据按小时分组统计 + attendanceNumberDTOs = attendanceInfoMapper.getCountForDay(); + } + if(CollectionUtils.isEmpty(attendanceNumberDTOs)){ + return ResponseData.error("该查询条件下,无员工出勤数据!"); + } + Map> collect = attendanceNumberDTOs.stream().collect(Collectors.groupingBy(AttendanceNumberDTO::getDate)); + collect.keySet().forEach(key -> { + List attendanceNumberDTOS = collect.get(key); + AttendanceNumberDTO attendanceNumberDTO = attendanceNumberDTOS.get(0); + AttendanceNumberDTO attendanceNumberDTO2 = attendanceNumberDTOS.get(1); + Map resultMap = new HashMap<>(); + resultMap.put(attendanceNumberDTO.getStaffType(), attendanceNumberDTO.getQuantity()); + resultMap.put(attendanceNumberDTO2.getStaffType(), attendanceNumberDTO2.getQuantity()); + resultMap.put("staticTime", attendanceNumberDTO.getDate()); + resultList.add(resultMap); + }); + return ResponseData.success(resultList); + } /** - * 近30天/近一周安保人员到岗排行 + * 早晚高峰区域安防评估 */ + @PostMapping("/security/assessment/{dimension}") + @ResponseBody + public Object securityAssessment(@PathVariable("dimension") String dimension) { + //查询各危险级别权重、各类别权重,放入map,避免循环中多次查数据库 + HashMap hazardScoreMap = new HashMap<>(); + List caseHazardLevelList = hazardLevelMapper.getCaseHazardLevelList(null); + caseHazardLevelList.forEach(hazardLevel -> { + hazardScoreMap.put(hazardLevel.getCode(), hazardLevel.getWeight()); + }); + HashMap categoryScoreMap = new HashMap<>(); + List categoryLevelList = categoryLevelMapper.getCaseCategoryLevelList(null); + categoryLevelList.forEach(categoryLevel -> { + categoryScoreMap.put(categoryLevel.getCode(), categoryLevel.getWeight()); + }); + HashMap hashMap = new HashMap<>(); + if("week".equals(dimension)){ + //近7天早晚高峰数据 + List caseInfos = caseInfoMapper.selectListBySevenDay(); + //按时间(天)进行分组 + caseInfos.forEach(caseInfo -> { + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); + Double score = Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + String[] array = caseInfo.getHappenTime().split(" "); + String dayTime = array[0]; + BigDecimal preScore; + if(hashMap.containsKey(dayTime)){ + Double aDouble = hashMap.get(dayTime); + preScore = new BigDecimal(aDouble.toString()); + + }else{ + preScore = new BigDecimal("100.0"); + } + BigDecimal nowScore = new BigDecimal(score.toString()); + hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); + }); + return ResponseData.success(hashMap); + }else if("day".equals(dimension)) { + //今天数据按小时分组统计 + List caseInfos = caseInfoMapper.selectListByToday(); + caseInfos.forEach(caseInfo -> { + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); + Double score = Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + String[] array = caseInfo.getHappenTime().split(":"); + String dayTime = array[0]; + BigDecimal preScore; + if(hashMap.containsKey(dayTime)){ + Double aDouble = hashMap.get(dayTime); + preScore = new BigDecimal(aDouble.toString()); + + }else{ + preScore = new BigDecimal("100.0"); + } + BigDecimal nowScore = new BigDecimal(score.toString()); + hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); + }); + return ResponseData.success(hashMap); + } + return null; + } + + /** + * 重点区域安防事态评估,统计重点区域6:00-23:00按小时分组数据 + */ + @GetMapping("/security/keyAreaStatistic") + @ResponseBody + public Object keyAreaStatistic() { + //查询各危险级别权重、各类别权重,放入map,避免循环中多次查数据库 + HashMap hazardScoreMap = new HashMap<>(); + List caseHazardLevelList = hazardLevelMapper.getCaseHazardLevelList(null); + caseHazardLevelList.forEach(hazardLevel -> { + hazardScoreMap.put(hazardLevel.getCode(), hazardLevel.getWeight()); + }); + HashMap categoryScoreMap = new HashMap<>(); + List categoryLevelList = categoryLevelMapper.getCaseCategoryLevelList(null); + categoryLevelList.forEach(categoryLevel -> { + categoryScoreMap.put(categoryLevel.getCode(), categoryLevel.getWeight()); + }); + HashMap hashMap = new HashMap<>(); + //今天数据按小时分组统计 + List caseInfos = caseInfoMapper.selectListByToday2(); + caseInfos.forEach(caseInfo -> { + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); + Double score = Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + String[] array = caseInfo.getHappenTime().split(":"); + String dayTime = array[0]; + BigDecimal preScore; + if(hashMap.containsKey(dayTime)){ + Double aDouble = hashMap.get(dayTime); + preScore = new BigDecimal(aDouble.toString()); + + }else{ + preScore = new BigDecimal("100.0"); + } + BigDecimal nowScore = new BigDecimal(score.toString()); + hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); + }); + return ResponseData.success(hashMap); + } + + /** + * 安防机动支援力量调配响应评估,根据事件已解决状态及已解决时间-发送时间,按时间(小时)分组统计 + */ + @GetMapping("/security/responseAssess") + @ResponseBody + public Object responseAssess() { + //查询各危险级别权重、各类别权重,放入map,避免循环中多次查数据库 + HashMap hazardScoreMap = new HashMap<>(); + List caseHazardLevelList = hazardLevelMapper.getCaseHazardLevelList(null); + caseHazardLevelList.forEach(hazardLevel -> { + hazardScoreMap.put(hazardLevel.getCode(), hazardLevel.getWeight()); + }); + HashMap hashMap = new HashMap<>(); + //今天数据按小时分组统计 + List caseInfos = caseInfoMapper.selectListByToday3(); + caseInfos.forEach(caseInfo -> { + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + //扣分=事件级别权重*未解决小时数 + Date updateTime = DateUtil.parse(caseInfo.getUpdateTime()); + Date happenTime = DateUtil.parse(caseInfo.getHappenTime()); + long between = DateUtil.between(updateTime, happenTime, DateUnit.HOUR); + Double score = Double.valueOf(hazardWeight)*between; + String[] array = caseInfo.getHappenTime().split(":"); + String dayTime = array[0]; + BigDecimal preScore; + if(hashMap.containsKey(dayTime)){ + Double aDouble = hashMap.get(dayTime); + preScore = new BigDecimal(aDouble.toString()); + }else{ + preScore = new BigDecimal("100.0"); + } + BigDecimal nowScore = new BigDecimal(score.toString()); + hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); + }); + return ResponseData.success(hashMap); + } /** * 重点区域威胁事件类型统计,优先级2,统计近7天和近30天 @@ -224,7 +413,34 @@ } /** - * 设备状态计算系数和评判,优先级3,需确认设备恢复时间是否可以获取 + * 近30天/近一周安保人员到岗排行 */ + + /** + * 安保等级评估,发生离岗事件减1分 + */ + @GetMapping("/security/levelAssess") + @ResponseBody + public Object securityLevelAssess() { + //今天数据按小时分组统计 + List resultList = caseInfoMapper.selectListByType(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); + resultList.forEach(result -> { + BigDecimal deScore = new BigDecimal(result.getQuantity()); + BigDecimal preScore = new BigDecimal("100.0"); + result.setScore(preScore.subtract(deScore).doubleValue()); + }); + return ResponseData.success(resultList); + } + + /** + * 设备状态计算系数和评判,即设备维修管理查询(不分页) + */ + @PostMapping("/device/repairList") + @ResponseBody + public Object repairList(@RequestBody DeviceRepairRequest deviceRepairRequest) { + List deviceRepairLogDTOS = deviceInfoService.deviceRepairListPage(deviceRepairRequest); + return ResponseData.success(deviceRepairLogDTOS); + } + } 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 fbf8ab6..c71a15a 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 @@ -1,13 +1,12 @@ package com.casic.missiles.modular.controller.hik; +import cn.hutool.core.date.DateTime; +import cn.hutool.core.date.DateUtil; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.casic.missiles.model.response.ResponseData; import com.casic.missiles.modular.dao.HikFaceGroupInfoMapper; -import com.casic.missiles.modular.dto.hik.EventSubscribeRequest; -import com.casic.missiles.modular.dto.hik.FaceGroupAdditionRequest; -import com.casic.missiles.modular.dto.hik.HikRecvEvent; -import com.casic.missiles.modular.dto.hik.OrgBatchAdd; +import com.casic.missiles.modular.dto.hik.*; import com.casic.missiles.modular.enums.HikUri; import com.casic.missiles.modular.enums.SecurityEventType; import com.casic.missiles.modular.model.CaseInfo; @@ -18,16 +17,20 @@ import com.casic.missiles.modular.util.CaseInfoFactoryUtil; import com.casic.missiles.modular.util.HikUtil; import com.casic.missiles.modular.util.ThreadPoolUtil; +import com.casic.missiles.modular.util.WebSocket; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; -import org.springframework.web.bind.annotation.*; +import org.springframework.util.CollectionUtils; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.RestController; -import java.net.InetAddress; -import java.net.UnknownHostException; import java.util.ArrayList; +import java.util.Iterator; import java.util.List; import java.util.Objects; @@ -38,7 +41,6 @@ */ @Slf4j @RestController -@RequestMapping("/hik") public class HikController { @Autowired @@ -53,28 +55,37 @@ @Autowired private HikService hikService; + @Autowired + private HikFaceGroupInfoMapper hikFaceGroupInfoMapper; + + @Autowired + private WebSocket webSocket; + @Value("${server.port}") private int serverPort; - @Autowired - private HikFaceGroupInfoMapper hikFaceGroupInfoMapper; /** * 海康事件订阅 */ - @PostMapping("/event/subscribe") + @PostMapping("/hik/event/subscribe") @ResponseBody - public Object eventSubscribe() throws UnknownHostException { + public Object eventSubscribe() { EventSubscribeRequest eventSubscribeRequest = new EventSubscribeRequest(); ArrayList list = new ArrayList<>(); list.add(SecurityEventType.DEVICE_OFFLINE); + list.add(SecurityEventType.DEVICE_ONLINE); list.add(SecurityEventType.KEY_PERSONNEL_IDENTIFY_EVENT); list.add(SecurityEventType.MONITORING_POINT_OFFLINE); + list.add(SecurityEventType.MONITORING_POINT_ONLINE); list.add(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); list.add(SecurityEventType.PERSONNEL_GATHER_EVENT); - InetAddress localHost = InetAddress.getLocalHost(); + list.add(SecurityEventType.VISITOR_REGISTER); + list.add(SecurityEventType.VISITOR_CHECKOUT); + list.add(SecurityEventType.HIGH_ALTITUDE_PARABOLIC); +// InetAddress localHost = InetAddress.getLocalHost(); eventSubscribeRequest.setEventTypes(list); - eventSubscribeRequest.setEventDest("https://" + localHost + ":" + serverPort + "/eventRcv"); + eventSubscribeRequest.setEventDest("http://" + "192.168.10.6" + ":" + serverPort + "/eventRcv"); //订阅类型,0-订阅原始事件,1-联动事件,2-原始事件和联动事件,不填使用默认值0 eventSubscribeRequest.setSubType(0); /** @@ -92,19 +103,25 @@ } /** + * 查询事件订阅信息 + */ + @PostMapping("/hik/event/query") + @ResponseBody + public Object eventQuery() { + String result = HikUtil.hikApi(HikUri.EVENT_INFO, ""); + return result; + } + + /** * 海康事件接收 */ @PostMapping("/eventRcv") @ResponseBody public Object eventRcv(@RequestBody HikRecvEvent hikRecvEvent) { //1、接收所需事件类型 - Long eventType = hikRecvEvent.getEventType(); + Number eventType = hikRecvEvent.getEventType(); log.info("接收到安防事件类型为:{}", eventType); CaseInfo caseInfo = caseInfoFactoryUtil.getCaseInfo(eventType); - //接收到不关心事件直接返回 - if(Objects.isNull(caseInfo)){ - return ResponseData.success(); - } //2、不同事件不同处理,caseInfoFactoryUtil已设置好事件基础定义信息 // 再为事件添加状态、设备编码、设备名称、位置、区域、时间 // 异步处理事件 @@ -114,19 +131,23 @@ caseHandle(hikRecvEvent, eventType, caseInfo); } })); +// caseHandle(hikRecvEvent, eventType, caseInfo); - return null; + return ResponseData.success(); } - private void caseHandle(HikRecvEvent hikRecvEvent, Long eventType, CaseInfo caseInfo) { + private void caseHandle(HikRecvEvent hikRecvEvent, Number eventType, CaseInfo caseInfo) { JSONArray eventArray = hikRecvEvent.getEventArray(); List caseInfos = new ArrayList<>(); - while (eventArray.stream().iterator().hasNext()) { + Iterator iterator = eventArray.iterator(); + while (iterator.hasNext()) { CaseInfo caseInfo1 = new CaseInfo(); - BeanUtils.copyProperties(caseInfo, caseInfo1); - JSONObject event = (JSONObject) eventArray.stream().iterator().next(); + if(!Objects.isNull(caseInfo)){ + BeanUtils.copyProperties(caseInfo, caseInfo1); + } + JSONObject event = (JSONObject) iterator.next(); //5种事件进行不同处理 - if(SecurityEventType.KEY_PERSONNEL_IDENTIFY_EVENT == eventType){ + if (SecurityEventType.KEY_PERSONNEL_IDENTIFY_EVENT.equals(eventType)) { //判断所属人脸分组 JSONObject data = (JSONObject) event.get("data"); JSONObject faceRecognitionResult = (JSONObject) data.get("faceRecognitionResult"); @@ -142,52 +163,101 @@ if (faceGroupCode.equals(blackListGroup.getFaceGroupCode())) { //黑名单分组处理 caseInfo1 = hikService.blackListHandle(event, caseInfo1); - }else if(faceGroupCode.equals(propertyPersonnelGroup.getFaceGroupCode())){ + } else if (faceGroupCode.equals(propertyPersonnelGroup.getFaceGroupCode())) { //考勤分组处理-物业人员,添加到考勤表 hikService.propertyAttendanceHandle(event); - }else if(faceGroupCode.equals(securityPersonnelGroup.getFaceGroupCode())){ + } else if (faceGroupCode.equals(securityPersonnelGroup.getFaceGroupCode())) { //考勤分组处理-安保人员,添加到考勤表 hikService.securityPersonnelHandle(event); - }else { + } else { return; } - }else if(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT == eventType){ + } else if (SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT.equals(eventType)) { //离岗事件处理 caseInfo1 = hikService.demobilizedHandle(event, caseInfo1); - }else if(SecurityEventType.PERSONNEL_GATHER_EVENT == eventType){ + } else if (SecurityEventType.PERSONNEL_GATHER_EVENT.equals(eventType)) { //人员聚集事件处理 caseInfo1 = hikService.personGatherHandle(event, caseInfo1); - }else if(SecurityEventType.MONITORING_POINT_OFFLINE == eventType){ + } else if (SecurityEventType.MONITORING_POINT_OFFLINE.equals(eventType)) { //监控点离线事件处理 caseInfo1 = hikService.monitorPointOfflineHandle(event, caseInfo1); - }else if(SecurityEventType.DEVICE_OFFLINE == eventType){ + } else if (SecurityEventType.MONITORING_POINT_ONLINE.equals(eventType)) { + //监控点上线事件处理 + hikService.monitorPointOnlineHandle(event); + } else if (SecurityEventType.DEVICE_OFFLINE.equals(eventType)) { //装置离线事件处理 caseInfo1 = hikService.deviceOfflineHandle(event, caseInfo1); - }else if(SecurityEventType.VISITOR_REGISTER == eventType){ + } else if (SecurityEventType.DEVICE_ONLINE.equals(eventType)) { + //装置上线处理 + hikService.deviceOnlineHandle(event); + } else if (SecurityEventType.VISITOR_REGISTER.equals(eventType)) { //记录访客登记记录,添加到访客记录表 hikService.visitorRegisterHandler(event); - }else if(SecurityEventType.VISITOR_CHECKOUT == eventType){ + } else if (SecurityEventType.VISITOR_CHECKOUT.equals(eventType)) { //记录访客签离记录 hikService.visitorCheckOutHandler(event); } - if(!Objects.isNull(caseInfo1) && !StringUtils.isEmpty(caseInfo1.getHappenTime())){ + if (!Objects.isNull(caseInfo1) && !StringUtils.isEmpty(caseInfo1.getHappenTime())) { caseInfos.add(caseInfo1); } } //3、安防事件入库 - if(!caseInfoService.insertCaseInfoBatch(caseInfos)){ - log.error("安防事件批量入库异常"); + if (!CollectionUtils.isEmpty(caseInfos) && !caseInfoService.insertCaseInfoBatch(caseInfos)) { + log.error("安防事件批量入库异常!"); } // TODO: 2022/8/15 webSocket推送 + if (CollectionUtils.isEmpty(caseInfos)) { + log.info("webSocket事件推送"); + webSocket.sendAllMessage(JSONObject.toJSONString(caseInfos)); + } return; } /** + * 以图搜图,前端用于轨迹追踪 + */ + @PostMapping("/hik/search/picture") + @ResponseBody + public Object searchPictures(@RequestBody SearchPicturesRequest searchPicturesRequest) { + DateTime startDateTime = DateUtil.parse(searchPicturesRequest.getStartTime()); + DateTime endDateTime = DateUtil.parse(searchPicturesRequest.getEndTime()); + String startTime = DateUtil.format(startDateTime, "yyyy-MM-dd'T'HH:mm:ss.SSSXXX"); + String endTime = DateUtil.format(endDateTime, "yyyy-MM-dd'T'HH:mm:ss.SSSXXX"); + searchPicturesRequest.setStartTime(startTime); + searchPicturesRequest.setEndTime(endTime); + String body = JSONObject.toJSONString(searchPicturesRequest); + String resultStr = HikUtil.hikApi(HikUri.SEARCH_PICTURES, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (!"0".equals(resultJson.get("code"))) { + log.error("请求海康,以图搜图失败,海康response:{}", resultStr); + return ResponseData.error("以图搜图失败"); + } + return ResponseData.success(resultJson); + } + + + /** + * 海康事件取消订阅 + */ + @PostMapping("/hik/event/cancel") + @ResponseBody + public Object eventCancelSubscribe(@RequestBody CancelSubscribeRequest cancelSubscribeRequest) { + String body = JSONObject.toJSONString(cancelSubscribeRequest); + String resultStr = HikUtil.hikApi(HikUri.EVENT_CANCEL, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (!"0".equals(resultJson.get("code"))) { + log.error("请求海康,取消订阅失败,海康response:{}", resultStr); + return ResponseData.error("取消订阅失败"); + } + return ResponseData.success(resultJson); + } + + /** * 单个添加海康人脸分组 * api->hik单个添加人脸分组api->response->mysql */ - @PostMapping("/faceGroup/single/add") + @PostMapping("/hik/faceGroup/single/add") @ResponseBody public Object faceGroupAddition(@RequestBody FaceGroupAdditionRequest faceGroupAdditionRequest) { String body = JSONObject.toJSONString(faceGroupAdditionRequest); @@ -212,7 +282,7 @@ * 批量添加海康组织 * api->hik批量添加组织api->response */ - @PostMapping("/org/batch/add") + @PostMapping("/hik/org/batch/add") @ResponseBody public Object orgBatchAdd(@RequestBody List orgBatchAddRequest) { String body = JSONObject.toJSONString(orgBatchAddRequest); @@ -232,4 +302,62 @@ return ResponseData.error("批量添加组织失败"); } + /** + * 获取人员列表 + */ + @PostMapping("/hik/person/personList") + @ResponseBody + public Object personList() { + PersonListRequest request = new PersonListRequest(); + request.setPageNo(1); + request.setPageSize(100); + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi("/api/resource/v2/person/personList", body); + return resultStr; + } + + /** + * 获取组织列表 + */ + @PostMapping("/hik/org/orgList") + @ResponseBody + public Object orgList() { + PersonListRequest request = new PersonListRequest(); + request.setPageNo(1); + request.setPageSize(100); + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi("/api/resource/v1/org/orgList", body); + return resultStr; + } + + /** + * 查询访客权限下载记录 + */ + @PostMapping("/hik/auth/result") + @ResponseBody + public Object authResult() { + PersonListRequest request = new PersonListRequest(); + request.setPageNo(1); + request.setPageSize(100); + request.setOrderId("ba101db6246711edaea66f7939a13638"); + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi("/api/visitor/v1/auth/result", body); + return resultStr; + } + + /** + * 人脸图片获取 + */ + @PostMapping("/hik/face/picture") + @ResponseBody + public Object facePicture() { + FaceRequest request = new FaceRequest(); +// List list = new ArrayList<>(); +// list.add(""); + request.setCertificateNum("wanggong"); + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi("/api/frs/v1/face", body); + return resultStr; + } + } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/AssetInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/AssetInfoMapper.java index 4f64e83..c0684ee 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/AssetInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/AssetInfoMapper.java @@ -17,6 +17,6 @@ @Mapper public interface AssetInfoMapper extends BaseMapper { - List getAssetInfoListPage(@Param("page") Page page, AssetInfoRequest assetInfoRequest); + List getAssetInfoListPage(@Param("page") Page page, @Param("assetInfoRequest") AssetInfoRequest assetInfoRequest); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/AttendanceInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/AttendanceInfoMapper.java index f9e793e..ec87e46 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/AttendanceInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/AttendanceInfoMapper.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.statistics.AttendanceNumberDTO; import com.casic.missiles.modular.dto.statistics.AttendanceRatioDTO; import com.casic.missiles.modular.model.AttendanceInfo; import org.apache.ibatis.annotations.Mapper; @@ -17,7 +18,7 @@ */ @Mapper public interface AttendanceInfoMapper extends BaseMapper { - List getAttendanceInfoListPage(@Param("page") Page page, StaffInfoRequest attendanceInfoRequest); + List getAttendanceInfoListPage(@Param("page") Page page, @Param("attendanceInfoRequest") StaffInfoRequest attendanceInfoRequest); AttendanceInfo selectByCodeAndDate(@Param("staffCode") String staffCode); @@ -26,4 +27,8 @@ List getCountByTypeAndDateForMonth(@Param("staffType")String staffType); List getCountByTypeAndDateForYear(@Param("staffType")String staffType); + + List getCountForWeek(); + + List getCountForDay(); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java index ce94b8f..6137a7d 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java @@ -17,5 +17,5 @@ @Mapper public interface BlackInfoMapper extends BaseMapper { - List getBlackInfoListPage(@Param("page") Page page, BlackInfoRequest blackInfoRequest); + List getBlackInfoListPage(@Param("page") Page page, @Param("blackInfoRequest") BlackInfoRequest blackInfoRequest); } 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 efda6b3..50aaa6f 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 @@ -20,7 +20,7 @@ List getCaseInfoListPage(@Param("page") Page page, @Param("caseInfoRequest") CaseInfoRequest caseInfoRequest); - int updateStatusById(CaseInfoRequest caseInfoRequest); + int updateStatusById(@Param("caseInfoRequest") CaseInfoRequest caseInfoRequest); List selectByLevelAndMonth(@Param("year") String year); @@ -47,4 +47,20 @@ List selectPreWeekCountByThirtyDay(); List selectPreDayCountBySevenDay(); + + Integer selectDemobilizedCount(@Param("eventType") Number personnelDemobilizedEvent); + + List selectPreMonthCount(); + + List selectListBySevenDay(); + + List selectListByToday(); + + List selectListByToday2(); + + List selectListByToday3(); + + List selectListByType(@Param("eventType") Number eventType); + + List selectDemobilizedCountByHour(@Param("eventType") Number eventType); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/CategoryLevelMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/CategoryLevelMapper.java index 52fc714..afe1650 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/CategoryLevelMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/CategoryLevelMapper.java @@ -17,9 +17,9 @@ @Mapper public interface CategoryLevelMapper extends BaseMapper { - List getCaseCategoryLevelListPage(@Param("page") Page page, CategoryLevelRequest categoryLevelRequest); + List getCaseCategoryLevelListPage(@Param("page") Page page, @Param("categoryLevelRequest") CategoryLevelRequest categoryLevelRequest); - List getCaseCategoryLevelList(CategoryLevelRequest categoryLevelRequest); + List getCaseCategoryLevelList(@Param("categoryLevelRequest") CategoryLevelRequest categoryLevelRequest); CaseCategoryLevel getCaseCategoryLevel(@Param("categoryLevelCode") String categoryLevelCode); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/BlackListController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/BlackListController.java index a27f9f8..0c06661 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/BlackListController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/BlackListController.java @@ -1,13 +1,18 @@ package com.casic.missiles.modular.controller; +import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.base.controller.ExportController; import com.casic.missiles.core.page.PageFactory; import com.casic.missiles.model.response.ResponseData; import com.casic.missiles.modular.dto.BlackInfoRequest; +import com.casic.missiles.modular.dto.BlackPictureRequest; +import com.casic.missiles.modular.dto.hik.PersonInfoRequest; +import com.casic.missiles.modular.enums.HikUri; import com.casic.missiles.modular.enums.OperateTypeEnum; import com.casic.missiles.modular.model.BlackInfo; import com.casic.missiles.modular.service.BlackInfoService; +import com.casic.missiles.modular.util.HikUtil; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; @@ -56,4 +61,22 @@ return null; } + /** + * 黑名单人员照片 + */ + @PostMapping("/personPicture") + @ResponseBody + public Object personPicture(@RequestBody BlackPictureRequest blackPictureRequest){ + //获取照片 + String picUri = blackPictureRequest.getPicUri(); + String serverIndexCode = blackPictureRequest.getServerIndexCode(); + PersonInfoRequest picRequest = new PersonInfoRequest(); + picRequest.setPicUri(picUri); + picRequest.setServerIndexCode(serverIndexCode); + String reBody = JSONObject.toJSONString(picRequest); + //重定向地址获取 + String url = HikUtil.hikApiFor302(HikUri.PERSON_PICTURE, reBody); + return ResponseData.success(url); + } + } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/DeviceController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/DeviceController.java index e1c4eba..666bbee 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/DeviceController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/DeviceController.java @@ -107,7 +107,7 @@ } /** - * 设备维修管理查询(分页),需计算MTTR=总维修时间/故障次数 + * 设备状态计算与评判/设备维修管理查询(分页),需计算MTTR=总维修时间/故障次数 */ @PostMapping("/repair/listPage") @ResponseBody @@ -211,7 +211,7 @@ //需根据设备编号获取到对应的门禁点唯一标识 doorControlRequest.setDoorIndexCodes(indexCodes); doorControlRequest.setControlType(Integer.valueOf(gateGroupDTO.getStatus())); - String body = JSONObject.toJSONString(deviceCodes); + String body = JSONObject.toJSONString(doorControlRequest); String resultStr = HikUtil.hikApi(HikUri.DOOR_CONTROL, body); JSONObject resultJson = (JSONObject)JSONObject.parse(resultStr); if (!"0".equals(resultJson.get("code"))) { diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/StaffController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/StaffController.java index b58ccab..704093c 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/StaffController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/StaffController.java @@ -2,15 +2,21 @@ import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.util.StrUtil; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.base.controller.ExportController; import com.casic.missiles.core.page.PageFactory; import com.casic.missiles.model.response.ErrorResponseData; import com.casic.missiles.model.response.ResponseData; import com.casic.missiles.modular.dto.StaffInfoRequest; +import com.casic.missiles.modular.dto.hik.PersonInfoRequest; +import com.casic.missiles.modular.dto.hik.StaffCardRequest; +import com.casic.missiles.modular.enums.HikUri; import com.casic.missiles.modular.enums.OperateTypeEnum; import com.casic.missiles.modular.model.StaffInfo; import com.casic.missiles.modular.service.StaffInfoService; +import com.casic.missiles.modular.util.HikUtil; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; @@ -110,4 +116,60 @@ } return ResponseData.success(); } + + /** + * 批量开卡,添加人员之后调用,若在一个接口中添加人员成功开卡失败则第二次添加时会有问题 + */ + @PostMapping("/cardBinding") + @ResponseBody + public Object cardBinding(@RequestBody StaffCardRequest staffCardRequest) { + String body = JSONObject.toJSONString(staffCardRequest); + String resultStr = HikUtil.hikApi(HikUri.CARD_BINDING, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (!"0".equals(resultJson.get("code"))) { + log.error("请求海康,批量开卡失败,海康response:{}", resultStr); + return ResponseData.error("批量开卡失败"); + } + //保存卡号 + if(staffInfoService.saveCardInfo(staffCardRequest) > 0){ + return ResponseData.success(); + } + return ResponseData.error("批量开卡失败"); + } + + /** + * 获取员工照片,海康存储 + */ + @PostMapping("/personPicture/{staffCode}") + @ResponseBody + public Object personPicture(@PathVariable("staffCode") String staffCode){ + //获取员工详细信息,含图片服务器、uri + PersonInfoRequest request = new PersonInfoRequest(); + List list = new ArrayList<>(); + list.add(staffCode); + request.setParamName("personId"); + request.setParamValue(list); + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi(HikUri.PERSON_INFO, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (!"0".equals(resultJson.get("code"))) { + log.error("请求海康,根据人员唯一字段获取人员详细信息失败,海康response:{}", resultStr); + return ResponseData.error("获取员工照片失败"); + } + //获取照片 + JSONObject data = (JSONObject) resultJson.get("data"); + JSONArray dataArray = (JSONArray) data.get("list"); + JSONObject jsonObject = (JSONObject) dataArray.get(0); + JSONArray personPhoto = (JSONArray) jsonObject.get("personPhoto"); + JSONObject photo = (JSONObject) personPhoto.get(0); + String picUri = photo.getString("picUri"); + String serverIndexCode = photo.getString("serverIndexCode"); + PersonInfoRequest picRequest = new PersonInfoRequest(); + picRequest.setPicUri(picUri); + picRequest.setServerIndexCode(serverIndexCode); + String reBody = JSONObject.toJSONString(picRequest); + //重定向地址获取 + String url = HikUtil.hikApiFor302(HikUri.PERSON_PICTURE, reBody); + return ResponseData.success(url); + } } 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 4a07dd9..7b1dcf6 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 @@ -16,6 +16,7 @@ import com.casic.missiles.modular.redis.key.CacheKeys; import com.casic.missiles.modular.service.CockpitService; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.util.CollectionUtils; import org.springframework.web.bind.annotation.*; @@ -24,10 +25,7 @@ import java.text.NumberFormat; import java.time.LocalDateTime; import java.time.temporal.ChronoUnit; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.util.*; import java.util.stream.Collectors; /** @@ -73,6 +71,9 @@ private StatisticNumberMapper numberMapper; @Autowired + private HazardLevelMapper hazardLevelMapper; + + @Autowired private AccessGroupConfig accessGroupConfig; /** @@ -104,8 +105,24 @@ public Object buildingNumberPerHour(){ //当天按小时分组的人数 List list = numberMapper.selectListByTime(); - Map> collect = list.stream().collect(Collectors.groupingBy(BuildingNumberDTO::getStatisticPosition)); - return ResponseData.success(collect); + Map> collect = list.stream().collect(Collectors.groupingBy(BuildingNumberDTO::getStatisticTime)); + //定时任务中已将每小时三栋楼人数存到数据库 + //将一期主楼和录制楼人数合并,二期单算 + List> resultList = new ArrayList<>(); + collect.keySet().forEach(key -> { + List buildingNumberDTOS = collect.get(key); + BuildingNumberDTO mainBuildingOne = buildingNumberDTOS.get(0); + BuildingNumberDTO mainBuildingTwo = buildingNumberDTOS.get(1); + BuildingNumberDTO recordingBuilding = buildingNumberDTOS.get(2); + HashMap resultMap = new HashMap<>(); + Integer oneQuantity = Integer.valueOf(mainBuildingOne.getStatisticQuantity()); + Integer recordingQuantity = Integer.valueOf(recordingBuilding.getStatisticQuantity()); + resultMap.put("staticTime", mainBuildingOne.getStatisticTime()); + resultMap.put(mainBuildingOne.getStatisticPositionName()+"、"+recordingBuilding.getStatisticPositionName(), String.valueOf(oneQuantity+recordingQuantity)); + resultMap.put(mainBuildingTwo.getStatisticPositionName(), mainBuildingTwo.getStatisticQuantity()); + resultList.add(resultMap); + }); + return ResponseData.success(resultList); } /** @@ -151,12 +168,11 @@ public Object securityNumber() { QueryWrapper wrapper = new QueryWrapper<>(); wrapper.eq("staff_type", 2); + // TODO: 2022/9/2 后续使用产品确定的每天出勤的安保人员的数量 Integer total = staffInfoMapper.selectCount(wrapper); - //当日离岗事件个数 - QueryWrapper wrapper1 = new QueryWrapper<>(); - wrapper1.eq("hik_event_type", SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); - wrapper1.apply("date_format(now(),'%Y-%m-%d') = date_format(happen_time,'%Y-%m-%d')"); - Integer leave = caseInfoMapper.selectCount(wrapper1); + //当日离岗事件按设备去重后的个数 + // TODO: 2022/9/2 目前相当于24小时内的计算,之后看需要可改成自定义小时数计算离岗率,即离岗+6小时内仅一次离岗则恢复为100%,多次则累加离岗次数计算离岗率 + Integer leave = caseInfoMapper.selectDemobilizedCount(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); NumberFormat numberFormat = NumberFormat.getInstance(); // 设置精确到小数点后2位 numberFormat.setMaximumFractionDigits(2); @@ -179,7 +195,6 @@ @ResponseBody public Object visitorApplyDetail() { List reasonGroup = applyMapper.selectByVisitReason(); - HashMap resultMap = new HashMap<>(); NumberFormat numberFormat = NumberFormat.getInstance(); // 设置精确到小数点后2位 numberFormat.setMaximumFractionDigits(2); @@ -187,12 +202,17 @@ if(0 == sum){ return ResponseData.success(); } + List resultList = new ArrayList<>(); reasonGroup.forEach(group -> { String reasonName = dictService.getDictNameByCode(SecurityEventDict.VISIT_REASON, group.getVisitReason()); String result = numberFormat.format((float) group.getQuantity() / (float) sum * 100); - resultMap.put(reasonName, result+"%"); + ApplyReasonGroupDTO applyReasonGroupDTO = new ApplyReasonGroupDTO(); + applyReasonGroupDTO.setQuantity(group.getQuantity()); + applyReasonGroupDTO.setVisitReason(reasonName); + applyReasonGroupDTO.setRatio(result+"%"); + resultList.add(applyReasonGroupDTO); }); - return ResponseData.success(resultMap); + return ResponseData.success(resultList); } /** @@ -247,6 +267,32 @@ } /** + * 机动力量实时在岗率,在岗人数除以总应在岗人数,用离岗+6小时内恢复为100%,6小时外再计算 + */ + @GetMapping("/staff/beOnDutyRatio") + @ResponseBody + public Object beOnDutyRatio() { + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("staff_type", 2); + // TODO: 2022/9/2 后续使用产品确定的每天出勤的安保人员的数量 + Integer total = staffInfoMapper.selectCount(wrapper); + if(0 == total){ + return ResponseData.success(null); + } + //当日离岗事件按设备去重后的个数 + // TODO: 2022/9/2 目前相当于24小时内的计算,之后看需要可改成自定义小时数计算离岗率,即离岗+6小时内仅一次离岗则恢复为100%,多次则累加离岗次数计算离岗率 + List onDutyRatioDTOS = caseInfoMapper.selectDemobilizedCountByHour(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); + onDutyRatioDTOS.forEach(dto -> { + NumberFormat numberFormat = NumberFormat.getInstance(); + // 设置精确到小数点后2位 + numberFormat.setMaximumFractionDigits(2); + String result = numberFormat.format(100 - Float.valueOf(dto.getQuantity()) / (float) total * 100); + dto.setRatio(result+"%"); + }); + return ResponseData.success(onDutyRatioDTOS); + } + + /** * 闸机速通门统计-设备状态分组计算数量,devType传闸机字典key * 视频频监控摄像机统计-设备状态分组计算数量,devType传摄像头字典key */ @@ -262,12 +308,17 @@ if(sum <= 0){ return ResponseData.error("无该类设备信息"); } + List resultList = new ArrayList<>(); gateStatusGroup.forEach(group -> { String devStatus = dictService.getDictNameByCode(SecurityEventDict.DEVICE_STATUS, group.getStatus()); String result = numberFormat.format((float) group.getQuantity() / (float) sum * 100); - resultMap.put(devStatus, result+"%"); + GateStatusGroupResponse gateStatusGroupResponse = new GateStatusGroupResponse(); + gateStatusGroupResponse.setStatus(devStatus); + gateStatusGroupResponse.setRatio(result+"%"); + resultList.add(gateStatusGroupResponse); }); - resultMap.put("总", sum); + resultMap.put("total", sum); + resultMap.put("list", resultList); return ResponseData.success(resultMap); } @@ -282,17 +333,38 @@ String position = securityScoreDTO.getPosition(); List caseInfos = caseInfoMapper.selectByPosition(position); //查询各危险级别权重、各类别权重,放入map,避免循环中多次查数据库 - + HashMap hazardScoreMap = new HashMap<>(); + List caseHazardLevelList = hazardLevelMapper.getCaseHazardLevelList(null); + caseHazardLevelList.forEach(hazardLevel -> { + hazardScoreMap.put(hazardLevel.getCode(), hazardLevel.getWeight()); + }); + HashMap categoryScoreMap = new HashMap<>(); + List categoryLevelList = categoryLevelMapper.getCaseCategoryLevelList(null); + categoryLevelList.forEach(categoryLevel -> { + categoryScoreMap.put(categoryLevel.getCode(), categoryLevel.getWeight()); + }); + //事件按楼层分组,计算 List securityScoreDTOs = new ArrayList<>(); caseInfos.forEach(caseInfo -> { SecurityScoreDTO securityScoreDTO1 = new SecurityScoreDTO(); + securityScoreDTO1.setPosition(caseInfo.getPosition()); securityScoreDTO1.setArea(caseInfo.getArea()); - // TODO: 2022/8/4 楼层评分计算根据产品定义调整 -// caseInfo.get -// securityScoreDTO1.setScore(); + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); + Double score = 100 - Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + securityScoreDTO1.setScore(score); + securityScoreDTOs.add(securityScoreDTO1); }); - - return null; + 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); + }); + return ResponseData.success(securityScoreDTOs); } /** @@ -303,9 +375,13 @@ public Object SecurityFrequency(@RequestBody SecurityFrequencyDTO securityFrequencyDTO) { String year = securityFrequencyDTO.getYear(); String month = securityFrequencyDTO.getMonth(); - Integer quantity = caseInfoMapper.selectCountByMonth(year, month); - securityFrequencyDTO.setQuantity(quantity); - return ResponseData.success(securityFrequencyDTO); + if(!StringUtils.isEmpty(year) && StringUtils.isEmpty(month)){ + Integer quantity = caseInfoMapper.selectCountByMonth(year, month); + securityFrequencyDTO.setQuantity(quantity); + return ResponseData.success(securityFrequencyDTO); + } + List list = caseInfoMapper.selectPreMonthCount(); + return ResponseData.success(list); } } 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 ae4d770..f4f075c 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 @@ -1,20 +1,25 @@ package com.casic.missiles.modular.controller.cockpit; +import cn.hutool.core.date.DateUnit; import cn.hutool.core.date.DateUtil; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.casic.missiles.model.response.ResponseData; -import com.casic.missiles.modular.dao.AttendanceInfoMapper; -import com.casic.missiles.modular.dao.CaseInfoMapper; -import com.casic.missiles.modular.dao.HazardLevelMapper; -import com.casic.missiles.modular.dao.StaffInfoMapper; +import com.casic.missiles.modular.dao.*; +import com.casic.missiles.modular.dto.DeviceRepairLogDTO; +import com.casic.missiles.modular.dto.DeviceRepairRequest; import com.casic.missiles.modular.dto.statistics.*; +import com.casic.missiles.modular.enums.SecurityEventType; +import com.casic.missiles.modular.model.CaseCategoryLevel; import com.casic.missiles.modular.model.CaseHazardLevel; +import com.casic.missiles.modular.model.CaseInfo; import com.casic.missiles.modular.model.StaffInfo; +import com.casic.missiles.modular.service.DeviceInfoService; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.util.CollectionUtils; import org.springframework.web.bind.annotation.*; +import java.math.BigDecimal; import java.text.NumberFormat; import java.util.*; import java.util.stream.Collectors; @@ -40,6 +45,12 @@ @Autowired private HazardLevelMapper hazardLevelMapper; + @Autowired + private CategoryLevelMapper categoryLevelMapper; + + @Autowired + private DeviceInfoService deviceInfoService; + /** * 安防事件时域频次统计,每月的每天安防事件个数(原方案) * 月维度:展示每个月的每天的数据 @@ -89,15 +100,17 @@ List monthList = caseInfoMapper.selectPreMonthCountByYear(year); Map> collect = monthList.stream().collect(Collectors.groupingBy(PreMonthOrWeekCaseDTO::getHazardLevelCode)); HashMap strAvgMap = new HashMap<>(); + List resultList = new ArrayList<>(); for (String key : collect.keySet()) { List preMonthOrWeekCaseDTOS = collect.get(key); int sum = preMonthOrWeekCaseDTOS.stream().mapToInt(PreMonthOrWeekCaseDTO::getQuantity).sum(); //若年份是本年,则使用个安防级别数量/当前月份数 //若不是本年,除数为12 MonthAndWeekDTO monthAndWeekDTO = new MonthAndWeekDTO(); + String hazardName = hazardLevelMapper.selectHazardNameByCode(key); + monthAndWeekDTO.setLevelName(hazardName); if(year.equals(String.valueOf(DateUtil.thisYear()))){ monthAndWeekDTO.setMonthQuantity(sum / DateUtil.thisMonth()); -// monthAndWeekDTO.setLevelName(); strAvgMap.put(key, monthAndWeekDTO); }else{ monthAndWeekDTO.setMonthQuantity(sum / 12); @@ -113,27 +126,37 @@ if(year.equals(String.valueOf(DateUtil.thisYear()))){ if(!Objects.isNull(strAvgMap.get(key))){ MonthAndWeekDTO monthAndWeekDTO = strAvgMap.get(key); + String hazardName = hazardLevelMapper.selectHazardNameByCode(key); + monthAndWeekDTO.setLevelName(hazardName); monthAndWeekDTO.setWeekQuantity(sum / DateUtil.thisWeekOfYear()); strAvgMap.put(key, monthAndWeekDTO); }else{ MonthAndWeekDTO monthAndWeekDTO = new MonthAndWeekDTO(); + String hazardName = hazardLevelMapper.selectHazardNameByCode(key); + monthAndWeekDTO.setLevelName(hazardName); monthAndWeekDTO.setWeekQuantity(sum / DateUtil.thisWeekOfYear()); strAvgMap.put(key, monthAndWeekDTO); } }else{ if(!Objects.isNull(strAvgMap.get(key))){ MonthAndWeekDTO monthAndWeekDTO = strAvgMap.get(key); + String hazardName = hazardLevelMapper.selectHazardNameByCode(key); + monthAndWeekDTO.setLevelName(hazardName); monthAndWeekDTO.setWeekQuantity(sum / 52); strAvgMap.put(key, monthAndWeekDTO); }else{ MonthAndWeekDTO monthAndWeekDTO = new MonthAndWeekDTO(); + String hazardName = hazardLevelMapper.selectHazardNameByCode(key); + monthAndWeekDTO.setLevelName(hazardName); monthAndWeekDTO.setWeekQuantity(sum / 52); strAvgMap.put(key, monthAndWeekDTO); } } } - avgMonthAndWeekGroupDTO.setMap(strAvgMap); - return ResponseData.success(avgMonthAndWeekGroupDTO); + strAvgMap.keySet().forEach(key -> { + resultList.add(strAvgMap.get(key)); + }); + return ResponseData.success(resultList); } /** @@ -181,12 +204,178 @@ } /** - * 员工考勤人数变化,功能待定 + * 员工考勤人数变化,统计当天(横坐标为时)及近7天(横坐标为天)的考勤人数变化,只要发生一次考勤识别,次数的基数就正常增加(没有上班下班区分) */ + @PostMapping("/staff/attendanceNumber/{dimension}") + @ResponseBody + public Object attendanceNumber(@PathVariable("dimension") String dimension) { + List attendanceNumberDTOs = null; + List> resultList = new ArrayList<>(); + if("week".equals(dimension)){ + //近7天数据按天分组统计 + attendanceNumberDTOs = attendanceInfoMapper.getCountForWeek(); + }else if("day".equals(dimension)) { + //今天数据按小时分组统计 + attendanceNumberDTOs = attendanceInfoMapper.getCountForDay(); + } + if(CollectionUtils.isEmpty(attendanceNumberDTOs)){ + return ResponseData.error("该查询条件下,无员工出勤数据!"); + } + Map> collect = attendanceNumberDTOs.stream().collect(Collectors.groupingBy(AttendanceNumberDTO::getDate)); + collect.keySet().forEach(key -> { + List attendanceNumberDTOS = collect.get(key); + AttendanceNumberDTO attendanceNumberDTO = attendanceNumberDTOS.get(0); + AttendanceNumberDTO attendanceNumberDTO2 = attendanceNumberDTOS.get(1); + Map resultMap = new HashMap<>(); + resultMap.put(attendanceNumberDTO.getStaffType(), attendanceNumberDTO.getQuantity()); + resultMap.put(attendanceNumberDTO2.getStaffType(), attendanceNumberDTO2.getQuantity()); + resultMap.put("staticTime", attendanceNumberDTO.getDate()); + resultList.add(resultMap); + }); + return ResponseData.success(resultList); + } /** - * 近30天/近一周安保人员到岗排行 + * 早晚高峰区域安防评估 */ + @PostMapping("/security/assessment/{dimension}") + @ResponseBody + public Object securityAssessment(@PathVariable("dimension") String dimension) { + //查询各危险级别权重、各类别权重,放入map,避免循环中多次查数据库 + HashMap hazardScoreMap = new HashMap<>(); + List caseHazardLevelList = hazardLevelMapper.getCaseHazardLevelList(null); + caseHazardLevelList.forEach(hazardLevel -> { + hazardScoreMap.put(hazardLevel.getCode(), hazardLevel.getWeight()); + }); + HashMap categoryScoreMap = new HashMap<>(); + List categoryLevelList = categoryLevelMapper.getCaseCategoryLevelList(null); + categoryLevelList.forEach(categoryLevel -> { + categoryScoreMap.put(categoryLevel.getCode(), categoryLevel.getWeight()); + }); + HashMap hashMap = new HashMap<>(); + if("week".equals(dimension)){ + //近7天早晚高峰数据 + List caseInfos = caseInfoMapper.selectListBySevenDay(); + //按时间(天)进行分组 + caseInfos.forEach(caseInfo -> { + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); + Double score = Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + String[] array = caseInfo.getHappenTime().split(" "); + String dayTime = array[0]; + BigDecimal preScore; + if(hashMap.containsKey(dayTime)){ + Double aDouble = hashMap.get(dayTime); + preScore = new BigDecimal(aDouble.toString()); + + }else{ + preScore = new BigDecimal("100.0"); + } + BigDecimal nowScore = new BigDecimal(score.toString()); + hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); + }); + return ResponseData.success(hashMap); + }else if("day".equals(dimension)) { + //今天数据按小时分组统计 + List caseInfos = caseInfoMapper.selectListByToday(); + caseInfos.forEach(caseInfo -> { + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); + Double score = Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + String[] array = caseInfo.getHappenTime().split(":"); + String dayTime = array[0]; + BigDecimal preScore; + if(hashMap.containsKey(dayTime)){ + Double aDouble = hashMap.get(dayTime); + preScore = new BigDecimal(aDouble.toString()); + + }else{ + preScore = new BigDecimal("100.0"); + } + BigDecimal nowScore = new BigDecimal(score.toString()); + hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); + }); + return ResponseData.success(hashMap); + } + return null; + } + + /** + * 重点区域安防事态评估,统计重点区域6:00-23:00按小时分组数据 + */ + @GetMapping("/security/keyAreaStatistic") + @ResponseBody + public Object keyAreaStatistic() { + //查询各危险级别权重、各类别权重,放入map,避免循环中多次查数据库 + HashMap hazardScoreMap = new HashMap<>(); + List caseHazardLevelList = hazardLevelMapper.getCaseHazardLevelList(null); + caseHazardLevelList.forEach(hazardLevel -> { + hazardScoreMap.put(hazardLevel.getCode(), hazardLevel.getWeight()); + }); + HashMap categoryScoreMap = new HashMap<>(); + List categoryLevelList = categoryLevelMapper.getCaseCategoryLevelList(null); + categoryLevelList.forEach(categoryLevel -> { + categoryScoreMap.put(categoryLevel.getCode(), categoryLevel.getWeight()); + }); + HashMap hashMap = new HashMap<>(); + //今天数据按小时分组统计 + List caseInfos = caseInfoMapper.selectListByToday2(); + caseInfos.forEach(caseInfo -> { + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); + Double score = Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + String[] array = caseInfo.getHappenTime().split(":"); + String dayTime = array[0]; + BigDecimal preScore; + if(hashMap.containsKey(dayTime)){ + Double aDouble = hashMap.get(dayTime); + preScore = new BigDecimal(aDouble.toString()); + + }else{ + preScore = new BigDecimal("100.0"); + } + BigDecimal nowScore = new BigDecimal(score.toString()); + hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); + }); + return ResponseData.success(hashMap); + } + + /** + * 安防机动支援力量调配响应评估,根据事件已解决状态及已解决时间-发送时间,按时间(小时)分组统计 + */ + @GetMapping("/security/responseAssess") + @ResponseBody + public Object responseAssess() { + //查询各危险级别权重、各类别权重,放入map,避免循环中多次查数据库 + HashMap hazardScoreMap = new HashMap<>(); + List caseHazardLevelList = hazardLevelMapper.getCaseHazardLevelList(null); + caseHazardLevelList.forEach(hazardLevel -> { + hazardScoreMap.put(hazardLevel.getCode(), hazardLevel.getWeight()); + }); + HashMap hashMap = new HashMap<>(); + //今天数据按小时分组统计 + List caseInfos = caseInfoMapper.selectListByToday3(); + caseInfos.forEach(caseInfo -> { + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + //扣分=事件级别权重*未解决小时数 + Date updateTime = DateUtil.parse(caseInfo.getUpdateTime()); + Date happenTime = DateUtil.parse(caseInfo.getHappenTime()); + long between = DateUtil.between(updateTime, happenTime, DateUnit.HOUR); + Double score = Double.valueOf(hazardWeight)*between; + String[] array = caseInfo.getHappenTime().split(":"); + String dayTime = array[0]; + BigDecimal preScore; + if(hashMap.containsKey(dayTime)){ + Double aDouble = hashMap.get(dayTime); + preScore = new BigDecimal(aDouble.toString()); + }else{ + preScore = new BigDecimal("100.0"); + } + BigDecimal nowScore = new BigDecimal(score.toString()); + hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); + }); + return ResponseData.success(hashMap); + } /** * 重点区域威胁事件类型统计,优先级2,统计近7天和近30天 @@ -224,7 +413,34 @@ } /** - * 设备状态计算系数和评判,优先级3,需确认设备恢复时间是否可以获取 + * 近30天/近一周安保人员到岗排行 */ + + /** + * 安保等级评估,发生离岗事件减1分 + */ + @GetMapping("/security/levelAssess") + @ResponseBody + public Object securityLevelAssess() { + //今天数据按小时分组统计 + List resultList = caseInfoMapper.selectListByType(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); + resultList.forEach(result -> { + BigDecimal deScore = new BigDecimal(result.getQuantity()); + BigDecimal preScore = new BigDecimal("100.0"); + result.setScore(preScore.subtract(deScore).doubleValue()); + }); + return ResponseData.success(resultList); + } + + /** + * 设备状态计算系数和评判,即设备维修管理查询(不分页) + */ + @PostMapping("/device/repairList") + @ResponseBody + public Object repairList(@RequestBody DeviceRepairRequest deviceRepairRequest) { + List deviceRepairLogDTOS = deviceInfoService.deviceRepairListPage(deviceRepairRequest); + return ResponseData.success(deviceRepairLogDTOS); + } + } 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 fbf8ab6..c71a15a 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 @@ -1,13 +1,12 @@ package com.casic.missiles.modular.controller.hik; +import cn.hutool.core.date.DateTime; +import cn.hutool.core.date.DateUtil; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.casic.missiles.model.response.ResponseData; import com.casic.missiles.modular.dao.HikFaceGroupInfoMapper; -import com.casic.missiles.modular.dto.hik.EventSubscribeRequest; -import com.casic.missiles.modular.dto.hik.FaceGroupAdditionRequest; -import com.casic.missiles.modular.dto.hik.HikRecvEvent; -import com.casic.missiles.modular.dto.hik.OrgBatchAdd; +import com.casic.missiles.modular.dto.hik.*; import com.casic.missiles.modular.enums.HikUri; import com.casic.missiles.modular.enums.SecurityEventType; import com.casic.missiles.modular.model.CaseInfo; @@ -18,16 +17,20 @@ import com.casic.missiles.modular.util.CaseInfoFactoryUtil; import com.casic.missiles.modular.util.HikUtil; import com.casic.missiles.modular.util.ThreadPoolUtil; +import com.casic.missiles.modular.util.WebSocket; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; -import org.springframework.web.bind.annotation.*; +import org.springframework.util.CollectionUtils; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.RestController; -import java.net.InetAddress; -import java.net.UnknownHostException; import java.util.ArrayList; +import java.util.Iterator; import java.util.List; import java.util.Objects; @@ -38,7 +41,6 @@ */ @Slf4j @RestController -@RequestMapping("/hik") public class HikController { @Autowired @@ -53,28 +55,37 @@ @Autowired private HikService hikService; + @Autowired + private HikFaceGroupInfoMapper hikFaceGroupInfoMapper; + + @Autowired + private WebSocket webSocket; + @Value("${server.port}") private int serverPort; - @Autowired - private HikFaceGroupInfoMapper hikFaceGroupInfoMapper; /** * 海康事件订阅 */ - @PostMapping("/event/subscribe") + @PostMapping("/hik/event/subscribe") @ResponseBody - public Object eventSubscribe() throws UnknownHostException { + public Object eventSubscribe() { EventSubscribeRequest eventSubscribeRequest = new EventSubscribeRequest(); ArrayList list = new ArrayList<>(); list.add(SecurityEventType.DEVICE_OFFLINE); + list.add(SecurityEventType.DEVICE_ONLINE); list.add(SecurityEventType.KEY_PERSONNEL_IDENTIFY_EVENT); list.add(SecurityEventType.MONITORING_POINT_OFFLINE); + list.add(SecurityEventType.MONITORING_POINT_ONLINE); list.add(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); list.add(SecurityEventType.PERSONNEL_GATHER_EVENT); - InetAddress localHost = InetAddress.getLocalHost(); + list.add(SecurityEventType.VISITOR_REGISTER); + list.add(SecurityEventType.VISITOR_CHECKOUT); + list.add(SecurityEventType.HIGH_ALTITUDE_PARABOLIC); +// InetAddress localHost = InetAddress.getLocalHost(); eventSubscribeRequest.setEventTypes(list); - eventSubscribeRequest.setEventDest("https://" + localHost + ":" + serverPort + "/eventRcv"); + eventSubscribeRequest.setEventDest("http://" + "192.168.10.6" + ":" + serverPort + "/eventRcv"); //订阅类型,0-订阅原始事件,1-联动事件,2-原始事件和联动事件,不填使用默认值0 eventSubscribeRequest.setSubType(0); /** @@ -92,19 +103,25 @@ } /** + * 查询事件订阅信息 + */ + @PostMapping("/hik/event/query") + @ResponseBody + public Object eventQuery() { + String result = HikUtil.hikApi(HikUri.EVENT_INFO, ""); + return result; + } + + /** * 海康事件接收 */ @PostMapping("/eventRcv") @ResponseBody public Object eventRcv(@RequestBody HikRecvEvent hikRecvEvent) { //1、接收所需事件类型 - Long eventType = hikRecvEvent.getEventType(); + Number eventType = hikRecvEvent.getEventType(); log.info("接收到安防事件类型为:{}", eventType); CaseInfo caseInfo = caseInfoFactoryUtil.getCaseInfo(eventType); - //接收到不关心事件直接返回 - if(Objects.isNull(caseInfo)){ - return ResponseData.success(); - } //2、不同事件不同处理,caseInfoFactoryUtil已设置好事件基础定义信息 // 再为事件添加状态、设备编码、设备名称、位置、区域、时间 // 异步处理事件 @@ -114,19 +131,23 @@ caseHandle(hikRecvEvent, eventType, caseInfo); } })); +// caseHandle(hikRecvEvent, eventType, caseInfo); - return null; + return ResponseData.success(); } - private void caseHandle(HikRecvEvent hikRecvEvent, Long eventType, CaseInfo caseInfo) { + private void caseHandle(HikRecvEvent hikRecvEvent, Number eventType, CaseInfo caseInfo) { JSONArray eventArray = hikRecvEvent.getEventArray(); List caseInfos = new ArrayList<>(); - while (eventArray.stream().iterator().hasNext()) { + Iterator iterator = eventArray.iterator(); + while (iterator.hasNext()) { CaseInfo caseInfo1 = new CaseInfo(); - BeanUtils.copyProperties(caseInfo, caseInfo1); - JSONObject event = (JSONObject) eventArray.stream().iterator().next(); + if(!Objects.isNull(caseInfo)){ + BeanUtils.copyProperties(caseInfo, caseInfo1); + } + JSONObject event = (JSONObject) iterator.next(); //5种事件进行不同处理 - if(SecurityEventType.KEY_PERSONNEL_IDENTIFY_EVENT == eventType){ + if (SecurityEventType.KEY_PERSONNEL_IDENTIFY_EVENT.equals(eventType)) { //判断所属人脸分组 JSONObject data = (JSONObject) event.get("data"); JSONObject faceRecognitionResult = (JSONObject) data.get("faceRecognitionResult"); @@ -142,52 +163,101 @@ if (faceGroupCode.equals(blackListGroup.getFaceGroupCode())) { //黑名单分组处理 caseInfo1 = hikService.blackListHandle(event, caseInfo1); - }else if(faceGroupCode.equals(propertyPersonnelGroup.getFaceGroupCode())){ + } else if (faceGroupCode.equals(propertyPersonnelGroup.getFaceGroupCode())) { //考勤分组处理-物业人员,添加到考勤表 hikService.propertyAttendanceHandle(event); - }else if(faceGroupCode.equals(securityPersonnelGroup.getFaceGroupCode())){ + } else if (faceGroupCode.equals(securityPersonnelGroup.getFaceGroupCode())) { //考勤分组处理-安保人员,添加到考勤表 hikService.securityPersonnelHandle(event); - }else { + } else { return; } - }else if(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT == eventType){ + } else if (SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT.equals(eventType)) { //离岗事件处理 caseInfo1 = hikService.demobilizedHandle(event, caseInfo1); - }else if(SecurityEventType.PERSONNEL_GATHER_EVENT == eventType){ + } else if (SecurityEventType.PERSONNEL_GATHER_EVENT.equals(eventType)) { //人员聚集事件处理 caseInfo1 = hikService.personGatherHandle(event, caseInfo1); - }else if(SecurityEventType.MONITORING_POINT_OFFLINE == eventType){ + } else if (SecurityEventType.MONITORING_POINT_OFFLINE.equals(eventType)) { //监控点离线事件处理 caseInfo1 = hikService.monitorPointOfflineHandle(event, caseInfo1); - }else if(SecurityEventType.DEVICE_OFFLINE == eventType){ + } else if (SecurityEventType.MONITORING_POINT_ONLINE.equals(eventType)) { + //监控点上线事件处理 + hikService.monitorPointOnlineHandle(event); + } else if (SecurityEventType.DEVICE_OFFLINE.equals(eventType)) { //装置离线事件处理 caseInfo1 = hikService.deviceOfflineHandle(event, caseInfo1); - }else if(SecurityEventType.VISITOR_REGISTER == eventType){ + } else if (SecurityEventType.DEVICE_ONLINE.equals(eventType)) { + //装置上线处理 + hikService.deviceOnlineHandle(event); + } else if (SecurityEventType.VISITOR_REGISTER.equals(eventType)) { //记录访客登记记录,添加到访客记录表 hikService.visitorRegisterHandler(event); - }else if(SecurityEventType.VISITOR_CHECKOUT == eventType){ + } else if (SecurityEventType.VISITOR_CHECKOUT.equals(eventType)) { //记录访客签离记录 hikService.visitorCheckOutHandler(event); } - if(!Objects.isNull(caseInfo1) && !StringUtils.isEmpty(caseInfo1.getHappenTime())){ + if (!Objects.isNull(caseInfo1) && !StringUtils.isEmpty(caseInfo1.getHappenTime())) { caseInfos.add(caseInfo1); } } //3、安防事件入库 - if(!caseInfoService.insertCaseInfoBatch(caseInfos)){ - log.error("安防事件批量入库异常"); + if (!CollectionUtils.isEmpty(caseInfos) && !caseInfoService.insertCaseInfoBatch(caseInfos)) { + log.error("安防事件批量入库异常!"); } // TODO: 2022/8/15 webSocket推送 + if (CollectionUtils.isEmpty(caseInfos)) { + log.info("webSocket事件推送"); + webSocket.sendAllMessage(JSONObject.toJSONString(caseInfos)); + } return; } /** + * 以图搜图,前端用于轨迹追踪 + */ + @PostMapping("/hik/search/picture") + @ResponseBody + public Object searchPictures(@RequestBody SearchPicturesRequest searchPicturesRequest) { + DateTime startDateTime = DateUtil.parse(searchPicturesRequest.getStartTime()); + DateTime endDateTime = DateUtil.parse(searchPicturesRequest.getEndTime()); + String startTime = DateUtil.format(startDateTime, "yyyy-MM-dd'T'HH:mm:ss.SSSXXX"); + String endTime = DateUtil.format(endDateTime, "yyyy-MM-dd'T'HH:mm:ss.SSSXXX"); + searchPicturesRequest.setStartTime(startTime); + searchPicturesRequest.setEndTime(endTime); + String body = JSONObject.toJSONString(searchPicturesRequest); + String resultStr = HikUtil.hikApi(HikUri.SEARCH_PICTURES, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (!"0".equals(resultJson.get("code"))) { + log.error("请求海康,以图搜图失败,海康response:{}", resultStr); + return ResponseData.error("以图搜图失败"); + } + return ResponseData.success(resultJson); + } + + + /** + * 海康事件取消订阅 + */ + @PostMapping("/hik/event/cancel") + @ResponseBody + public Object eventCancelSubscribe(@RequestBody CancelSubscribeRequest cancelSubscribeRequest) { + String body = JSONObject.toJSONString(cancelSubscribeRequest); + String resultStr = HikUtil.hikApi(HikUri.EVENT_CANCEL, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (!"0".equals(resultJson.get("code"))) { + log.error("请求海康,取消订阅失败,海康response:{}", resultStr); + return ResponseData.error("取消订阅失败"); + } + return ResponseData.success(resultJson); + } + + /** * 单个添加海康人脸分组 * api->hik单个添加人脸分组api->response->mysql */ - @PostMapping("/faceGroup/single/add") + @PostMapping("/hik/faceGroup/single/add") @ResponseBody public Object faceGroupAddition(@RequestBody FaceGroupAdditionRequest faceGroupAdditionRequest) { String body = JSONObject.toJSONString(faceGroupAdditionRequest); @@ -212,7 +282,7 @@ * 批量添加海康组织 * api->hik批量添加组织api->response */ - @PostMapping("/org/batch/add") + @PostMapping("/hik/org/batch/add") @ResponseBody public Object orgBatchAdd(@RequestBody List orgBatchAddRequest) { String body = JSONObject.toJSONString(orgBatchAddRequest); @@ -232,4 +302,62 @@ return ResponseData.error("批量添加组织失败"); } + /** + * 获取人员列表 + */ + @PostMapping("/hik/person/personList") + @ResponseBody + public Object personList() { + PersonListRequest request = new PersonListRequest(); + request.setPageNo(1); + request.setPageSize(100); + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi("/api/resource/v2/person/personList", body); + return resultStr; + } + + /** + * 获取组织列表 + */ + @PostMapping("/hik/org/orgList") + @ResponseBody + public Object orgList() { + PersonListRequest request = new PersonListRequest(); + request.setPageNo(1); + request.setPageSize(100); + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi("/api/resource/v1/org/orgList", body); + return resultStr; + } + + /** + * 查询访客权限下载记录 + */ + @PostMapping("/hik/auth/result") + @ResponseBody + public Object authResult() { + PersonListRequest request = new PersonListRequest(); + request.setPageNo(1); + request.setPageSize(100); + request.setOrderId("ba101db6246711edaea66f7939a13638"); + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi("/api/visitor/v1/auth/result", body); + return resultStr; + } + + /** + * 人脸图片获取 + */ + @PostMapping("/hik/face/picture") + @ResponseBody + public Object facePicture() { + FaceRequest request = new FaceRequest(); +// List list = new ArrayList<>(); +// list.add(""); + request.setCertificateNum("wanggong"); + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi("/api/frs/v1/face", body); + return resultStr; + } + } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/AssetInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/AssetInfoMapper.java index 4f64e83..c0684ee 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/AssetInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/AssetInfoMapper.java @@ -17,6 +17,6 @@ @Mapper public interface AssetInfoMapper extends BaseMapper { - List getAssetInfoListPage(@Param("page") Page page, AssetInfoRequest assetInfoRequest); + List getAssetInfoListPage(@Param("page") Page page, @Param("assetInfoRequest") AssetInfoRequest assetInfoRequest); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/AttendanceInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/AttendanceInfoMapper.java index f9e793e..ec87e46 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/AttendanceInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/AttendanceInfoMapper.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.statistics.AttendanceNumberDTO; import com.casic.missiles.modular.dto.statistics.AttendanceRatioDTO; import com.casic.missiles.modular.model.AttendanceInfo; import org.apache.ibatis.annotations.Mapper; @@ -17,7 +18,7 @@ */ @Mapper public interface AttendanceInfoMapper extends BaseMapper { - List getAttendanceInfoListPage(@Param("page") Page page, StaffInfoRequest attendanceInfoRequest); + List getAttendanceInfoListPage(@Param("page") Page page, @Param("attendanceInfoRequest") StaffInfoRequest attendanceInfoRequest); AttendanceInfo selectByCodeAndDate(@Param("staffCode") String staffCode); @@ -26,4 +27,8 @@ List getCountByTypeAndDateForMonth(@Param("staffType")String staffType); List getCountByTypeAndDateForYear(@Param("staffType")String staffType); + + List getCountForWeek(); + + List getCountForDay(); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java index ce94b8f..6137a7d 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java @@ -17,5 +17,5 @@ @Mapper public interface BlackInfoMapper extends BaseMapper { - List getBlackInfoListPage(@Param("page") Page page, BlackInfoRequest blackInfoRequest); + List getBlackInfoListPage(@Param("page") Page page, @Param("blackInfoRequest") BlackInfoRequest blackInfoRequest); } 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 efda6b3..50aaa6f 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 @@ -20,7 +20,7 @@ List getCaseInfoListPage(@Param("page") Page page, @Param("caseInfoRequest") CaseInfoRequest caseInfoRequest); - int updateStatusById(CaseInfoRequest caseInfoRequest); + int updateStatusById(@Param("caseInfoRequest") CaseInfoRequest caseInfoRequest); List selectByLevelAndMonth(@Param("year") String year); @@ -47,4 +47,20 @@ List selectPreWeekCountByThirtyDay(); List selectPreDayCountBySevenDay(); + + Integer selectDemobilizedCount(@Param("eventType") Number personnelDemobilizedEvent); + + List selectPreMonthCount(); + + List selectListBySevenDay(); + + List selectListByToday(); + + List selectListByToday2(); + + List selectListByToday3(); + + List selectListByType(@Param("eventType") Number eventType); + + List selectDemobilizedCountByHour(@Param("eventType") Number eventType); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/CategoryLevelMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/CategoryLevelMapper.java index 52fc714..afe1650 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/CategoryLevelMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/CategoryLevelMapper.java @@ -17,9 +17,9 @@ @Mapper public interface CategoryLevelMapper extends BaseMapper { - List getCaseCategoryLevelListPage(@Param("page") Page page, CategoryLevelRequest categoryLevelRequest); + List getCaseCategoryLevelListPage(@Param("page") Page page, @Param("categoryLevelRequest") CategoryLevelRequest categoryLevelRequest); - List getCaseCategoryLevelList(CategoryLevelRequest categoryLevelRequest); + List getCaseCategoryLevelList(@Param("categoryLevelRequest") CategoryLevelRequest categoryLevelRequest); CaseCategoryLevel getCaseCategoryLevel(@Param("categoryLevelCode") String categoryLevelCode); 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 66353b1..2555a09 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 @@ -19,7 +19,7 @@ @Mapper public interface DeviceInfoMapper extends BaseMapper { - List getDeviceInfoListPage(@Param("page") Page page, DeviceInfoRequest deviceInfoRequest); + List getDeviceInfoListPage(@Param("page") Page page, @Param("deviceInfoRequest") DeviceInfoRequest deviceInfoRequest); List getDeviceInfoList(@Param("deviceInfoRequest") DeviceInfoRequest deviceInfoRequest); @@ -27,6 +27,8 @@ DeviceInfo getByIndexCode(@Param("srcIndex") String srcIndex); + DeviceInfo getByIp(@Param("ip") String ip); + List selectIndexCodesByCodes(@Param("deviceCodes") List deviceCodes); List selectByType(@Param("devType") String devType); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/BlackListController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/BlackListController.java index a27f9f8..0c06661 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/BlackListController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/BlackListController.java @@ -1,13 +1,18 @@ package com.casic.missiles.modular.controller; +import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.base.controller.ExportController; import com.casic.missiles.core.page.PageFactory; import com.casic.missiles.model.response.ResponseData; import com.casic.missiles.modular.dto.BlackInfoRequest; +import com.casic.missiles.modular.dto.BlackPictureRequest; +import com.casic.missiles.modular.dto.hik.PersonInfoRequest; +import com.casic.missiles.modular.enums.HikUri; import com.casic.missiles.modular.enums.OperateTypeEnum; import com.casic.missiles.modular.model.BlackInfo; import com.casic.missiles.modular.service.BlackInfoService; +import com.casic.missiles.modular.util.HikUtil; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; @@ -56,4 +61,22 @@ return null; } + /** + * 黑名单人员照片 + */ + @PostMapping("/personPicture") + @ResponseBody + public Object personPicture(@RequestBody BlackPictureRequest blackPictureRequest){ + //获取照片 + String picUri = blackPictureRequest.getPicUri(); + String serverIndexCode = blackPictureRequest.getServerIndexCode(); + PersonInfoRequest picRequest = new PersonInfoRequest(); + picRequest.setPicUri(picUri); + picRequest.setServerIndexCode(serverIndexCode); + String reBody = JSONObject.toJSONString(picRequest); + //重定向地址获取 + String url = HikUtil.hikApiFor302(HikUri.PERSON_PICTURE, reBody); + return ResponseData.success(url); + } + } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/DeviceController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/DeviceController.java index e1c4eba..666bbee 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/DeviceController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/DeviceController.java @@ -107,7 +107,7 @@ } /** - * 设备维修管理查询(分页),需计算MTTR=总维修时间/故障次数 + * 设备状态计算与评判/设备维修管理查询(分页),需计算MTTR=总维修时间/故障次数 */ @PostMapping("/repair/listPage") @ResponseBody @@ -211,7 +211,7 @@ //需根据设备编号获取到对应的门禁点唯一标识 doorControlRequest.setDoorIndexCodes(indexCodes); doorControlRequest.setControlType(Integer.valueOf(gateGroupDTO.getStatus())); - String body = JSONObject.toJSONString(deviceCodes); + String body = JSONObject.toJSONString(doorControlRequest); String resultStr = HikUtil.hikApi(HikUri.DOOR_CONTROL, body); JSONObject resultJson = (JSONObject)JSONObject.parse(resultStr); if (!"0".equals(resultJson.get("code"))) { diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/StaffController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/StaffController.java index b58ccab..704093c 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/StaffController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/StaffController.java @@ -2,15 +2,21 @@ import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.util.StrUtil; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.base.controller.ExportController; import com.casic.missiles.core.page.PageFactory; import com.casic.missiles.model.response.ErrorResponseData; import com.casic.missiles.model.response.ResponseData; import com.casic.missiles.modular.dto.StaffInfoRequest; +import com.casic.missiles.modular.dto.hik.PersonInfoRequest; +import com.casic.missiles.modular.dto.hik.StaffCardRequest; +import com.casic.missiles.modular.enums.HikUri; import com.casic.missiles.modular.enums.OperateTypeEnum; import com.casic.missiles.modular.model.StaffInfo; import com.casic.missiles.modular.service.StaffInfoService; +import com.casic.missiles.modular.util.HikUtil; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; @@ -110,4 +116,60 @@ } return ResponseData.success(); } + + /** + * 批量开卡,添加人员之后调用,若在一个接口中添加人员成功开卡失败则第二次添加时会有问题 + */ + @PostMapping("/cardBinding") + @ResponseBody + public Object cardBinding(@RequestBody StaffCardRequest staffCardRequest) { + String body = JSONObject.toJSONString(staffCardRequest); + String resultStr = HikUtil.hikApi(HikUri.CARD_BINDING, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (!"0".equals(resultJson.get("code"))) { + log.error("请求海康,批量开卡失败,海康response:{}", resultStr); + return ResponseData.error("批量开卡失败"); + } + //保存卡号 + if(staffInfoService.saveCardInfo(staffCardRequest) > 0){ + return ResponseData.success(); + } + return ResponseData.error("批量开卡失败"); + } + + /** + * 获取员工照片,海康存储 + */ + @PostMapping("/personPicture/{staffCode}") + @ResponseBody + public Object personPicture(@PathVariable("staffCode") String staffCode){ + //获取员工详细信息,含图片服务器、uri + PersonInfoRequest request = new PersonInfoRequest(); + List list = new ArrayList<>(); + list.add(staffCode); + request.setParamName("personId"); + request.setParamValue(list); + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi(HikUri.PERSON_INFO, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (!"0".equals(resultJson.get("code"))) { + log.error("请求海康,根据人员唯一字段获取人员详细信息失败,海康response:{}", resultStr); + return ResponseData.error("获取员工照片失败"); + } + //获取照片 + JSONObject data = (JSONObject) resultJson.get("data"); + JSONArray dataArray = (JSONArray) data.get("list"); + JSONObject jsonObject = (JSONObject) dataArray.get(0); + JSONArray personPhoto = (JSONArray) jsonObject.get("personPhoto"); + JSONObject photo = (JSONObject) personPhoto.get(0); + String picUri = photo.getString("picUri"); + String serverIndexCode = photo.getString("serverIndexCode"); + PersonInfoRequest picRequest = new PersonInfoRequest(); + picRequest.setPicUri(picUri); + picRequest.setServerIndexCode(serverIndexCode); + String reBody = JSONObject.toJSONString(picRequest); + //重定向地址获取 + String url = HikUtil.hikApiFor302(HikUri.PERSON_PICTURE, reBody); + return ResponseData.success(url); + } } 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 4a07dd9..7b1dcf6 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 @@ -16,6 +16,7 @@ import com.casic.missiles.modular.redis.key.CacheKeys; import com.casic.missiles.modular.service.CockpitService; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.util.CollectionUtils; import org.springframework.web.bind.annotation.*; @@ -24,10 +25,7 @@ import java.text.NumberFormat; import java.time.LocalDateTime; import java.time.temporal.ChronoUnit; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.util.*; import java.util.stream.Collectors; /** @@ -73,6 +71,9 @@ private StatisticNumberMapper numberMapper; @Autowired + private HazardLevelMapper hazardLevelMapper; + + @Autowired private AccessGroupConfig accessGroupConfig; /** @@ -104,8 +105,24 @@ public Object buildingNumberPerHour(){ //当天按小时分组的人数 List list = numberMapper.selectListByTime(); - Map> collect = list.stream().collect(Collectors.groupingBy(BuildingNumberDTO::getStatisticPosition)); - return ResponseData.success(collect); + Map> collect = list.stream().collect(Collectors.groupingBy(BuildingNumberDTO::getStatisticTime)); + //定时任务中已将每小时三栋楼人数存到数据库 + //将一期主楼和录制楼人数合并,二期单算 + List> resultList = new ArrayList<>(); + collect.keySet().forEach(key -> { + List buildingNumberDTOS = collect.get(key); + BuildingNumberDTO mainBuildingOne = buildingNumberDTOS.get(0); + BuildingNumberDTO mainBuildingTwo = buildingNumberDTOS.get(1); + BuildingNumberDTO recordingBuilding = buildingNumberDTOS.get(2); + HashMap resultMap = new HashMap<>(); + Integer oneQuantity = Integer.valueOf(mainBuildingOne.getStatisticQuantity()); + Integer recordingQuantity = Integer.valueOf(recordingBuilding.getStatisticQuantity()); + resultMap.put("staticTime", mainBuildingOne.getStatisticTime()); + resultMap.put(mainBuildingOne.getStatisticPositionName()+"、"+recordingBuilding.getStatisticPositionName(), String.valueOf(oneQuantity+recordingQuantity)); + resultMap.put(mainBuildingTwo.getStatisticPositionName(), mainBuildingTwo.getStatisticQuantity()); + resultList.add(resultMap); + }); + return ResponseData.success(resultList); } /** @@ -151,12 +168,11 @@ public Object securityNumber() { QueryWrapper wrapper = new QueryWrapper<>(); wrapper.eq("staff_type", 2); + // TODO: 2022/9/2 后续使用产品确定的每天出勤的安保人员的数量 Integer total = staffInfoMapper.selectCount(wrapper); - //当日离岗事件个数 - QueryWrapper wrapper1 = new QueryWrapper<>(); - wrapper1.eq("hik_event_type", SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); - wrapper1.apply("date_format(now(),'%Y-%m-%d') = date_format(happen_time,'%Y-%m-%d')"); - Integer leave = caseInfoMapper.selectCount(wrapper1); + //当日离岗事件按设备去重后的个数 + // TODO: 2022/9/2 目前相当于24小时内的计算,之后看需要可改成自定义小时数计算离岗率,即离岗+6小时内仅一次离岗则恢复为100%,多次则累加离岗次数计算离岗率 + Integer leave = caseInfoMapper.selectDemobilizedCount(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); NumberFormat numberFormat = NumberFormat.getInstance(); // 设置精确到小数点后2位 numberFormat.setMaximumFractionDigits(2); @@ -179,7 +195,6 @@ @ResponseBody public Object visitorApplyDetail() { List reasonGroup = applyMapper.selectByVisitReason(); - HashMap resultMap = new HashMap<>(); NumberFormat numberFormat = NumberFormat.getInstance(); // 设置精确到小数点后2位 numberFormat.setMaximumFractionDigits(2); @@ -187,12 +202,17 @@ if(0 == sum){ return ResponseData.success(); } + List resultList = new ArrayList<>(); reasonGroup.forEach(group -> { String reasonName = dictService.getDictNameByCode(SecurityEventDict.VISIT_REASON, group.getVisitReason()); String result = numberFormat.format((float) group.getQuantity() / (float) sum * 100); - resultMap.put(reasonName, result+"%"); + ApplyReasonGroupDTO applyReasonGroupDTO = new ApplyReasonGroupDTO(); + applyReasonGroupDTO.setQuantity(group.getQuantity()); + applyReasonGroupDTO.setVisitReason(reasonName); + applyReasonGroupDTO.setRatio(result+"%"); + resultList.add(applyReasonGroupDTO); }); - return ResponseData.success(resultMap); + return ResponseData.success(resultList); } /** @@ -247,6 +267,32 @@ } /** + * 机动力量实时在岗率,在岗人数除以总应在岗人数,用离岗+6小时内恢复为100%,6小时外再计算 + */ + @GetMapping("/staff/beOnDutyRatio") + @ResponseBody + public Object beOnDutyRatio() { + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("staff_type", 2); + // TODO: 2022/9/2 后续使用产品确定的每天出勤的安保人员的数量 + Integer total = staffInfoMapper.selectCount(wrapper); + if(0 == total){ + return ResponseData.success(null); + } + //当日离岗事件按设备去重后的个数 + // TODO: 2022/9/2 目前相当于24小时内的计算,之后看需要可改成自定义小时数计算离岗率,即离岗+6小时内仅一次离岗则恢复为100%,多次则累加离岗次数计算离岗率 + List onDutyRatioDTOS = caseInfoMapper.selectDemobilizedCountByHour(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); + onDutyRatioDTOS.forEach(dto -> { + NumberFormat numberFormat = NumberFormat.getInstance(); + // 设置精确到小数点后2位 + numberFormat.setMaximumFractionDigits(2); + String result = numberFormat.format(100 - Float.valueOf(dto.getQuantity()) / (float) total * 100); + dto.setRatio(result+"%"); + }); + return ResponseData.success(onDutyRatioDTOS); + } + + /** * 闸机速通门统计-设备状态分组计算数量,devType传闸机字典key * 视频频监控摄像机统计-设备状态分组计算数量,devType传摄像头字典key */ @@ -262,12 +308,17 @@ if(sum <= 0){ return ResponseData.error("无该类设备信息"); } + List resultList = new ArrayList<>(); gateStatusGroup.forEach(group -> { String devStatus = dictService.getDictNameByCode(SecurityEventDict.DEVICE_STATUS, group.getStatus()); String result = numberFormat.format((float) group.getQuantity() / (float) sum * 100); - resultMap.put(devStatus, result+"%"); + GateStatusGroupResponse gateStatusGroupResponse = new GateStatusGroupResponse(); + gateStatusGroupResponse.setStatus(devStatus); + gateStatusGroupResponse.setRatio(result+"%"); + resultList.add(gateStatusGroupResponse); }); - resultMap.put("总", sum); + resultMap.put("total", sum); + resultMap.put("list", resultList); return ResponseData.success(resultMap); } @@ -282,17 +333,38 @@ String position = securityScoreDTO.getPosition(); List caseInfos = caseInfoMapper.selectByPosition(position); //查询各危险级别权重、各类别权重,放入map,避免循环中多次查数据库 - + HashMap hazardScoreMap = new HashMap<>(); + List caseHazardLevelList = hazardLevelMapper.getCaseHazardLevelList(null); + caseHazardLevelList.forEach(hazardLevel -> { + hazardScoreMap.put(hazardLevel.getCode(), hazardLevel.getWeight()); + }); + HashMap categoryScoreMap = new HashMap<>(); + List categoryLevelList = categoryLevelMapper.getCaseCategoryLevelList(null); + categoryLevelList.forEach(categoryLevel -> { + categoryScoreMap.put(categoryLevel.getCode(), categoryLevel.getWeight()); + }); + //事件按楼层分组,计算 List securityScoreDTOs = new ArrayList<>(); caseInfos.forEach(caseInfo -> { SecurityScoreDTO securityScoreDTO1 = new SecurityScoreDTO(); + securityScoreDTO1.setPosition(caseInfo.getPosition()); securityScoreDTO1.setArea(caseInfo.getArea()); - // TODO: 2022/8/4 楼层评分计算根据产品定义调整 -// caseInfo.get -// securityScoreDTO1.setScore(); + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); + Double score = 100 - Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + securityScoreDTO1.setScore(score); + securityScoreDTOs.add(securityScoreDTO1); }); - - return null; + 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); + }); + return ResponseData.success(securityScoreDTOs); } /** @@ -303,9 +375,13 @@ public Object SecurityFrequency(@RequestBody SecurityFrequencyDTO securityFrequencyDTO) { String year = securityFrequencyDTO.getYear(); String month = securityFrequencyDTO.getMonth(); - Integer quantity = caseInfoMapper.selectCountByMonth(year, month); - securityFrequencyDTO.setQuantity(quantity); - return ResponseData.success(securityFrequencyDTO); + if(!StringUtils.isEmpty(year) && StringUtils.isEmpty(month)){ + Integer quantity = caseInfoMapper.selectCountByMonth(year, month); + securityFrequencyDTO.setQuantity(quantity); + return ResponseData.success(securityFrequencyDTO); + } + List list = caseInfoMapper.selectPreMonthCount(); + return ResponseData.success(list); } } 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 ae4d770..f4f075c 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 @@ -1,20 +1,25 @@ package com.casic.missiles.modular.controller.cockpit; +import cn.hutool.core.date.DateUnit; import cn.hutool.core.date.DateUtil; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.casic.missiles.model.response.ResponseData; -import com.casic.missiles.modular.dao.AttendanceInfoMapper; -import com.casic.missiles.modular.dao.CaseInfoMapper; -import com.casic.missiles.modular.dao.HazardLevelMapper; -import com.casic.missiles.modular.dao.StaffInfoMapper; +import com.casic.missiles.modular.dao.*; +import com.casic.missiles.modular.dto.DeviceRepairLogDTO; +import com.casic.missiles.modular.dto.DeviceRepairRequest; import com.casic.missiles.modular.dto.statistics.*; +import com.casic.missiles.modular.enums.SecurityEventType; +import com.casic.missiles.modular.model.CaseCategoryLevel; import com.casic.missiles.modular.model.CaseHazardLevel; +import com.casic.missiles.modular.model.CaseInfo; import com.casic.missiles.modular.model.StaffInfo; +import com.casic.missiles.modular.service.DeviceInfoService; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.util.CollectionUtils; import org.springframework.web.bind.annotation.*; +import java.math.BigDecimal; import java.text.NumberFormat; import java.util.*; import java.util.stream.Collectors; @@ -40,6 +45,12 @@ @Autowired private HazardLevelMapper hazardLevelMapper; + @Autowired + private CategoryLevelMapper categoryLevelMapper; + + @Autowired + private DeviceInfoService deviceInfoService; + /** * 安防事件时域频次统计,每月的每天安防事件个数(原方案) * 月维度:展示每个月的每天的数据 @@ -89,15 +100,17 @@ List monthList = caseInfoMapper.selectPreMonthCountByYear(year); Map> collect = monthList.stream().collect(Collectors.groupingBy(PreMonthOrWeekCaseDTO::getHazardLevelCode)); HashMap strAvgMap = new HashMap<>(); + List resultList = new ArrayList<>(); for (String key : collect.keySet()) { List preMonthOrWeekCaseDTOS = collect.get(key); int sum = preMonthOrWeekCaseDTOS.stream().mapToInt(PreMonthOrWeekCaseDTO::getQuantity).sum(); //若年份是本年,则使用个安防级别数量/当前月份数 //若不是本年,除数为12 MonthAndWeekDTO monthAndWeekDTO = new MonthAndWeekDTO(); + String hazardName = hazardLevelMapper.selectHazardNameByCode(key); + monthAndWeekDTO.setLevelName(hazardName); if(year.equals(String.valueOf(DateUtil.thisYear()))){ monthAndWeekDTO.setMonthQuantity(sum / DateUtil.thisMonth()); -// monthAndWeekDTO.setLevelName(); strAvgMap.put(key, monthAndWeekDTO); }else{ monthAndWeekDTO.setMonthQuantity(sum / 12); @@ -113,27 +126,37 @@ if(year.equals(String.valueOf(DateUtil.thisYear()))){ if(!Objects.isNull(strAvgMap.get(key))){ MonthAndWeekDTO monthAndWeekDTO = strAvgMap.get(key); + String hazardName = hazardLevelMapper.selectHazardNameByCode(key); + monthAndWeekDTO.setLevelName(hazardName); monthAndWeekDTO.setWeekQuantity(sum / DateUtil.thisWeekOfYear()); strAvgMap.put(key, monthAndWeekDTO); }else{ MonthAndWeekDTO monthAndWeekDTO = new MonthAndWeekDTO(); + String hazardName = hazardLevelMapper.selectHazardNameByCode(key); + monthAndWeekDTO.setLevelName(hazardName); monthAndWeekDTO.setWeekQuantity(sum / DateUtil.thisWeekOfYear()); strAvgMap.put(key, monthAndWeekDTO); } }else{ if(!Objects.isNull(strAvgMap.get(key))){ MonthAndWeekDTO monthAndWeekDTO = strAvgMap.get(key); + String hazardName = hazardLevelMapper.selectHazardNameByCode(key); + monthAndWeekDTO.setLevelName(hazardName); monthAndWeekDTO.setWeekQuantity(sum / 52); strAvgMap.put(key, monthAndWeekDTO); }else{ MonthAndWeekDTO monthAndWeekDTO = new MonthAndWeekDTO(); + String hazardName = hazardLevelMapper.selectHazardNameByCode(key); + monthAndWeekDTO.setLevelName(hazardName); monthAndWeekDTO.setWeekQuantity(sum / 52); strAvgMap.put(key, monthAndWeekDTO); } } } - avgMonthAndWeekGroupDTO.setMap(strAvgMap); - return ResponseData.success(avgMonthAndWeekGroupDTO); + strAvgMap.keySet().forEach(key -> { + resultList.add(strAvgMap.get(key)); + }); + return ResponseData.success(resultList); } /** @@ -181,12 +204,178 @@ } /** - * 员工考勤人数变化,功能待定 + * 员工考勤人数变化,统计当天(横坐标为时)及近7天(横坐标为天)的考勤人数变化,只要发生一次考勤识别,次数的基数就正常增加(没有上班下班区分) */ + @PostMapping("/staff/attendanceNumber/{dimension}") + @ResponseBody + public Object attendanceNumber(@PathVariable("dimension") String dimension) { + List attendanceNumberDTOs = null; + List> resultList = new ArrayList<>(); + if("week".equals(dimension)){ + //近7天数据按天分组统计 + attendanceNumberDTOs = attendanceInfoMapper.getCountForWeek(); + }else if("day".equals(dimension)) { + //今天数据按小时分组统计 + attendanceNumberDTOs = attendanceInfoMapper.getCountForDay(); + } + if(CollectionUtils.isEmpty(attendanceNumberDTOs)){ + return ResponseData.error("该查询条件下,无员工出勤数据!"); + } + Map> collect = attendanceNumberDTOs.stream().collect(Collectors.groupingBy(AttendanceNumberDTO::getDate)); + collect.keySet().forEach(key -> { + List attendanceNumberDTOS = collect.get(key); + AttendanceNumberDTO attendanceNumberDTO = attendanceNumberDTOS.get(0); + AttendanceNumberDTO attendanceNumberDTO2 = attendanceNumberDTOS.get(1); + Map resultMap = new HashMap<>(); + resultMap.put(attendanceNumberDTO.getStaffType(), attendanceNumberDTO.getQuantity()); + resultMap.put(attendanceNumberDTO2.getStaffType(), attendanceNumberDTO2.getQuantity()); + resultMap.put("staticTime", attendanceNumberDTO.getDate()); + resultList.add(resultMap); + }); + return ResponseData.success(resultList); + } /** - * 近30天/近一周安保人员到岗排行 + * 早晚高峰区域安防评估 */ + @PostMapping("/security/assessment/{dimension}") + @ResponseBody + public Object securityAssessment(@PathVariable("dimension") String dimension) { + //查询各危险级别权重、各类别权重,放入map,避免循环中多次查数据库 + HashMap hazardScoreMap = new HashMap<>(); + List caseHazardLevelList = hazardLevelMapper.getCaseHazardLevelList(null); + caseHazardLevelList.forEach(hazardLevel -> { + hazardScoreMap.put(hazardLevel.getCode(), hazardLevel.getWeight()); + }); + HashMap categoryScoreMap = new HashMap<>(); + List categoryLevelList = categoryLevelMapper.getCaseCategoryLevelList(null); + categoryLevelList.forEach(categoryLevel -> { + categoryScoreMap.put(categoryLevel.getCode(), categoryLevel.getWeight()); + }); + HashMap hashMap = new HashMap<>(); + if("week".equals(dimension)){ + //近7天早晚高峰数据 + List caseInfos = caseInfoMapper.selectListBySevenDay(); + //按时间(天)进行分组 + caseInfos.forEach(caseInfo -> { + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); + Double score = Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + String[] array = caseInfo.getHappenTime().split(" "); + String dayTime = array[0]; + BigDecimal preScore; + if(hashMap.containsKey(dayTime)){ + Double aDouble = hashMap.get(dayTime); + preScore = new BigDecimal(aDouble.toString()); + + }else{ + preScore = new BigDecimal("100.0"); + } + BigDecimal nowScore = new BigDecimal(score.toString()); + hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); + }); + return ResponseData.success(hashMap); + }else if("day".equals(dimension)) { + //今天数据按小时分组统计 + List caseInfos = caseInfoMapper.selectListByToday(); + caseInfos.forEach(caseInfo -> { + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); + Double score = Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + String[] array = caseInfo.getHappenTime().split(":"); + String dayTime = array[0]; + BigDecimal preScore; + if(hashMap.containsKey(dayTime)){ + Double aDouble = hashMap.get(dayTime); + preScore = new BigDecimal(aDouble.toString()); + + }else{ + preScore = new BigDecimal("100.0"); + } + BigDecimal nowScore = new BigDecimal(score.toString()); + hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); + }); + return ResponseData.success(hashMap); + } + return null; + } + + /** + * 重点区域安防事态评估,统计重点区域6:00-23:00按小时分组数据 + */ + @GetMapping("/security/keyAreaStatistic") + @ResponseBody + public Object keyAreaStatistic() { + //查询各危险级别权重、各类别权重,放入map,避免循环中多次查数据库 + HashMap hazardScoreMap = new HashMap<>(); + List caseHazardLevelList = hazardLevelMapper.getCaseHazardLevelList(null); + caseHazardLevelList.forEach(hazardLevel -> { + hazardScoreMap.put(hazardLevel.getCode(), hazardLevel.getWeight()); + }); + HashMap categoryScoreMap = new HashMap<>(); + List categoryLevelList = categoryLevelMapper.getCaseCategoryLevelList(null); + categoryLevelList.forEach(categoryLevel -> { + categoryScoreMap.put(categoryLevel.getCode(), categoryLevel.getWeight()); + }); + HashMap hashMap = new HashMap<>(); + //今天数据按小时分组统计 + List caseInfos = caseInfoMapper.selectListByToday2(); + caseInfos.forEach(caseInfo -> { + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); + Double score = Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + String[] array = caseInfo.getHappenTime().split(":"); + String dayTime = array[0]; + BigDecimal preScore; + if(hashMap.containsKey(dayTime)){ + Double aDouble = hashMap.get(dayTime); + preScore = new BigDecimal(aDouble.toString()); + + }else{ + preScore = new BigDecimal("100.0"); + } + BigDecimal nowScore = new BigDecimal(score.toString()); + hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); + }); + return ResponseData.success(hashMap); + } + + /** + * 安防机动支援力量调配响应评估,根据事件已解决状态及已解决时间-发送时间,按时间(小时)分组统计 + */ + @GetMapping("/security/responseAssess") + @ResponseBody + public Object responseAssess() { + //查询各危险级别权重、各类别权重,放入map,避免循环中多次查数据库 + HashMap hazardScoreMap = new HashMap<>(); + List caseHazardLevelList = hazardLevelMapper.getCaseHazardLevelList(null); + caseHazardLevelList.forEach(hazardLevel -> { + hazardScoreMap.put(hazardLevel.getCode(), hazardLevel.getWeight()); + }); + HashMap hashMap = new HashMap<>(); + //今天数据按小时分组统计 + List caseInfos = caseInfoMapper.selectListByToday3(); + caseInfos.forEach(caseInfo -> { + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + //扣分=事件级别权重*未解决小时数 + Date updateTime = DateUtil.parse(caseInfo.getUpdateTime()); + Date happenTime = DateUtil.parse(caseInfo.getHappenTime()); + long between = DateUtil.between(updateTime, happenTime, DateUnit.HOUR); + Double score = Double.valueOf(hazardWeight)*between; + String[] array = caseInfo.getHappenTime().split(":"); + String dayTime = array[0]; + BigDecimal preScore; + if(hashMap.containsKey(dayTime)){ + Double aDouble = hashMap.get(dayTime); + preScore = new BigDecimal(aDouble.toString()); + }else{ + preScore = new BigDecimal("100.0"); + } + BigDecimal nowScore = new BigDecimal(score.toString()); + hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); + }); + return ResponseData.success(hashMap); + } /** * 重点区域威胁事件类型统计,优先级2,统计近7天和近30天 @@ -224,7 +413,34 @@ } /** - * 设备状态计算系数和评判,优先级3,需确认设备恢复时间是否可以获取 + * 近30天/近一周安保人员到岗排行 */ + + /** + * 安保等级评估,发生离岗事件减1分 + */ + @GetMapping("/security/levelAssess") + @ResponseBody + public Object securityLevelAssess() { + //今天数据按小时分组统计 + List resultList = caseInfoMapper.selectListByType(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); + resultList.forEach(result -> { + BigDecimal deScore = new BigDecimal(result.getQuantity()); + BigDecimal preScore = new BigDecimal("100.0"); + result.setScore(preScore.subtract(deScore).doubleValue()); + }); + return ResponseData.success(resultList); + } + + /** + * 设备状态计算系数和评判,即设备维修管理查询(不分页) + */ + @PostMapping("/device/repairList") + @ResponseBody + public Object repairList(@RequestBody DeviceRepairRequest deviceRepairRequest) { + List deviceRepairLogDTOS = deviceInfoService.deviceRepairListPage(deviceRepairRequest); + return ResponseData.success(deviceRepairLogDTOS); + } + } 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 fbf8ab6..c71a15a 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 @@ -1,13 +1,12 @@ package com.casic.missiles.modular.controller.hik; +import cn.hutool.core.date.DateTime; +import cn.hutool.core.date.DateUtil; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.casic.missiles.model.response.ResponseData; import com.casic.missiles.modular.dao.HikFaceGroupInfoMapper; -import com.casic.missiles.modular.dto.hik.EventSubscribeRequest; -import com.casic.missiles.modular.dto.hik.FaceGroupAdditionRequest; -import com.casic.missiles.modular.dto.hik.HikRecvEvent; -import com.casic.missiles.modular.dto.hik.OrgBatchAdd; +import com.casic.missiles.modular.dto.hik.*; import com.casic.missiles.modular.enums.HikUri; import com.casic.missiles.modular.enums.SecurityEventType; import com.casic.missiles.modular.model.CaseInfo; @@ -18,16 +17,20 @@ import com.casic.missiles.modular.util.CaseInfoFactoryUtil; import com.casic.missiles.modular.util.HikUtil; import com.casic.missiles.modular.util.ThreadPoolUtil; +import com.casic.missiles.modular.util.WebSocket; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; -import org.springframework.web.bind.annotation.*; +import org.springframework.util.CollectionUtils; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.RestController; -import java.net.InetAddress; -import java.net.UnknownHostException; import java.util.ArrayList; +import java.util.Iterator; import java.util.List; import java.util.Objects; @@ -38,7 +41,6 @@ */ @Slf4j @RestController -@RequestMapping("/hik") public class HikController { @Autowired @@ -53,28 +55,37 @@ @Autowired private HikService hikService; + @Autowired + private HikFaceGroupInfoMapper hikFaceGroupInfoMapper; + + @Autowired + private WebSocket webSocket; + @Value("${server.port}") private int serverPort; - @Autowired - private HikFaceGroupInfoMapper hikFaceGroupInfoMapper; /** * 海康事件订阅 */ - @PostMapping("/event/subscribe") + @PostMapping("/hik/event/subscribe") @ResponseBody - public Object eventSubscribe() throws UnknownHostException { + public Object eventSubscribe() { EventSubscribeRequest eventSubscribeRequest = new EventSubscribeRequest(); ArrayList list = new ArrayList<>(); list.add(SecurityEventType.DEVICE_OFFLINE); + list.add(SecurityEventType.DEVICE_ONLINE); list.add(SecurityEventType.KEY_PERSONNEL_IDENTIFY_EVENT); list.add(SecurityEventType.MONITORING_POINT_OFFLINE); + list.add(SecurityEventType.MONITORING_POINT_ONLINE); list.add(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); list.add(SecurityEventType.PERSONNEL_GATHER_EVENT); - InetAddress localHost = InetAddress.getLocalHost(); + list.add(SecurityEventType.VISITOR_REGISTER); + list.add(SecurityEventType.VISITOR_CHECKOUT); + list.add(SecurityEventType.HIGH_ALTITUDE_PARABOLIC); +// InetAddress localHost = InetAddress.getLocalHost(); eventSubscribeRequest.setEventTypes(list); - eventSubscribeRequest.setEventDest("https://" + localHost + ":" + serverPort + "/eventRcv"); + eventSubscribeRequest.setEventDest("http://" + "192.168.10.6" + ":" + serverPort + "/eventRcv"); //订阅类型,0-订阅原始事件,1-联动事件,2-原始事件和联动事件,不填使用默认值0 eventSubscribeRequest.setSubType(0); /** @@ -92,19 +103,25 @@ } /** + * 查询事件订阅信息 + */ + @PostMapping("/hik/event/query") + @ResponseBody + public Object eventQuery() { + String result = HikUtil.hikApi(HikUri.EVENT_INFO, ""); + return result; + } + + /** * 海康事件接收 */ @PostMapping("/eventRcv") @ResponseBody public Object eventRcv(@RequestBody HikRecvEvent hikRecvEvent) { //1、接收所需事件类型 - Long eventType = hikRecvEvent.getEventType(); + Number eventType = hikRecvEvent.getEventType(); log.info("接收到安防事件类型为:{}", eventType); CaseInfo caseInfo = caseInfoFactoryUtil.getCaseInfo(eventType); - //接收到不关心事件直接返回 - if(Objects.isNull(caseInfo)){ - return ResponseData.success(); - } //2、不同事件不同处理,caseInfoFactoryUtil已设置好事件基础定义信息 // 再为事件添加状态、设备编码、设备名称、位置、区域、时间 // 异步处理事件 @@ -114,19 +131,23 @@ caseHandle(hikRecvEvent, eventType, caseInfo); } })); +// caseHandle(hikRecvEvent, eventType, caseInfo); - return null; + return ResponseData.success(); } - private void caseHandle(HikRecvEvent hikRecvEvent, Long eventType, CaseInfo caseInfo) { + private void caseHandle(HikRecvEvent hikRecvEvent, Number eventType, CaseInfo caseInfo) { JSONArray eventArray = hikRecvEvent.getEventArray(); List caseInfos = new ArrayList<>(); - while (eventArray.stream().iterator().hasNext()) { + Iterator iterator = eventArray.iterator(); + while (iterator.hasNext()) { CaseInfo caseInfo1 = new CaseInfo(); - BeanUtils.copyProperties(caseInfo, caseInfo1); - JSONObject event = (JSONObject) eventArray.stream().iterator().next(); + if(!Objects.isNull(caseInfo)){ + BeanUtils.copyProperties(caseInfo, caseInfo1); + } + JSONObject event = (JSONObject) iterator.next(); //5种事件进行不同处理 - if(SecurityEventType.KEY_PERSONNEL_IDENTIFY_EVENT == eventType){ + if (SecurityEventType.KEY_PERSONNEL_IDENTIFY_EVENT.equals(eventType)) { //判断所属人脸分组 JSONObject data = (JSONObject) event.get("data"); JSONObject faceRecognitionResult = (JSONObject) data.get("faceRecognitionResult"); @@ -142,52 +163,101 @@ if (faceGroupCode.equals(blackListGroup.getFaceGroupCode())) { //黑名单分组处理 caseInfo1 = hikService.blackListHandle(event, caseInfo1); - }else if(faceGroupCode.equals(propertyPersonnelGroup.getFaceGroupCode())){ + } else if (faceGroupCode.equals(propertyPersonnelGroup.getFaceGroupCode())) { //考勤分组处理-物业人员,添加到考勤表 hikService.propertyAttendanceHandle(event); - }else if(faceGroupCode.equals(securityPersonnelGroup.getFaceGroupCode())){ + } else if (faceGroupCode.equals(securityPersonnelGroup.getFaceGroupCode())) { //考勤分组处理-安保人员,添加到考勤表 hikService.securityPersonnelHandle(event); - }else { + } else { return; } - }else if(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT == eventType){ + } else if (SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT.equals(eventType)) { //离岗事件处理 caseInfo1 = hikService.demobilizedHandle(event, caseInfo1); - }else if(SecurityEventType.PERSONNEL_GATHER_EVENT == eventType){ + } else if (SecurityEventType.PERSONNEL_GATHER_EVENT.equals(eventType)) { //人员聚集事件处理 caseInfo1 = hikService.personGatherHandle(event, caseInfo1); - }else if(SecurityEventType.MONITORING_POINT_OFFLINE == eventType){ + } else if (SecurityEventType.MONITORING_POINT_OFFLINE.equals(eventType)) { //监控点离线事件处理 caseInfo1 = hikService.monitorPointOfflineHandle(event, caseInfo1); - }else if(SecurityEventType.DEVICE_OFFLINE == eventType){ + } else if (SecurityEventType.MONITORING_POINT_ONLINE.equals(eventType)) { + //监控点上线事件处理 + hikService.monitorPointOnlineHandle(event); + } else if (SecurityEventType.DEVICE_OFFLINE.equals(eventType)) { //装置离线事件处理 caseInfo1 = hikService.deviceOfflineHandle(event, caseInfo1); - }else if(SecurityEventType.VISITOR_REGISTER == eventType){ + } else if (SecurityEventType.DEVICE_ONLINE.equals(eventType)) { + //装置上线处理 + hikService.deviceOnlineHandle(event); + } else if (SecurityEventType.VISITOR_REGISTER.equals(eventType)) { //记录访客登记记录,添加到访客记录表 hikService.visitorRegisterHandler(event); - }else if(SecurityEventType.VISITOR_CHECKOUT == eventType){ + } else if (SecurityEventType.VISITOR_CHECKOUT.equals(eventType)) { //记录访客签离记录 hikService.visitorCheckOutHandler(event); } - if(!Objects.isNull(caseInfo1) && !StringUtils.isEmpty(caseInfo1.getHappenTime())){ + if (!Objects.isNull(caseInfo1) && !StringUtils.isEmpty(caseInfo1.getHappenTime())) { caseInfos.add(caseInfo1); } } //3、安防事件入库 - if(!caseInfoService.insertCaseInfoBatch(caseInfos)){ - log.error("安防事件批量入库异常"); + if (!CollectionUtils.isEmpty(caseInfos) && !caseInfoService.insertCaseInfoBatch(caseInfos)) { + log.error("安防事件批量入库异常!"); } // TODO: 2022/8/15 webSocket推送 + if (CollectionUtils.isEmpty(caseInfos)) { + log.info("webSocket事件推送"); + webSocket.sendAllMessage(JSONObject.toJSONString(caseInfos)); + } return; } /** + * 以图搜图,前端用于轨迹追踪 + */ + @PostMapping("/hik/search/picture") + @ResponseBody + public Object searchPictures(@RequestBody SearchPicturesRequest searchPicturesRequest) { + DateTime startDateTime = DateUtil.parse(searchPicturesRequest.getStartTime()); + DateTime endDateTime = DateUtil.parse(searchPicturesRequest.getEndTime()); + String startTime = DateUtil.format(startDateTime, "yyyy-MM-dd'T'HH:mm:ss.SSSXXX"); + String endTime = DateUtil.format(endDateTime, "yyyy-MM-dd'T'HH:mm:ss.SSSXXX"); + searchPicturesRequest.setStartTime(startTime); + searchPicturesRequest.setEndTime(endTime); + String body = JSONObject.toJSONString(searchPicturesRequest); + String resultStr = HikUtil.hikApi(HikUri.SEARCH_PICTURES, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (!"0".equals(resultJson.get("code"))) { + log.error("请求海康,以图搜图失败,海康response:{}", resultStr); + return ResponseData.error("以图搜图失败"); + } + return ResponseData.success(resultJson); + } + + + /** + * 海康事件取消订阅 + */ + @PostMapping("/hik/event/cancel") + @ResponseBody + public Object eventCancelSubscribe(@RequestBody CancelSubscribeRequest cancelSubscribeRequest) { + String body = JSONObject.toJSONString(cancelSubscribeRequest); + String resultStr = HikUtil.hikApi(HikUri.EVENT_CANCEL, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (!"0".equals(resultJson.get("code"))) { + log.error("请求海康,取消订阅失败,海康response:{}", resultStr); + return ResponseData.error("取消订阅失败"); + } + return ResponseData.success(resultJson); + } + + /** * 单个添加海康人脸分组 * api->hik单个添加人脸分组api->response->mysql */ - @PostMapping("/faceGroup/single/add") + @PostMapping("/hik/faceGroup/single/add") @ResponseBody public Object faceGroupAddition(@RequestBody FaceGroupAdditionRequest faceGroupAdditionRequest) { String body = JSONObject.toJSONString(faceGroupAdditionRequest); @@ -212,7 +282,7 @@ * 批量添加海康组织 * api->hik批量添加组织api->response */ - @PostMapping("/org/batch/add") + @PostMapping("/hik/org/batch/add") @ResponseBody public Object orgBatchAdd(@RequestBody List orgBatchAddRequest) { String body = JSONObject.toJSONString(orgBatchAddRequest); @@ -232,4 +302,62 @@ return ResponseData.error("批量添加组织失败"); } + /** + * 获取人员列表 + */ + @PostMapping("/hik/person/personList") + @ResponseBody + public Object personList() { + PersonListRequest request = new PersonListRequest(); + request.setPageNo(1); + request.setPageSize(100); + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi("/api/resource/v2/person/personList", body); + return resultStr; + } + + /** + * 获取组织列表 + */ + @PostMapping("/hik/org/orgList") + @ResponseBody + public Object orgList() { + PersonListRequest request = new PersonListRequest(); + request.setPageNo(1); + request.setPageSize(100); + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi("/api/resource/v1/org/orgList", body); + return resultStr; + } + + /** + * 查询访客权限下载记录 + */ + @PostMapping("/hik/auth/result") + @ResponseBody + public Object authResult() { + PersonListRequest request = new PersonListRequest(); + request.setPageNo(1); + request.setPageSize(100); + request.setOrderId("ba101db6246711edaea66f7939a13638"); + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi("/api/visitor/v1/auth/result", body); + return resultStr; + } + + /** + * 人脸图片获取 + */ + @PostMapping("/hik/face/picture") + @ResponseBody + public Object facePicture() { + FaceRequest request = new FaceRequest(); +// List list = new ArrayList<>(); +// list.add(""); + request.setCertificateNum("wanggong"); + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi("/api/frs/v1/face", body); + return resultStr; + } + } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/AssetInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/AssetInfoMapper.java index 4f64e83..c0684ee 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/AssetInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/AssetInfoMapper.java @@ -17,6 +17,6 @@ @Mapper public interface AssetInfoMapper extends BaseMapper { - List getAssetInfoListPage(@Param("page") Page page, AssetInfoRequest assetInfoRequest); + List getAssetInfoListPage(@Param("page") Page page, @Param("assetInfoRequest") AssetInfoRequest assetInfoRequest); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/AttendanceInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/AttendanceInfoMapper.java index f9e793e..ec87e46 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/AttendanceInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/AttendanceInfoMapper.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.statistics.AttendanceNumberDTO; import com.casic.missiles.modular.dto.statistics.AttendanceRatioDTO; import com.casic.missiles.modular.model.AttendanceInfo; import org.apache.ibatis.annotations.Mapper; @@ -17,7 +18,7 @@ */ @Mapper public interface AttendanceInfoMapper extends BaseMapper { - List getAttendanceInfoListPage(@Param("page") Page page, StaffInfoRequest attendanceInfoRequest); + List getAttendanceInfoListPage(@Param("page") Page page, @Param("attendanceInfoRequest") StaffInfoRequest attendanceInfoRequest); AttendanceInfo selectByCodeAndDate(@Param("staffCode") String staffCode); @@ -26,4 +27,8 @@ List getCountByTypeAndDateForMonth(@Param("staffType")String staffType); List getCountByTypeAndDateForYear(@Param("staffType")String staffType); + + List getCountForWeek(); + + List getCountForDay(); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java index ce94b8f..6137a7d 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java @@ -17,5 +17,5 @@ @Mapper public interface BlackInfoMapper extends BaseMapper { - List getBlackInfoListPage(@Param("page") Page page, BlackInfoRequest blackInfoRequest); + List getBlackInfoListPage(@Param("page") Page page, @Param("blackInfoRequest") BlackInfoRequest blackInfoRequest); } 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 efda6b3..50aaa6f 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 @@ -20,7 +20,7 @@ List getCaseInfoListPage(@Param("page") Page page, @Param("caseInfoRequest") CaseInfoRequest caseInfoRequest); - int updateStatusById(CaseInfoRequest caseInfoRequest); + int updateStatusById(@Param("caseInfoRequest") CaseInfoRequest caseInfoRequest); List selectByLevelAndMonth(@Param("year") String year); @@ -47,4 +47,20 @@ List selectPreWeekCountByThirtyDay(); List selectPreDayCountBySevenDay(); + + Integer selectDemobilizedCount(@Param("eventType") Number personnelDemobilizedEvent); + + List selectPreMonthCount(); + + List selectListBySevenDay(); + + List selectListByToday(); + + List selectListByToday2(); + + List selectListByToday3(); + + List selectListByType(@Param("eventType") Number eventType); + + List selectDemobilizedCountByHour(@Param("eventType") Number eventType); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/CategoryLevelMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/CategoryLevelMapper.java index 52fc714..afe1650 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/CategoryLevelMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/CategoryLevelMapper.java @@ -17,9 +17,9 @@ @Mapper public interface CategoryLevelMapper extends BaseMapper { - List getCaseCategoryLevelListPage(@Param("page") Page page, CategoryLevelRequest categoryLevelRequest); + List getCaseCategoryLevelListPage(@Param("page") Page page, @Param("categoryLevelRequest") CategoryLevelRequest categoryLevelRequest); - List getCaseCategoryLevelList(CategoryLevelRequest categoryLevelRequest); + List getCaseCategoryLevelList(@Param("categoryLevelRequest") CategoryLevelRequest categoryLevelRequest); CaseCategoryLevel getCaseCategoryLevel(@Param("categoryLevelCode") String categoryLevelCode); 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 66353b1..2555a09 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 @@ -19,7 +19,7 @@ @Mapper public interface DeviceInfoMapper extends BaseMapper { - List getDeviceInfoListPage(@Param("page") Page page, DeviceInfoRequest deviceInfoRequest); + List getDeviceInfoListPage(@Param("page") Page page, @Param("deviceInfoRequest") DeviceInfoRequest deviceInfoRequest); List getDeviceInfoList(@Param("deviceInfoRequest") DeviceInfoRequest deviceInfoRequest); @@ -27,6 +27,8 @@ DeviceInfo getByIndexCode(@Param("srcIndex") String srcIndex); + DeviceInfo getByIp(@Param("ip") String ip); + List selectIndexCodesByCodes(@Param("deviceCodes") List deviceCodes); List selectByType(@Param("devType") String devType); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java index 41dd0af..5bfaf63 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java @@ -5,6 +5,7 @@ import com.casic.missiles.modular.dto.DeviceRepairRequest; import com.casic.missiles.modular.model.DeviceRepairLog; import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; import java.util.List; @@ -16,7 +17,7 @@ @Mapper public interface DeviceRepairLogMapper extends BaseMapper { - List getDeviceRepairListPage(Page page, DeviceRepairRequest deviceRepairRequest); + List getDeviceRepairListPage(@Param("page") Page page, @Param("deviceRepairRequest")DeviceRepairRequest deviceRepairRequest); - List getDeviceRepairList(DeviceRepairRequest deviceRepairRequest); + List getDeviceRepairList(@Param("deviceRepairRequest") DeviceRepairRequest deviceRepairRequest); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/BlackListController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/BlackListController.java index a27f9f8..0c06661 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/BlackListController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/BlackListController.java @@ -1,13 +1,18 @@ package com.casic.missiles.modular.controller; +import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.base.controller.ExportController; import com.casic.missiles.core.page.PageFactory; import com.casic.missiles.model.response.ResponseData; import com.casic.missiles.modular.dto.BlackInfoRequest; +import com.casic.missiles.modular.dto.BlackPictureRequest; +import com.casic.missiles.modular.dto.hik.PersonInfoRequest; +import com.casic.missiles.modular.enums.HikUri; import com.casic.missiles.modular.enums.OperateTypeEnum; import com.casic.missiles.modular.model.BlackInfo; import com.casic.missiles.modular.service.BlackInfoService; +import com.casic.missiles.modular.util.HikUtil; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; @@ -56,4 +61,22 @@ return null; } + /** + * 黑名单人员照片 + */ + @PostMapping("/personPicture") + @ResponseBody + public Object personPicture(@RequestBody BlackPictureRequest blackPictureRequest){ + //获取照片 + String picUri = blackPictureRequest.getPicUri(); + String serverIndexCode = blackPictureRequest.getServerIndexCode(); + PersonInfoRequest picRequest = new PersonInfoRequest(); + picRequest.setPicUri(picUri); + picRequest.setServerIndexCode(serverIndexCode); + String reBody = JSONObject.toJSONString(picRequest); + //重定向地址获取 + String url = HikUtil.hikApiFor302(HikUri.PERSON_PICTURE, reBody); + return ResponseData.success(url); + } + } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/DeviceController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/DeviceController.java index e1c4eba..666bbee 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/DeviceController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/DeviceController.java @@ -107,7 +107,7 @@ } /** - * 设备维修管理查询(分页),需计算MTTR=总维修时间/故障次数 + * 设备状态计算与评判/设备维修管理查询(分页),需计算MTTR=总维修时间/故障次数 */ @PostMapping("/repair/listPage") @ResponseBody @@ -211,7 +211,7 @@ //需根据设备编号获取到对应的门禁点唯一标识 doorControlRequest.setDoorIndexCodes(indexCodes); doorControlRequest.setControlType(Integer.valueOf(gateGroupDTO.getStatus())); - String body = JSONObject.toJSONString(deviceCodes); + String body = JSONObject.toJSONString(doorControlRequest); String resultStr = HikUtil.hikApi(HikUri.DOOR_CONTROL, body); JSONObject resultJson = (JSONObject)JSONObject.parse(resultStr); if (!"0".equals(resultJson.get("code"))) { diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/StaffController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/StaffController.java index b58ccab..704093c 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/StaffController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/StaffController.java @@ -2,15 +2,21 @@ import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.util.StrUtil; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.base.controller.ExportController; import com.casic.missiles.core.page.PageFactory; import com.casic.missiles.model.response.ErrorResponseData; import com.casic.missiles.model.response.ResponseData; import com.casic.missiles.modular.dto.StaffInfoRequest; +import com.casic.missiles.modular.dto.hik.PersonInfoRequest; +import com.casic.missiles.modular.dto.hik.StaffCardRequest; +import com.casic.missiles.modular.enums.HikUri; import com.casic.missiles.modular.enums.OperateTypeEnum; import com.casic.missiles.modular.model.StaffInfo; import com.casic.missiles.modular.service.StaffInfoService; +import com.casic.missiles.modular.util.HikUtil; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; @@ -110,4 +116,60 @@ } return ResponseData.success(); } + + /** + * 批量开卡,添加人员之后调用,若在一个接口中添加人员成功开卡失败则第二次添加时会有问题 + */ + @PostMapping("/cardBinding") + @ResponseBody + public Object cardBinding(@RequestBody StaffCardRequest staffCardRequest) { + String body = JSONObject.toJSONString(staffCardRequest); + String resultStr = HikUtil.hikApi(HikUri.CARD_BINDING, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (!"0".equals(resultJson.get("code"))) { + log.error("请求海康,批量开卡失败,海康response:{}", resultStr); + return ResponseData.error("批量开卡失败"); + } + //保存卡号 + if(staffInfoService.saveCardInfo(staffCardRequest) > 0){ + return ResponseData.success(); + } + return ResponseData.error("批量开卡失败"); + } + + /** + * 获取员工照片,海康存储 + */ + @PostMapping("/personPicture/{staffCode}") + @ResponseBody + public Object personPicture(@PathVariable("staffCode") String staffCode){ + //获取员工详细信息,含图片服务器、uri + PersonInfoRequest request = new PersonInfoRequest(); + List list = new ArrayList<>(); + list.add(staffCode); + request.setParamName("personId"); + request.setParamValue(list); + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi(HikUri.PERSON_INFO, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (!"0".equals(resultJson.get("code"))) { + log.error("请求海康,根据人员唯一字段获取人员详细信息失败,海康response:{}", resultStr); + return ResponseData.error("获取员工照片失败"); + } + //获取照片 + JSONObject data = (JSONObject) resultJson.get("data"); + JSONArray dataArray = (JSONArray) data.get("list"); + JSONObject jsonObject = (JSONObject) dataArray.get(0); + JSONArray personPhoto = (JSONArray) jsonObject.get("personPhoto"); + JSONObject photo = (JSONObject) personPhoto.get(0); + String picUri = photo.getString("picUri"); + String serverIndexCode = photo.getString("serverIndexCode"); + PersonInfoRequest picRequest = new PersonInfoRequest(); + picRequest.setPicUri(picUri); + picRequest.setServerIndexCode(serverIndexCode); + String reBody = JSONObject.toJSONString(picRequest); + //重定向地址获取 + String url = HikUtil.hikApiFor302(HikUri.PERSON_PICTURE, reBody); + return ResponseData.success(url); + } } 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 4a07dd9..7b1dcf6 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 @@ -16,6 +16,7 @@ import com.casic.missiles.modular.redis.key.CacheKeys; import com.casic.missiles.modular.service.CockpitService; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.util.CollectionUtils; import org.springframework.web.bind.annotation.*; @@ -24,10 +25,7 @@ import java.text.NumberFormat; import java.time.LocalDateTime; import java.time.temporal.ChronoUnit; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.util.*; import java.util.stream.Collectors; /** @@ -73,6 +71,9 @@ private StatisticNumberMapper numberMapper; @Autowired + private HazardLevelMapper hazardLevelMapper; + + @Autowired private AccessGroupConfig accessGroupConfig; /** @@ -104,8 +105,24 @@ public Object buildingNumberPerHour(){ //当天按小时分组的人数 List list = numberMapper.selectListByTime(); - Map> collect = list.stream().collect(Collectors.groupingBy(BuildingNumberDTO::getStatisticPosition)); - return ResponseData.success(collect); + Map> collect = list.stream().collect(Collectors.groupingBy(BuildingNumberDTO::getStatisticTime)); + //定时任务中已将每小时三栋楼人数存到数据库 + //将一期主楼和录制楼人数合并,二期单算 + List> resultList = new ArrayList<>(); + collect.keySet().forEach(key -> { + List buildingNumberDTOS = collect.get(key); + BuildingNumberDTO mainBuildingOne = buildingNumberDTOS.get(0); + BuildingNumberDTO mainBuildingTwo = buildingNumberDTOS.get(1); + BuildingNumberDTO recordingBuilding = buildingNumberDTOS.get(2); + HashMap resultMap = new HashMap<>(); + Integer oneQuantity = Integer.valueOf(mainBuildingOne.getStatisticQuantity()); + Integer recordingQuantity = Integer.valueOf(recordingBuilding.getStatisticQuantity()); + resultMap.put("staticTime", mainBuildingOne.getStatisticTime()); + resultMap.put(mainBuildingOne.getStatisticPositionName()+"、"+recordingBuilding.getStatisticPositionName(), String.valueOf(oneQuantity+recordingQuantity)); + resultMap.put(mainBuildingTwo.getStatisticPositionName(), mainBuildingTwo.getStatisticQuantity()); + resultList.add(resultMap); + }); + return ResponseData.success(resultList); } /** @@ -151,12 +168,11 @@ public Object securityNumber() { QueryWrapper wrapper = new QueryWrapper<>(); wrapper.eq("staff_type", 2); + // TODO: 2022/9/2 后续使用产品确定的每天出勤的安保人员的数量 Integer total = staffInfoMapper.selectCount(wrapper); - //当日离岗事件个数 - QueryWrapper wrapper1 = new QueryWrapper<>(); - wrapper1.eq("hik_event_type", SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); - wrapper1.apply("date_format(now(),'%Y-%m-%d') = date_format(happen_time,'%Y-%m-%d')"); - Integer leave = caseInfoMapper.selectCount(wrapper1); + //当日离岗事件按设备去重后的个数 + // TODO: 2022/9/2 目前相当于24小时内的计算,之后看需要可改成自定义小时数计算离岗率,即离岗+6小时内仅一次离岗则恢复为100%,多次则累加离岗次数计算离岗率 + Integer leave = caseInfoMapper.selectDemobilizedCount(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); NumberFormat numberFormat = NumberFormat.getInstance(); // 设置精确到小数点后2位 numberFormat.setMaximumFractionDigits(2); @@ -179,7 +195,6 @@ @ResponseBody public Object visitorApplyDetail() { List reasonGroup = applyMapper.selectByVisitReason(); - HashMap resultMap = new HashMap<>(); NumberFormat numberFormat = NumberFormat.getInstance(); // 设置精确到小数点后2位 numberFormat.setMaximumFractionDigits(2); @@ -187,12 +202,17 @@ if(0 == sum){ return ResponseData.success(); } + List resultList = new ArrayList<>(); reasonGroup.forEach(group -> { String reasonName = dictService.getDictNameByCode(SecurityEventDict.VISIT_REASON, group.getVisitReason()); String result = numberFormat.format((float) group.getQuantity() / (float) sum * 100); - resultMap.put(reasonName, result+"%"); + ApplyReasonGroupDTO applyReasonGroupDTO = new ApplyReasonGroupDTO(); + applyReasonGroupDTO.setQuantity(group.getQuantity()); + applyReasonGroupDTO.setVisitReason(reasonName); + applyReasonGroupDTO.setRatio(result+"%"); + resultList.add(applyReasonGroupDTO); }); - return ResponseData.success(resultMap); + return ResponseData.success(resultList); } /** @@ -247,6 +267,32 @@ } /** + * 机动力量实时在岗率,在岗人数除以总应在岗人数,用离岗+6小时内恢复为100%,6小时外再计算 + */ + @GetMapping("/staff/beOnDutyRatio") + @ResponseBody + public Object beOnDutyRatio() { + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("staff_type", 2); + // TODO: 2022/9/2 后续使用产品确定的每天出勤的安保人员的数量 + Integer total = staffInfoMapper.selectCount(wrapper); + if(0 == total){ + return ResponseData.success(null); + } + //当日离岗事件按设备去重后的个数 + // TODO: 2022/9/2 目前相当于24小时内的计算,之后看需要可改成自定义小时数计算离岗率,即离岗+6小时内仅一次离岗则恢复为100%,多次则累加离岗次数计算离岗率 + List onDutyRatioDTOS = caseInfoMapper.selectDemobilizedCountByHour(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); + onDutyRatioDTOS.forEach(dto -> { + NumberFormat numberFormat = NumberFormat.getInstance(); + // 设置精确到小数点后2位 + numberFormat.setMaximumFractionDigits(2); + String result = numberFormat.format(100 - Float.valueOf(dto.getQuantity()) / (float) total * 100); + dto.setRatio(result+"%"); + }); + return ResponseData.success(onDutyRatioDTOS); + } + + /** * 闸机速通门统计-设备状态分组计算数量,devType传闸机字典key * 视频频监控摄像机统计-设备状态分组计算数量,devType传摄像头字典key */ @@ -262,12 +308,17 @@ if(sum <= 0){ return ResponseData.error("无该类设备信息"); } + List resultList = new ArrayList<>(); gateStatusGroup.forEach(group -> { String devStatus = dictService.getDictNameByCode(SecurityEventDict.DEVICE_STATUS, group.getStatus()); String result = numberFormat.format((float) group.getQuantity() / (float) sum * 100); - resultMap.put(devStatus, result+"%"); + GateStatusGroupResponse gateStatusGroupResponse = new GateStatusGroupResponse(); + gateStatusGroupResponse.setStatus(devStatus); + gateStatusGroupResponse.setRatio(result+"%"); + resultList.add(gateStatusGroupResponse); }); - resultMap.put("总", sum); + resultMap.put("total", sum); + resultMap.put("list", resultList); return ResponseData.success(resultMap); } @@ -282,17 +333,38 @@ String position = securityScoreDTO.getPosition(); List caseInfos = caseInfoMapper.selectByPosition(position); //查询各危险级别权重、各类别权重,放入map,避免循环中多次查数据库 - + HashMap hazardScoreMap = new HashMap<>(); + List caseHazardLevelList = hazardLevelMapper.getCaseHazardLevelList(null); + caseHazardLevelList.forEach(hazardLevel -> { + hazardScoreMap.put(hazardLevel.getCode(), hazardLevel.getWeight()); + }); + HashMap categoryScoreMap = new HashMap<>(); + List categoryLevelList = categoryLevelMapper.getCaseCategoryLevelList(null); + categoryLevelList.forEach(categoryLevel -> { + categoryScoreMap.put(categoryLevel.getCode(), categoryLevel.getWeight()); + }); + //事件按楼层分组,计算 List securityScoreDTOs = new ArrayList<>(); caseInfos.forEach(caseInfo -> { SecurityScoreDTO securityScoreDTO1 = new SecurityScoreDTO(); + securityScoreDTO1.setPosition(caseInfo.getPosition()); securityScoreDTO1.setArea(caseInfo.getArea()); - // TODO: 2022/8/4 楼层评分计算根据产品定义调整 -// caseInfo.get -// securityScoreDTO1.setScore(); + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); + Double score = 100 - Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + securityScoreDTO1.setScore(score); + securityScoreDTOs.add(securityScoreDTO1); }); - - return null; + 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); + }); + return ResponseData.success(securityScoreDTOs); } /** @@ -303,9 +375,13 @@ public Object SecurityFrequency(@RequestBody SecurityFrequencyDTO securityFrequencyDTO) { String year = securityFrequencyDTO.getYear(); String month = securityFrequencyDTO.getMonth(); - Integer quantity = caseInfoMapper.selectCountByMonth(year, month); - securityFrequencyDTO.setQuantity(quantity); - return ResponseData.success(securityFrequencyDTO); + if(!StringUtils.isEmpty(year) && StringUtils.isEmpty(month)){ + Integer quantity = caseInfoMapper.selectCountByMonth(year, month); + securityFrequencyDTO.setQuantity(quantity); + return ResponseData.success(securityFrequencyDTO); + } + List list = caseInfoMapper.selectPreMonthCount(); + return ResponseData.success(list); } } 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 ae4d770..f4f075c 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 @@ -1,20 +1,25 @@ package com.casic.missiles.modular.controller.cockpit; +import cn.hutool.core.date.DateUnit; import cn.hutool.core.date.DateUtil; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.casic.missiles.model.response.ResponseData; -import com.casic.missiles.modular.dao.AttendanceInfoMapper; -import com.casic.missiles.modular.dao.CaseInfoMapper; -import com.casic.missiles.modular.dao.HazardLevelMapper; -import com.casic.missiles.modular.dao.StaffInfoMapper; +import com.casic.missiles.modular.dao.*; +import com.casic.missiles.modular.dto.DeviceRepairLogDTO; +import com.casic.missiles.modular.dto.DeviceRepairRequest; import com.casic.missiles.modular.dto.statistics.*; +import com.casic.missiles.modular.enums.SecurityEventType; +import com.casic.missiles.modular.model.CaseCategoryLevel; import com.casic.missiles.modular.model.CaseHazardLevel; +import com.casic.missiles.modular.model.CaseInfo; import com.casic.missiles.modular.model.StaffInfo; +import com.casic.missiles.modular.service.DeviceInfoService; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.util.CollectionUtils; import org.springframework.web.bind.annotation.*; +import java.math.BigDecimal; import java.text.NumberFormat; import java.util.*; import java.util.stream.Collectors; @@ -40,6 +45,12 @@ @Autowired private HazardLevelMapper hazardLevelMapper; + @Autowired + private CategoryLevelMapper categoryLevelMapper; + + @Autowired + private DeviceInfoService deviceInfoService; + /** * 安防事件时域频次统计,每月的每天安防事件个数(原方案) * 月维度:展示每个月的每天的数据 @@ -89,15 +100,17 @@ List monthList = caseInfoMapper.selectPreMonthCountByYear(year); Map> collect = monthList.stream().collect(Collectors.groupingBy(PreMonthOrWeekCaseDTO::getHazardLevelCode)); HashMap strAvgMap = new HashMap<>(); + List resultList = new ArrayList<>(); for (String key : collect.keySet()) { List preMonthOrWeekCaseDTOS = collect.get(key); int sum = preMonthOrWeekCaseDTOS.stream().mapToInt(PreMonthOrWeekCaseDTO::getQuantity).sum(); //若年份是本年,则使用个安防级别数量/当前月份数 //若不是本年,除数为12 MonthAndWeekDTO monthAndWeekDTO = new MonthAndWeekDTO(); + String hazardName = hazardLevelMapper.selectHazardNameByCode(key); + monthAndWeekDTO.setLevelName(hazardName); if(year.equals(String.valueOf(DateUtil.thisYear()))){ monthAndWeekDTO.setMonthQuantity(sum / DateUtil.thisMonth()); -// monthAndWeekDTO.setLevelName(); strAvgMap.put(key, monthAndWeekDTO); }else{ monthAndWeekDTO.setMonthQuantity(sum / 12); @@ -113,27 +126,37 @@ if(year.equals(String.valueOf(DateUtil.thisYear()))){ if(!Objects.isNull(strAvgMap.get(key))){ MonthAndWeekDTO monthAndWeekDTO = strAvgMap.get(key); + String hazardName = hazardLevelMapper.selectHazardNameByCode(key); + monthAndWeekDTO.setLevelName(hazardName); monthAndWeekDTO.setWeekQuantity(sum / DateUtil.thisWeekOfYear()); strAvgMap.put(key, monthAndWeekDTO); }else{ MonthAndWeekDTO monthAndWeekDTO = new MonthAndWeekDTO(); + String hazardName = hazardLevelMapper.selectHazardNameByCode(key); + monthAndWeekDTO.setLevelName(hazardName); monthAndWeekDTO.setWeekQuantity(sum / DateUtil.thisWeekOfYear()); strAvgMap.put(key, monthAndWeekDTO); } }else{ if(!Objects.isNull(strAvgMap.get(key))){ MonthAndWeekDTO monthAndWeekDTO = strAvgMap.get(key); + String hazardName = hazardLevelMapper.selectHazardNameByCode(key); + monthAndWeekDTO.setLevelName(hazardName); monthAndWeekDTO.setWeekQuantity(sum / 52); strAvgMap.put(key, monthAndWeekDTO); }else{ MonthAndWeekDTO monthAndWeekDTO = new MonthAndWeekDTO(); + String hazardName = hazardLevelMapper.selectHazardNameByCode(key); + monthAndWeekDTO.setLevelName(hazardName); monthAndWeekDTO.setWeekQuantity(sum / 52); strAvgMap.put(key, monthAndWeekDTO); } } } - avgMonthAndWeekGroupDTO.setMap(strAvgMap); - return ResponseData.success(avgMonthAndWeekGroupDTO); + strAvgMap.keySet().forEach(key -> { + resultList.add(strAvgMap.get(key)); + }); + return ResponseData.success(resultList); } /** @@ -181,12 +204,178 @@ } /** - * 员工考勤人数变化,功能待定 + * 员工考勤人数变化,统计当天(横坐标为时)及近7天(横坐标为天)的考勤人数变化,只要发生一次考勤识别,次数的基数就正常增加(没有上班下班区分) */ + @PostMapping("/staff/attendanceNumber/{dimension}") + @ResponseBody + public Object attendanceNumber(@PathVariable("dimension") String dimension) { + List attendanceNumberDTOs = null; + List> resultList = new ArrayList<>(); + if("week".equals(dimension)){ + //近7天数据按天分组统计 + attendanceNumberDTOs = attendanceInfoMapper.getCountForWeek(); + }else if("day".equals(dimension)) { + //今天数据按小时分组统计 + attendanceNumberDTOs = attendanceInfoMapper.getCountForDay(); + } + if(CollectionUtils.isEmpty(attendanceNumberDTOs)){ + return ResponseData.error("该查询条件下,无员工出勤数据!"); + } + Map> collect = attendanceNumberDTOs.stream().collect(Collectors.groupingBy(AttendanceNumberDTO::getDate)); + collect.keySet().forEach(key -> { + List attendanceNumberDTOS = collect.get(key); + AttendanceNumberDTO attendanceNumberDTO = attendanceNumberDTOS.get(0); + AttendanceNumberDTO attendanceNumberDTO2 = attendanceNumberDTOS.get(1); + Map resultMap = new HashMap<>(); + resultMap.put(attendanceNumberDTO.getStaffType(), attendanceNumberDTO.getQuantity()); + resultMap.put(attendanceNumberDTO2.getStaffType(), attendanceNumberDTO2.getQuantity()); + resultMap.put("staticTime", attendanceNumberDTO.getDate()); + resultList.add(resultMap); + }); + return ResponseData.success(resultList); + } /** - * 近30天/近一周安保人员到岗排行 + * 早晚高峰区域安防评估 */ + @PostMapping("/security/assessment/{dimension}") + @ResponseBody + public Object securityAssessment(@PathVariable("dimension") String dimension) { + //查询各危险级别权重、各类别权重,放入map,避免循环中多次查数据库 + HashMap hazardScoreMap = new HashMap<>(); + List caseHazardLevelList = hazardLevelMapper.getCaseHazardLevelList(null); + caseHazardLevelList.forEach(hazardLevel -> { + hazardScoreMap.put(hazardLevel.getCode(), hazardLevel.getWeight()); + }); + HashMap categoryScoreMap = new HashMap<>(); + List categoryLevelList = categoryLevelMapper.getCaseCategoryLevelList(null); + categoryLevelList.forEach(categoryLevel -> { + categoryScoreMap.put(categoryLevel.getCode(), categoryLevel.getWeight()); + }); + HashMap hashMap = new HashMap<>(); + if("week".equals(dimension)){ + //近7天早晚高峰数据 + List caseInfos = caseInfoMapper.selectListBySevenDay(); + //按时间(天)进行分组 + caseInfos.forEach(caseInfo -> { + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); + Double score = Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + String[] array = caseInfo.getHappenTime().split(" "); + String dayTime = array[0]; + BigDecimal preScore; + if(hashMap.containsKey(dayTime)){ + Double aDouble = hashMap.get(dayTime); + preScore = new BigDecimal(aDouble.toString()); + + }else{ + preScore = new BigDecimal("100.0"); + } + BigDecimal nowScore = new BigDecimal(score.toString()); + hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); + }); + return ResponseData.success(hashMap); + }else if("day".equals(dimension)) { + //今天数据按小时分组统计 + List caseInfos = caseInfoMapper.selectListByToday(); + caseInfos.forEach(caseInfo -> { + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); + Double score = Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + String[] array = caseInfo.getHappenTime().split(":"); + String dayTime = array[0]; + BigDecimal preScore; + if(hashMap.containsKey(dayTime)){ + Double aDouble = hashMap.get(dayTime); + preScore = new BigDecimal(aDouble.toString()); + + }else{ + preScore = new BigDecimal("100.0"); + } + BigDecimal nowScore = new BigDecimal(score.toString()); + hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); + }); + return ResponseData.success(hashMap); + } + return null; + } + + /** + * 重点区域安防事态评估,统计重点区域6:00-23:00按小时分组数据 + */ + @GetMapping("/security/keyAreaStatistic") + @ResponseBody + public Object keyAreaStatistic() { + //查询各危险级别权重、各类别权重,放入map,避免循环中多次查数据库 + HashMap hazardScoreMap = new HashMap<>(); + List caseHazardLevelList = hazardLevelMapper.getCaseHazardLevelList(null); + caseHazardLevelList.forEach(hazardLevel -> { + hazardScoreMap.put(hazardLevel.getCode(), hazardLevel.getWeight()); + }); + HashMap categoryScoreMap = new HashMap<>(); + List categoryLevelList = categoryLevelMapper.getCaseCategoryLevelList(null); + categoryLevelList.forEach(categoryLevel -> { + categoryScoreMap.put(categoryLevel.getCode(), categoryLevel.getWeight()); + }); + HashMap hashMap = new HashMap<>(); + //今天数据按小时分组统计 + List caseInfos = caseInfoMapper.selectListByToday2(); + caseInfos.forEach(caseInfo -> { + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); + Double score = Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + String[] array = caseInfo.getHappenTime().split(":"); + String dayTime = array[0]; + BigDecimal preScore; + if(hashMap.containsKey(dayTime)){ + Double aDouble = hashMap.get(dayTime); + preScore = new BigDecimal(aDouble.toString()); + + }else{ + preScore = new BigDecimal("100.0"); + } + BigDecimal nowScore = new BigDecimal(score.toString()); + hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); + }); + return ResponseData.success(hashMap); + } + + /** + * 安防机动支援力量调配响应评估,根据事件已解决状态及已解决时间-发送时间,按时间(小时)分组统计 + */ + @GetMapping("/security/responseAssess") + @ResponseBody + public Object responseAssess() { + //查询各危险级别权重、各类别权重,放入map,避免循环中多次查数据库 + HashMap hazardScoreMap = new HashMap<>(); + List caseHazardLevelList = hazardLevelMapper.getCaseHazardLevelList(null); + caseHazardLevelList.forEach(hazardLevel -> { + hazardScoreMap.put(hazardLevel.getCode(), hazardLevel.getWeight()); + }); + HashMap hashMap = new HashMap<>(); + //今天数据按小时分组统计 + List caseInfos = caseInfoMapper.selectListByToday3(); + caseInfos.forEach(caseInfo -> { + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + //扣分=事件级别权重*未解决小时数 + Date updateTime = DateUtil.parse(caseInfo.getUpdateTime()); + Date happenTime = DateUtil.parse(caseInfo.getHappenTime()); + long between = DateUtil.between(updateTime, happenTime, DateUnit.HOUR); + Double score = Double.valueOf(hazardWeight)*between; + String[] array = caseInfo.getHappenTime().split(":"); + String dayTime = array[0]; + BigDecimal preScore; + if(hashMap.containsKey(dayTime)){ + Double aDouble = hashMap.get(dayTime); + preScore = new BigDecimal(aDouble.toString()); + }else{ + preScore = new BigDecimal("100.0"); + } + BigDecimal nowScore = new BigDecimal(score.toString()); + hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); + }); + return ResponseData.success(hashMap); + } /** * 重点区域威胁事件类型统计,优先级2,统计近7天和近30天 @@ -224,7 +413,34 @@ } /** - * 设备状态计算系数和评判,优先级3,需确认设备恢复时间是否可以获取 + * 近30天/近一周安保人员到岗排行 */ + + /** + * 安保等级评估,发生离岗事件减1分 + */ + @GetMapping("/security/levelAssess") + @ResponseBody + public Object securityLevelAssess() { + //今天数据按小时分组统计 + List resultList = caseInfoMapper.selectListByType(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); + resultList.forEach(result -> { + BigDecimal deScore = new BigDecimal(result.getQuantity()); + BigDecimal preScore = new BigDecimal("100.0"); + result.setScore(preScore.subtract(deScore).doubleValue()); + }); + return ResponseData.success(resultList); + } + + /** + * 设备状态计算系数和评判,即设备维修管理查询(不分页) + */ + @PostMapping("/device/repairList") + @ResponseBody + public Object repairList(@RequestBody DeviceRepairRequest deviceRepairRequest) { + List deviceRepairLogDTOS = deviceInfoService.deviceRepairListPage(deviceRepairRequest); + return ResponseData.success(deviceRepairLogDTOS); + } + } 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 fbf8ab6..c71a15a 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 @@ -1,13 +1,12 @@ package com.casic.missiles.modular.controller.hik; +import cn.hutool.core.date.DateTime; +import cn.hutool.core.date.DateUtil; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.casic.missiles.model.response.ResponseData; import com.casic.missiles.modular.dao.HikFaceGroupInfoMapper; -import com.casic.missiles.modular.dto.hik.EventSubscribeRequest; -import com.casic.missiles.modular.dto.hik.FaceGroupAdditionRequest; -import com.casic.missiles.modular.dto.hik.HikRecvEvent; -import com.casic.missiles.modular.dto.hik.OrgBatchAdd; +import com.casic.missiles.modular.dto.hik.*; import com.casic.missiles.modular.enums.HikUri; import com.casic.missiles.modular.enums.SecurityEventType; import com.casic.missiles.modular.model.CaseInfo; @@ -18,16 +17,20 @@ import com.casic.missiles.modular.util.CaseInfoFactoryUtil; import com.casic.missiles.modular.util.HikUtil; import com.casic.missiles.modular.util.ThreadPoolUtil; +import com.casic.missiles.modular.util.WebSocket; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; -import org.springframework.web.bind.annotation.*; +import org.springframework.util.CollectionUtils; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.RestController; -import java.net.InetAddress; -import java.net.UnknownHostException; import java.util.ArrayList; +import java.util.Iterator; import java.util.List; import java.util.Objects; @@ -38,7 +41,6 @@ */ @Slf4j @RestController -@RequestMapping("/hik") public class HikController { @Autowired @@ -53,28 +55,37 @@ @Autowired private HikService hikService; + @Autowired + private HikFaceGroupInfoMapper hikFaceGroupInfoMapper; + + @Autowired + private WebSocket webSocket; + @Value("${server.port}") private int serverPort; - @Autowired - private HikFaceGroupInfoMapper hikFaceGroupInfoMapper; /** * 海康事件订阅 */ - @PostMapping("/event/subscribe") + @PostMapping("/hik/event/subscribe") @ResponseBody - public Object eventSubscribe() throws UnknownHostException { + public Object eventSubscribe() { EventSubscribeRequest eventSubscribeRequest = new EventSubscribeRequest(); ArrayList list = new ArrayList<>(); list.add(SecurityEventType.DEVICE_OFFLINE); + list.add(SecurityEventType.DEVICE_ONLINE); list.add(SecurityEventType.KEY_PERSONNEL_IDENTIFY_EVENT); list.add(SecurityEventType.MONITORING_POINT_OFFLINE); + list.add(SecurityEventType.MONITORING_POINT_ONLINE); list.add(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); list.add(SecurityEventType.PERSONNEL_GATHER_EVENT); - InetAddress localHost = InetAddress.getLocalHost(); + list.add(SecurityEventType.VISITOR_REGISTER); + list.add(SecurityEventType.VISITOR_CHECKOUT); + list.add(SecurityEventType.HIGH_ALTITUDE_PARABOLIC); +// InetAddress localHost = InetAddress.getLocalHost(); eventSubscribeRequest.setEventTypes(list); - eventSubscribeRequest.setEventDest("https://" + localHost + ":" + serverPort + "/eventRcv"); + eventSubscribeRequest.setEventDest("http://" + "192.168.10.6" + ":" + serverPort + "/eventRcv"); //订阅类型,0-订阅原始事件,1-联动事件,2-原始事件和联动事件,不填使用默认值0 eventSubscribeRequest.setSubType(0); /** @@ -92,19 +103,25 @@ } /** + * 查询事件订阅信息 + */ + @PostMapping("/hik/event/query") + @ResponseBody + public Object eventQuery() { + String result = HikUtil.hikApi(HikUri.EVENT_INFO, ""); + return result; + } + + /** * 海康事件接收 */ @PostMapping("/eventRcv") @ResponseBody public Object eventRcv(@RequestBody HikRecvEvent hikRecvEvent) { //1、接收所需事件类型 - Long eventType = hikRecvEvent.getEventType(); + Number eventType = hikRecvEvent.getEventType(); log.info("接收到安防事件类型为:{}", eventType); CaseInfo caseInfo = caseInfoFactoryUtil.getCaseInfo(eventType); - //接收到不关心事件直接返回 - if(Objects.isNull(caseInfo)){ - return ResponseData.success(); - } //2、不同事件不同处理,caseInfoFactoryUtil已设置好事件基础定义信息 // 再为事件添加状态、设备编码、设备名称、位置、区域、时间 // 异步处理事件 @@ -114,19 +131,23 @@ caseHandle(hikRecvEvent, eventType, caseInfo); } })); +// caseHandle(hikRecvEvent, eventType, caseInfo); - return null; + return ResponseData.success(); } - private void caseHandle(HikRecvEvent hikRecvEvent, Long eventType, CaseInfo caseInfo) { + private void caseHandle(HikRecvEvent hikRecvEvent, Number eventType, CaseInfo caseInfo) { JSONArray eventArray = hikRecvEvent.getEventArray(); List caseInfos = new ArrayList<>(); - while (eventArray.stream().iterator().hasNext()) { + Iterator iterator = eventArray.iterator(); + while (iterator.hasNext()) { CaseInfo caseInfo1 = new CaseInfo(); - BeanUtils.copyProperties(caseInfo, caseInfo1); - JSONObject event = (JSONObject) eventArray.stream().iterator().next(); + if(!Objects.isNull(caseInfo)){ + BeanUtils.copyProperties(caseInfo, caseInfo1); + } + JSONObject event = (JSONObject) iterator.next(); //5种事件进行不同处理 - if(SecurityEventType.KEY_PERSONNEL_IDENTIFY_EVENT == eventType){ + if (SecurityEventType.KEY_PERSONNEL_IDENTIFY_EVENT.equals(eventType)) { //判断所属人脸分组 JSONObject data = (JSONObject) event.get("data"); JSONObject faceRecognitionResult = (JSONObject) data.get("faceRecognitionResult"); @@ -142,52 +163,101 @@ if (faceGroupCode.equals(blackListGroup.getFaceGroupCode())) { //黑名单分组处理 caseInfo1 = hikService.blackListHandle(event, caseInfo1); - }else if(faceGroupCode.equals(propertyPersonnelGroup.getFaceGroupCode())){ + } else if (faceGroupCode.equals(propertyPersonnelGroup.getFaceGroupCode())) { //考勤分组处理-物业人员,添加到考勤表 hikService.propertyAttendanceHandle(event); - }else if(faceGroupCode.equals(securityPersonnelGroup.getFaceGroupCode())){ + } else if (faceGroupCode.equals(securityPersonnelGroup.getFaceGroupCode())) { //考勤分组处理-安保人员,添加到考勤表 hikService.securityPersonnelHandle(event); - }else { + } else { return; } - }else if(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT == eventType){ + } else if (SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT.equals(eventType)) { //离岗事件处理 caseInfo1 = hikService.demobilizedHandle(event, caseInfo1); - }else if(SecurityEventType.PERSONNEL_GATHER_EVENT == eventType){ + } else if (SecurityEventType.PERSONNEL_GATHER_EVENT.equals(eventType)) { //人员聚集事件处理 caseInfo1 = hikService.personGatherHandle(event, caseInfo1); - }else if(SecurityEventType.MONITORING_POINT_OFFLINE == eventType){ + } else if (SecurityEventType.MONITORING_POINT_OFFLINE.equals(eventType)) { //监控点离线事件处理 caseInfo1 = hikService.monitorPointOfflineHandle(event, caseInfo1); - }else if(SecurityEventType.DEVICE_OFFLINE == eventType){ + } else if (SecurityEventType.MONITORING_POINT_ONLINE.equals(eventType)) { + //监控点上线事件处理 + hikService.monitorPointOnlineHandle(event); + } else if (SecurityEventType.DEVICE_OFFLINE.equals(eventType)) { //装置离线事件处理 caseInfo1 = hikService.deviceOfflineHandle(event, caseInfo1); - }else if(SecurityEventType.VISITOR_REGISTER == eventType){ + } else if (SecurityEventType.DEVICE_ONLINE.equals(eventType)) { + //装置上线处理 + hikService.deviceOnlineHandle(event); + } else if (SecurityEventType.VISITOR_REGISTER.equals(eventType)) { //记录访客登记记录,添加到访客记录表 hikService.visitorRegisterHandler(event); - }else if(SecurityEventType.VISITOR_CHECKOUT == eventType){ + } else if (SecurityEventType.VISITOR_CHECKOUT.equals(eventType)) { //记录访客签离记录 hikService.visitorCheckOutHandler(event); } - if(!Objects.isNull(caseInfo1) && !StringUtils.isEmpty(caseInfo1.getHappenTime())){ + if (!Objects.isNull(caseInfo1) && !StringUtils.isEmpty(caseInfo1.getHappenTime())) { caseInfos.add(caseInfo1); } } //3、安防事件入库 - if(!caseInfoService.insertCaseInfoBatch(caseInfos)){ - log.error("安防事件批量入库异常"); + if (!CollectionUtils.isEmpty(caseInfos) && !caseInfoService.insertCaseInfoBatch(caseInfos)) { + log.error("安防事件批量入库异常!"); } // TODO: 2022/8/15 webSocket推送 + if (CollectionUtils.isEmpty(caseInfos)) { + log.info("webSocket事件推送"); + webSocket.sendAllMessage(JSONObject.toJSONString(caseInfos)); + } return; } /** + * 以图搜图,前端用于轨迹追踪 + */ + @PostMapping("/hik/search/picture") + @ResponseBody + public Object searchPictures(@RequestBody SearchPicturesRequest searchPicturesRequest) { + DateTime startDateTime = DateUtil.parse(searchPicturesRequest.getStartTime()); + DateTime endDateTime = DateUtil.parse(searchPicturesRequest.getEndTime()); + String startTime = DateUtil.format(startDateTime, "yyyy-MM-dd'T'HH:mm:ss.SSSXXX"); + String endTime = DateUtil.format(endDateTime, "yyyy-MM-dd'T'HH:mm:ss.SSSXXX"); + searchPicturesRequest.setStartTime(startTime); + searchPicturesRequest.setEndTime(endTime); + String body = JSONObject.toJSONString(searchPicturesRequest); + String resultStr = HikUtil.hikApi(HikUri.SEARCH_PICTURES, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (!"0".equals(resultJson.get("code"))) { + log.error("请求海康,以图搜图失败,海康response:{}", resultStr); + return ResponseData.error("以图搜图失败"); + } + return ResponseData.success(resultJson); + } + + + /** + * 海康事件取消订阅 + */ + @PostMapping("/hik/event/cancel") + @ResponseBody + public Object eventCancelSubscribe(@RequestBody CancelSubscribeRequest cancelSubscribeRequest) { + String body = JSONObject.toJSONString(cancelSubscribeRequest); + String resultStr = HikUtil.hikApi(HikUri.EVENT_CANCEL, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (!"0".equals(resultJson.get("code"))) { + log.error("请求海康,取消订阅失败,海康response:{}", resultStr); + return ResponseData.error("取消订阅失败"); + } + return ResponseData.success(resultJson); + } + + /** * 单个添加海康人脸分组 * api->hik单个添加人脸分组api->response->mysql */ - @PostMapping("/faceGroup/single/add") + @PostMapping("/hik/faceGroup/single/add") @ResponseBody public Object faceGroupAddition(@RequestBody FaceGroupAdditionRequest faceGroupAdditionRequest) { String body = JSONObject.toJSONString(faceGroupAdditionRequest); @@ -212,7 +282,7 @@ * 批量添加海康组织 * api->hik批量添加组织api->response */ - @PostMapping("/org/batch/add") + @PostMapping("/hik/org/batch/add") @ResponseBody public Object orgBatchAdd(@RequestBody List orgBatchAddRequest) { String body = JSONObject.toJSONString(orgBatchAddRequest); @@ -232,4 +302,62 @@ return ResponseData.error("批量添加组织失败"); } + /** + * 获取人员列表 + */ + @PostMapping("/hik/person/personList") + @ResponseBody + public Object personList() { + PersonListRequest request = new PersonListRequest(); + request.setPageNo(1); + request.setPageSize(100); + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi("/api/resource/v2/person/personList", body); + return resultStr; + } + + /** + * 获取组织列表 + */ + @PostMapping("/hik/org/orgList") + @ResponseBody + public Object orgList() { + PersonListRequest request = new PersonListRequest(); + request.setPageNo(1); + request.setPageSize(100); + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi("/api/resource/v1/org/orgList", body); + return resultStr; + } + + /** + * 查询访客权限下载记录 + */ + @PostMapping("/hik/auth/result") + @ResponseBody + public Object authResult() { + PersonListRequest request = new PersonListRequest(); + request.setPageNo(1); + request.setPageSize(100); + request.setOrderId("ba101db6246711edaea66f7939a13638"); + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi("/api/visitor/v1/auth/result", body); + return resultStr; + } + + /** + * 人脸图片获取 + */ + @PostMapping("/hik/face/picture") + @ResponseBody + public Object facePicture() { + FaceRequest request = new FaceRequest(); +// List list = new ArrayList<>(); +// list.add(""); + request.setCertificateNum("wanggong"); + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi("/api/frs/v1/face", body); + return resultStr; + } + } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/AssetInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/AssetInfoMapper.java index 4f64e83..c0684ee 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/AssetInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/AssetInfoMapper.java @@ -17,6 +17,6 @@ @Mapper public interface AssetInfoMapper extends BaseMapper { - List getAssetInfoListPage(@Param("page") Page page, AssetInfoRequest assetInfoRequest); + List getAssetInfoListPage(@Param("page") Page page, @Param("assetInfoRequest") AssetInfoRequest assetInfoRequest); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/AttendanceInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/AttendanceInfoMapper.java index f9e793e..ec87e46 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/AttendanceInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/AttendanceInfoMapper.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.statistics.AttendanceNumberDTO; import com.casic.missiles.modular.dto.statistics.AttendanceRatioDTO; import com.casic.missiles.modular.model.AttendanceInfo; import org.apache.ibatis.annotations.Mapper; @@ -17,7 +18,7 @@ */ @Mapper public interface AttendanceInfoMapper extends BaseMapper { - List getAttendanceInfoListPage(@Param("page") Page page, StaffInfoRequest attendanceInfoRequest); + List getAttendanceInfoListPage(@Param("page") Page page, @Param("attendanceInfoRequest") StaffInfoRequest attendanceInfoRequest); AttendanceInfo selectByCodeAndDate(@Param("staffCode") String staffCode); @@ -26,4 +27,8 @@ List getCountByTypeAndDateForMonth(@Param("staffType")String staffType); List getCountByTypeAndDateForYear(@Param("staffType")String staffType); + + List getCountForWeek(); + + List getCountForDay(); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java index ce94b8f..6137a7d 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java @@ -17,5 +17,5 @@ @Mapper public interface BlackInfoMapper extends BaseMapper { - List getBlackInfoListPage(@Param("page") Page page, BlackInfoRequest blackInfoRequest); + List getBlackInfoListPage(@Param("page") Page page, @Param("blackInfoRequest") BlackInfoRequest blackInfoRequest); } 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 efda6b3..50aaa6f 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 @@ -20,7 +20,7 @@ List getCaseInfoListPage(@Param("page") Page page, @Param("caseInfoRequest") CaseInfoRequest caseInfoRequest); - int updateStatusById(CaseInfoRequest caseInfoRequest); + int updateStatusById(@Param("caseInfoRequest") CaseInfoRequest caseInfoRequest); List selectByLevelAndMonth(@Param("year") String year); @@ -47,4 +47,20 @@ List selectPreWeekCountByThirtyDay(); List selectPreDayCountBySevenDay(); + + Integer selectDemobilizedCount(@Param("eventType") Number personnelDemobilizedEvent); + + List selectPreMonthCount(); + + List selectListBySevenDay(); + + List selectListByToday(); + + List selectListByToday2(); + + List selectListByToday3(); + + List selectListByType(@Param("eventType") Number eventType); + + List selectDemobilizedCountByHour(@Param("eventType") Number eventType); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/CategoryLevelMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/CategoryLevelMapper.java index 52fc714..afe1650 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/CategoryLevelMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/CategoryLevelMapper.java @@ -17,9 +17,9 @@ @Mapper public interface CategoryLevelMapper extends BaseMapper { - List getCaseCategoryLevelListPage(@Param("page") Page page, CategoryLevelRequest categoryLevelRequest); + List getCaseCategoryLevelListPage(@Param("page") Page page, @Param("categoryLevelRequest") CategoryLevelRequest categoryLevelRequest); - List getCaseCategoryLevelList(CategoryLevelRequest categoryLevelRequest); + List getCaseCategoryLevelList(@Param("categoryLevelRequest") CategoryLevelRequest categoryLevelRequest); CaseCategoryLevel getCaseCategoryLevel(@Param("categoryLevelCode") String categoryLevelCode); 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 66353b1..2555a09 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 @@ -19,7 +19,7 @@ @Mapper public interface DeviceInfoMapper extends BaseMapper { - List getDeviceInfoListPage(@Param("page") Page page, DeviceInfoRequest deviceInfoRequest); + List getDeviceInfoListPage(@Param("page") Page page, @Param("deviceInfoRequest") DeviceInfoRequest deviceInfoRequest); List getDeviceInfoList(@Param("deviceInfoRequest") DeviceInfoRequest deviceInfoRequest); @@ -27,6 +27,8 @@ DeviceInfo getByIndexCode(@Param("srcIndex") String srcIndex); + DeviceInfo getByIp(@Param("ip") String ip); + List selectIndexCodesByCodes(@Param("deviceCodes") List deviceCodes); List selectByType(@Param("devType") String devType); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java index 41dd0af..5bfaf63 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java @@ -5,6 +5,7 @@ import com.casic.missiles.modular.dto.DeviceRepairRequest; import com.casic.missiles.modular.model.DeviceRepairLog; import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; import java.util.List; @@ -16,7 +17,7 @@ @Mapper public interface DeviceRepairLogMapper extends BaseMapper { - List getDeviceRepairListPage(Page page, DeviceRepairRequest deviceRepairRequest); + List getDeviceRepairListPage(@Param("page") Page page, @Param("deviceRepairRequest")DeviceRepairRequest deviceRepairRequest); - List getDeviceRepairList(DeviceRepairRequest deviceRepairRequest); + List getDeviceRepairList(@Param("deviceRepairRequest") DeviceRepairRequest deviceRepairRequest); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java index 9035c47..4823ac1 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java @@ -18,7 +18,7 @@ @Mapper public interface FireEquipInfoMapper extends BaseMapper { - List getFireEquipInfoListPage(@Param("page") Page page, FireEquipRequest fireEquipRequest); + List getFireEquipInfoListPage(@Param("page") Page page, @Param("fireEquipRequest") FireEquipRequest fireEquipRequest); FireEquipInfo getFireEquipInfo(@Param("equipCode") String equipCode); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/BlackListController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/BlackListController.java index a27f9f8..0c06661 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/BlackListController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/BlackListController.java @@ -1,13 +1,18 @@ package com.casic.missiles.modular.controller; +import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.base.controller.ExportController; import com.casic.missiles.core.page.PageFactory; import com.casic.missiles.model.response.ResponseData; import com.casic.missiles.modular.dto.BlackInfoRequest; +import com.casic.missiles.modular.dto.BlackPictureRequest; +import com.casic.missiles.modular.dto.hik.PersonInfoRequest; +import com.casic.missiles.modular.enums.HikUri; import com.casic.missiles.modular.enums.OperateTypeEnum; import com.casic.missiles.modular.model.BlackInfo; import com.casic.missiles.modular.service.BlackInfoService; +import com.casic.missiles.modular.util.HikUtil; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; @@ -56,4 +61,22 @@ return null; } + /** + * 黑名单人员照片 + */ + @PostMapping("/personPicture") + @ResponseBody + public Object personPicture(@RequestBody BlackPictureRequest blackPictureRequest){ + //获取照片 + String picUri = blackPictureRequest.getPicUri(); + String serverIndexCode = blackPictureRequest.getServerIndexCode(); + PersonInfoRequest picRequest = new PersonInfoRequest(); + picRequest.setPicUri(picUri); + picRequest.setServerIndexCode(serverIndexCode); + String reBody = JSONObject.toJSONString(picRequest); + //重定向地址获取 + String url = HikUtil.hikApiFor302(HikUri.PERSON_PICTURE, reBody); + return ResponseData.success(url); + } + } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/DeviceController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/DeviceController.java index e1c4eba..666bbee 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/DeviceController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/DeviceController.java @@ -107,7 +107,7 @@ } /** - * 设备维修管理查询(分页),需计算MTTR=总维修时间/故障次数 + * 设备状态计算与评判/设备维修管理查询(分页),需计算MTTR=总维修时间/故障次数 */ @PostMapping("/repair/listPage") @ResponseBody @@ -211,7 +211,7 @@ //需根据设备编号获取到对应的门禁点唯一标识 doorControlRequest.setDoorIndexCodes(indexCodes); doorControlRequest.setControlType(Integer.valueOf(gateGroupDTO.getStatus())); - String body = JSONObject.toJSONString(deviceCodes); + String body = JSONObject.toJSONString(doorControlRequest); String resultStr = HikUtil.hikApi(HikUri.DOOR_CONTROL, body); JSONObject resultJson = (JSONObject)JSONObject.parse(resultStr); if (!"0".equals(resultJson.get("code"))) { diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/StaffController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/StaffController.java index b58ccab..704093c 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/StaffController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/StaffController.java @@ -2,15 +2,21 @@ import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.util.StrUtil; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.base.controller.ExportController; import com.casic.missiles.core.page.PageFactory; import com.casic.missiles.model.response.ErrorResponseData; import com.casic.missiles.model.response.ResponseData; import com.casic.missiles.modular.dto.StaffInfoRequest; +import com.casic.missiles.modular.dto.hik.PersonInfoRequest; +import com.casic.missiles.modular.dto.hik.StaffCardRequest; +import com.casic.missiles.modular.enums.HikUri; import com.casic.missiles.modular.enums.OperateTypeEnum; import com.casic.missiles.modular.model.StaffInfo; import com.casic.missiles.modular.service.StaffInfoService; +import com.casic.missiles.modular.util.HikUtil; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; @@ -110,4 +116,60 @@ } return ResponseData.success(); } + + /** + * 批量开卡,添加人员之后调用,若在一个接口中添加人员成功开卡失败则第二次添加时会有问题 + */ + @PostMapping("/cardBinding") + @ResponseBody + public Object cardBinding(@RequestBody StaffCardRequest staffCardRequest) { + String body = JSONObject.toJSONString(staffCardRequest); + String resultStr = HikUtil.hikApi(HikUri.CARD_BINDING, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (!"0".equals(resultJson.get("code"))) { + log.error("请求海康,批量开卡失败,海康response:{}", resultStr); + return ResponseData.error("批量开卡失败"); + } + //保存卡号 + if(staffInfoService.saveCardInfo(staffCardRequest) > 0){ + return ResponseData.success(); + } + return ResponseData.error("批量开卡失败"); + } + + /** + * 获取员工照片,海康存储 + */ + @PostMapping("/personPicture/{staffCode}") + @ResponseBody + public Object personPicture(@PathVariable("staffCode") String staffCode){ + //获取员工详细信息,含图片服务器、uri + PersonInfoRequest request = new PersonInfoRequest(); + List list = new ArrayList<>(); + list.add(staffCode); + request.setParamName("personId"); + request.setParamValue(list); + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi(HikUri.PERSON_INFO, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (!"0".equals(resultJson.get("code"))) { + log.error("请求海康,根据人员唯一字段获取人员详细信息失败,海康response:{}", resultStr); + return ResponseData.error("获取员工照片失败"); + } + //获取照片 + JSONObject data = (JSONObject) resultJson.get("data"); + JSONArray dataArray = (JSONArray) data.get("list"); + JSONObject jsonObject = (JSONObject) dataArray.get(0); + JSONArray personPhoto = (JSONArray) jsonObject.get("personPhoto"); + JSONObject photo = (JSONObject) personPhoto.get(0); + String picUri = photo.getString("picUri"); + String serverIndexCode = photo.getString("serverIndexCode"); + PersonInfoRequest picRequest = new PersonInfoRequest(); + picRequest.setPicUri(picUri); + picRequest.setServerIndexCode(serverIndexCode); + String reBody = JSONObject.toJSONString(picRequest); + //重定向地址获取 + String url = HikUtil.hikApiFor302(HikUri.PERSON_PICTURE, reBody); + return ResponseData.success(url); + } } 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 4a07dd9..7b1dcf6 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 @@ -16,6 +16,7 @@ import com.casic.missiles.modular.redis.key.CacheKeys; import com.casic.missiles.modular.service.CockpitService; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.util.CollectionUtils; import org.springframework.web.bind.annotation.*; @@ -24,10 +25,7 @@ import java.text.NumberFormat; import java.time.LocalDateTime; import java.time.temporal.ChronoUnit; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.util.*; import java.util.stream.Collectors; /** @@ -73,6 +71,9 @@ private StatisticNumberMapper numberMapper; @Autowired + private HazardLevelMapper hazardLevelMapper; + + @Autowired private AccessGroupConfig accessGroupConfig; /** @@ -104,8 +105,24 @@ public Object buildingNumberPerHour(){ //当天按小时分组的人数 List list = numberMapper.selectListByTime(); - Map> collect = list.stream().collect(Collectors.groupingBy(BuildingNumberDTO::getStatisticPosition)); - return ResponseData.success(collect); + Map> collect = list.stream().collect(Collectors.groupingBy(BuildingNumberDTO::getStatisticTime)); + //定时任务中已将每小时三栋楼人数存到数据库 + //将一期主楼和录制楼人数合并,二期单算 + List> resultList = new ArrayList<>(); + collect.keySet().forEach(key -> { + List buildingNumberDTOS = collect.get(key); + BuildingNumberDTO mainBuildingOne = buildingNumberDTOS.get(0); + BuildingNumberDTO mainBuildingTwo = buildingNumberDTOS.get(1); + BuildingNumberDTO recordingBuilding = buildingNumberDTOS.get(2); + HashMap resultMap = new HashMap<>(); + Integer oneQuantity = Integer.valueOf(mainBuildingOne.getStatisticQuantity()); + Integer recordingQuantity = Integer.valueOf(recordingBuilding.getStatisticQuantity()); + resultMap.put("staticTime", mainBuildingOne.getStatisticTime()); + resultMap.put(mainBuildingOne.getStatisticPositionName()+"、"+recordingBuilding.getStatisticPositionName(), String.valueOf(oneQuantity+recordingQuantity)); + resultMap.put(mainBuildingTwo.getStatisticPositionName(), mainBuildingTwo.getStatisticQuantity()); + resultList.add(resultMap); + }); + return ResponseData.success(resultList); } /** @@ -151,12 +168,11 @@ public Object securityNumber() { QueryWrapper wrapper = new QueryWrapper<>(); wrapper.eq("staff_type", 2); + // TODO: 2022/9/2 后续使用产品确定的每天出勤的安保人员的数量 Integer total = staffInfoMapper.selectCount(wrapper); - //当日离岗事件个数 - QueryWrapper wrapper1 = new QueryWrapper<>(); - wrapper1.eq("hik_event_type", SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); - wrapper1.apply("date_format(now(),'%Y-%m-%d') = date_format(happen_time,'%Y-%m-%d')"); - Integer leave = caseInfoMapper.selectCount(wrapper1); + //当日离岗事件按设备去重后的个数 + // TODO: 2022/9/2 目前相当于24小时内的计算,之后看需要可改成自定义小时数计算离岗率,即离岗+6小时内仅一次离岗则恢复为100%,多次则累加离岗次数计算离岗率 + Integer leave = caseInfoMapper.selectDemobilizedCount(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); NumberFormat numberFormat = NumberFormat.getInstance(); // 设置精确到小数点后2位 numberFormat.setMaximumFractionDigits(2); @@ -179,7 +195,6 @@ @ResponseBody public Object visitorApplyDetail() { List reasonGroup = applyMapper.selectByVisitReason(); - HashMap resultMap = new HashMap<>(); NumberFormat numberFormat = NumberFormat.getInstance(); // 设置精确到小数点后2位 numberFormat.setMaximumFractionDigits(2); @@ -187,12 +202,17 @@ if(0 == sum){ return ResponseData.success(); } + List resultList = new ArrayList<>(); reasonGroup.forEach(group -> { String reasonName = dictService.getDictNameByCode(SecurityEventDict.VISIT_REASON, group.getVisitReason()); String result = numberFormat.format((float) group.getQuantity() / (float) sum * 100); - resultMap.put(reasonName, result+"%"); + ApplyReasonGroupDTO applyReasonGroupDTO = new ApplyReasonGroupDTO(); + applyReasonGroupDTO.setQuantity(group.getQuantity()); + applyReasonGroupDTO.setVisitReason(reasonName); + applyReasonGroupDTO.setRatio(result+"%"); + resultList.add(applyReasonGroupDTO); }); - return ResponseData.success(resultMap); + return ResponseData.success(resultList); } /** @@ -247,6 +267,32 @@ } /** + * 机动力量实时在岗率,在岗人数除以总应在岗人数,用离岗+6小时内恢复为100%,6小时外再计算 + */ + @GetMapping("/staff/beOnDutyRatio") + @ResponseBody + public Object beOnDutyRatio() { + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("staff_type", 2); + // TODO: 2022/9/2 后续使用产品确定的每天出勤的安保人员的数量 + Integer total = staffInfoMapper.selectCount(wrapper); + if(0 == total){ + return ResponseData.success(null); + } + //当日离岗事件按设备去重后的个数 + // TODO: 2022/9/2 目前相当于24小时内的计算,之后看需要可改成自定义小时数计算离岗率,即离岗+6小时内仅一次离岗则恢复为100%,多次则累加离岗次数计算离岗率 + List onDutyRatioDTOS = caseInfoMapper.selectDemobilizedCountByHour(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); + onDutyRatioDTOS.forEach(dto -> { + NumberFormat numberFormat = NumberFormat.getInstance(); + // 设置精确到小数点后2位 + numberFormat.setMaximumFractionDigits(2); + String result = numberFormat.format(100 - Float.valueOf(dto.getQuantity()) / (float) total * 100); + dto.setRatio(result+"%"); + }); + return ResponseData.success(onDutyRatioDTOS); + } + + /** * 闸机速通门统计-设备状态分组计算数量,devType传闸机字典key * 视频频监控摄像机统计-设备状态分组计算数量,devType传摄像头字典key */ @@ -262,12 +308,17 @@ if(sum <= 0){ return ResponseData.error("无该类设备信息"); } + List resultList = new ArrayList<>(); gateStatusGroup.forEach(group -> { String devStatus = dictService.getDictNameByCode(SecurityEventDict.DEVICE_STATUS, group.getStatus()); String result = numberFormat.format((float) group.getQuantity() / (float) sum * 100); - resultMap.put(devStatus, result+"%"); + GateStatusGroupResponse gateStatusGroupResponse = new GateStatusGroupResponse(); + gateStatusGroupResponse.setStatus(devStatus); + gateStatusGroupResponse.setRatio(result+"%"); + resultList.add(gateStatusGroupResponse); }); - resultMap.put("总", sum); + resultMap.put("total", sum); + resultMap.put("list", resultList); return ResponseData.success(resultMap); } @@ -282,17 +333,38 @@ String position = securityScoreDTO.getPosition(); List caseInfos = caseInfoMapper.selectByPosition(position); //查询各危险级别权重、各类别权重,放入map,避免循环中多次查数据库 - + HashMap hazardScoreMap = new HashMap<>(); + List caseHazardLevelList = hazardLevelMapper.getCaseHazardLevelList(null); + caseHazardLevelList.forEach(hazardLevel -> { + hazardScoreMap.put(hazardLevel.getCode(), hazardLevel.getWeight()); + }); + HashMap categoryScoreMap = new HashMap<>(); + List categoryLevelList = categoryLevelMapper.getCaseCategoryLevelList(null); + categoryLevelList.forEach(categoryLevel -> { + categoryScoreMap.put(categoryLevel.getCode(), categoryLevel.getWeight()); + }); + //事件按楼层分组,计算 List securityScoreDTOs = new ArrayList<>(); caseInfos.forEach(caseInfo -> { SecurityScoreDTO securityScoreDTO1 = new SecurityScoreDTO(); + securityScoreDTO1.setPosition(caseInfo.getPosition()); securityScoreDTO1.setArea(caseInfo.getArea()); - // TODO: 2022/8/4 楼层评分计算根据产品定义调整 -// caseInfo.get -// securityScoreDTO1.setScore(); + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); + Double score = 100 - Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + securityScoreDTO1.setScore(score); + securityScoreDTOs.add(securityScoreDTO1); }); - - return null; + 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); + }); + return ResponseData.success(securityScoreDTOs); } /** @@ -303,9 +375,13 @@ public Object SecurityFrequency(@RequestBody SecurityFrequencyDTO securityFrequencyDTO) { String year = securityFrequencyDTO.getYear(); String month = securityFrequencyDTO.getMonth(); - Integer quantity = caseInfoMapper.selectCountByMonth(year, month); - securityFrequencyDTO.setQuantity(quantity); - return ResponseData.success(securityFrequencyDTO); + if(!StringUtils.isEmpty(year) && StringUtils.isEmpty(month)){ + Integer quantity = caseInfoMapper.selectCountByMonth(year, month); + securityFrequencyDTO.setQuantity(quantity); + return ResponseData.success(securityFrequencyDTO); + } + List list = caseInfoMapper.selectPreMonthCount(); + return ResponseData.success(list); } } 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 ae4d770..f4f075c 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 @@ -1,20 +1,25 @@ package com.casic.missiles.modular.controller.cockpit; +import cn.hutool.core.date.DateUnit; import cn.hutool.core.date.DateUtil; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.casic.missiles.model.response.ResponseData; -import com.casic.missiles.modular.dao.AttendanceInfoMapper; -import com.casic.missiles.modular.dao.CaseInfoMapper; -import com.casic.missiles.modular.dao.HazardLevelMapper; -import com.casic.missiles.modular.dao.StaffInfoMapper; +import com.casic.missiles.modular.dao.*; +import com.casic.missiles.modular.dto.DeviceRepairLogDTO; +import com.casic.missiles.modular.dto.DeviceRepairRequest; import com.casic.missiles.modular.dto.statistics.*; +import com.casic.missiles.modular.enums.SecurityEventType; +import com.casic.missiles.modular.model.CaseCategoryLevel; import com.casic.missiles.modular.model.CaseHazardLevel; +import com.casic.missiles.modular.model.CaseInfo; import com.casic.missiles.modular.model.StaffInfo; +import com.casic.missiles.modular.service.DeviceInfoService; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.util.CollectionUtils; import org.springframework.web.bind.annotation.*; +import java.math.BigDecimal; import java.text.NumberFormat; import java.util.*; import java.util.stream.Collectors; @@ -40,6 +45,12 @@ @Autowired private HazardLevelMapper hazardLevelMapper; + @Autowired + private CategoryLevelMapper categoryLevelMapper; + + @Autowired + private DeviceInfoService deviceInfoService; + /** * 安防事件时域频次统计,每月的每天安防事件个数(原方案) * 月维度:展示每个月的每天的数据 @@ -89,15 +100,17 @@ List monthList = caseInfoMapper.selectPreMonthCountByYear(year); Map> collect = monthList.stream().collect(Collectors.groupingBy(PreMonthOrWeekCaseDTO::getHazardLevelCode)); HashMap strAvgMap = new HashMap<>(); + List resultList = new ArrayList<>(); for (String key : collect.keySet()) { List preMonthOrWeekCaseDTOS = collect.get(key); int sum = preMonthOrWeekCaseDTOS.stream().mapToInt(PreMonthOrWeekCaseDTO::getQuantity).sum(); //若年份是本年,则使用个安防级别数量/当前月份数 //若不是本年,除数为12 MonthAndWeekDTO monthAndWeekDTO = new MonthAndWeekDTO(); + String hazardName = hazardLevelMapper.selectHazardNameByCode(key); + monthAndWeekDTO.setLevelName(hazardName); if(year.equals(String.valueOf(DateUtil.thisYear()))){ monthAndWeekDTO.setMonthQuantity(sum / DateUtil.thisMonth()); -// monthAndWeekDTO.setLevelName(); strAvgMap.put(key, monthAndWeekDTO); }else{ monthAndWeekDTO.setMonthQuantity(sum / 12); @@ -113,27 +126,37 @@ if(year.equals(String.valueOf(DateUtil.thisYear()))){ if(!Objects.isNull(strAvgMap.get(key))){ MonthAndWeekDTO monthAndWeekDTO = strAvgMap.get(key); + String hazardName = hazardLevelMapper.selectHazardNameByCode(key); + monthAndWeekDTO.setLevelName(hazardName); monthAndWeekDTO.setWeekQuantity(sum / DateUtil.thisWeekOfYear()); strAvgMap.put(key, monthAndWeekDTO); }else{ MonthAndWeekDTO monthAndWeekDTO = new MonthAndWeekDTO(); + String hazardName = hazardLevelMapper.selectHazardNameByCode(key); + monthAndWeekDTO.setLevelName(hazardName); monthAndWeekDTO.setWeekQuantity(sum / DateUtil.thisWeekOfYear()); strAvgMap.put(key, monthAndWeekDTO); } }else{ if(!Objects.isNull(strAvgMap.get(key))){ MonthAndWeekDTO monthAndWeekDTO = strAvgMap.get(key); + String hazardName = hazardLevelMapper.selectHazardNameByCode(key); + monthAndWeekDTO.setLevelName(hazardName); monthAndWeekDTO.setWeekQuantity(sum / 52); strAvgMap.put(key, monthAndWeekDTO); }else{ MonthAndWeekDTO monthAndWeekDTO = new MonthAndWeekDTO(); + String hazardName = hazardLevelMapper.selectHazardNameByCode(key); + monthAndWeekDTO.setLevelName(hazardName); monthAndWeekDTO.setWeekQuantity(sum / 52); strAvgMap.put(key, monthAndWeekDTO); } } } - avgMonthAndWeekGroupDTO.setMap(strAvgMap); - return ResponseData.success(avgMonthAndWeekGroupDTO); + strAvgMap.keySet().forEach(key -> { + resultList.add(strAvgMap.get(key)); + }); + return ResponseData.success(resultList); } /** @@ -181,12 +204,178 @@ } /** - * 员工考勤人数变化,功能待定 + * 员工考勤人数变化,统计当天(横坐标为时)及近7天(横坐标为天)的考勤人数变化,只要发生一次考勤识别,次数的基数就正常增加(没有上班下班区分) */ + @PostMapping("/staff/attendanceNumber/{dimension}") + @ResponseBody + public Object attendanceNumber(@PathVariable("dimension") String dimension) { + List attendanceNumberDTOs = null; + List> resultList = new ArrayList<>(); + if("week".equals(dimension)){ + //近7天数据按天分组统计 + attendanceNumberDTOs = attendanceInfoMapper.getCountForWeek(); + }else if("day".equals(dimension)) { + //今天数据按小时分组统计 + attendanceNumberDTOs = attendanceInfoMapper.getCountForDay(); + } + if(CollectionUtils.isEmpty(attendanceNumberDTOs)){ + return ResponseData.error("该查询条件下,无员工出勤数据!"); + } + Map> collect = attendanceNumberDTOs.stream().collect(Collectors.groupingBy(AttendanceNumberDTO::getDate)); + collect.keySet().forEach(key -> { + List attendanceNumberDTOS = collect.get(key); + AttendanceNumberDTO attendanceNumberDTO = attendanceNumberDTOS.get(0); + AttendanceNumberDTO attendanceNumberDTO2 = attendanceNumberDTOS.get(1); + Map resultMap = new HashMap<>(); + resultMap.put(attendanceNumberDTO.getStaffType(), attendanceNumberDTO.getQuantity()); + resultMap.put(attendanceNumberDTO2.getStaffType(), attendanceNumberDTO2.getQuantity()); + resultMap.put("staticTime", attendanceNumberDTO.getDate()); + resultList.add(resultMap); + }); + return ResponseData.success(resultList); + } /** - * 近30天/近一周安保人员到岗排行 + * 早晚高峰区域安防评估 */ + @PostMapping("/security/assessment/{dimension}") + @ResponseBody + public Object securityAssessment(@PathVariable("dimension") String dimension) { + //查询各危险级别权重、各类别权重,放入map,避免循环中多次查数据库 + HashMap hazardScoreMap = new HashMap<>(); + List caseHazardLevelList = hazardLevelMapper.getCaseHazardLevelList(null); + caseHazardLevelList.forEach(hazardLevel -> { + hazardScoreMap.put(hazardLevel.getCode(), hazardLevel.getWeight()); + }); + HashMap categoryScoreMap = new HashMap<>(); + List categoryLevelList = categoryLevelMapper.getCaseCategoryLevelList(null); + categoryLevelList.forEach(categoryLevel -> { + categoryScoreMap.put(categoryLevel.getCode(), categoryLevel.getWeight()); + }); + HashMap hashMap = new HashMap<>(); + if("week".equals(dimension)){ + //近7天早晚高峰数据 + List caseInfos = caseInfoMapper.selectListBySevenDay(); + //按时间(天)进行分组 + caseInfos.forEach(caseInfo -> { + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); + Double score = Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + String[] array = caseInfo.getHappenTime().split(" "); + String dayTime = array[0]; + BigDecimal preScore; + if(hashMap.containsKey(dayTime)){ + Double aDouble = hashMap.get(dayTime); + preScore = new BigDecimal(aDouble.toString()); + + }else{ + preScore = new BigDecimal("100.0"); + } + BigDecimal nowScore = new BigDecimal(score.toString()); + hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); + }); + return ResponseData.success(hashMap); + }else if("day".equals(dimension)) { + //今天数据按小时分组统计 + List caseInfos = caseInfoMapper.selectListByToday(); + caseInfos.forEach(caseInfo -> { + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); + Double score = Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + String[] array = caseInfo.getHappenTime().split(":"); + String dayTime = array[0]; + BigDecimal preScore; + if(hashMap.containsKey(dayTime)){ + Double aDouble = hashMap.get(dayTime); + preScore = new BigDecimal(aDouble.toString()); + + }else{ + preScore = new BigDecimal("100.0"); + } + BigDecimal nowScore = new BigDecimal(score.toString()); + hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); + }); + return ResponseData.success(hashMap); + } + return null; + } + + /** + * 重点区域安防事态评估,统计重点区域6:00-23:00按小时分组数据 + */ + @GetMapping("/security/keyAreaStatistic") + @ResponseBody + public Object keyAreaStatistic() { + //查询各危险级别权重、各类别权重,放入map,避免循环中多次查数据库 + HashMap hazardScoreMap = new HashMap<>(); + List caseHazardLevelList = hazardLevelMapper.getCaseHazardLevelList(null); + caseHazardLevelList.forEach(hazardLevel -> { + hazardScoreMap.put(hazardLevel.getCode(), hazardLevel.getWeight()); + }); + HashMap categoryScoreMap = new HashMap<>(); + List categoryLevelList = categoryLevelMapper.getCaseCategoryLevelList(null); + categoryLevelList.forEach(categoryLevel -> { + categoryScoreMap.put(categoryLevel.getCode(), categoryLevel.getWeight()); + }); + HashMap hashMap = new HashMap<>(); + //今天数据按小时分组统计 + List caseInfos = caseInfoMapper.selectListByToday2(); + caseInfos.forEach(caseInfo -> { + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); + Double score = Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + String[] array = caseInfo.getHappenTime().split(":"); + String dayTime = array[0]; + BigDecimal preScore; + if(hashMap.containsKey(dayTime)){ + Double aDouble = hashMap.get(dayTime); + preScore = new BigDecimal(aDouble.toString()); + + }else{ + preScore = new BigDecimal("100.0"); + } + BigDecimal nowScore = new BigDecimal(score.toString()); + hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); + }); + return ResponseData.success(hashMap); + } + + /** + * 安防机动支援力量调配响应评估,根据事件已解决状态及已解决时间-发送时间,按时间(小时)分组统计 + */ + @GetMapping("/security/responseAssess") + @ResponseBody + public Object responseAssess() { + //查询各危险级别权重、各类别权重,放入map,避免循环中多次查数据库 + HashMap hazardScoreMap = new HashMap<>(); + List caseHazardLevelList = hazardLevelMapper.getCaseHazardLevelList(null); + caseHazardLevelList.forEach(hazardLevel -> { + hazardScoreMap.put(hazardLevel.getCode(), hazardLevel.getWeight()); + }); + HashMap hashMap = new HashMap<>(); + //今天数据按小时分组统计 + List caseInfos = caseInfoMapper.selectListByToday3(); + caseInfos.forEach(caseInfo -> { + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + //扣分=事件级别权重*未解决小时数 + Date updateTime = DateUtil.parse(caseInfo.getUpdateTime()); + Date happenTime = DateUtil.parse(caseInfo.getHappenTime()); + long between = DateUtil.between(updateTime, happenTime, DateUnit.HOUR); + Double score = Double.valueOf(hazardWeight)*between; + String[] array = caseInfo.getHappenTime().split(":"); + String dayTime = array[0]; + BigDecimal preScore; + if(hashMap.containsKey(dayTime)){ + Double aDouble = hashMap.get(dayTime); + preScore = new BigDecimal(aDouble.toString()); + }else{ + preScore = new BigDecimal("100.0"); + } + BigDecimal nowScore = new BigDecimal(score.toString()); + hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); + }); + return ResponseData.success(hashMap); + } /** * 重点区域威胁事件类型统计,优先级2,统计近7天和近30天 @@ -224,7 +413,34 @@ } /** - * 设备状态计算系数和评判,优先级3,需确认设备恢复时间是否可以获取 + * 近30天/近一周安保人员到岗排行 */ + + /** + * 安保等级评估,发生离岗事件减1分 + */ + @GetMapping("/security/levelAssess") + @ResponseBody + public Object securityLevelAssess() { + //今天数据按小时分组统计 + List resultList = caseInfoMapper.selectListByType(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); + resultList.forEach(result -> { + BigDecimal deScore = new BigDecimal(result.getQuantity()); + BigDecimal preScore = new BigDecimal("100.0"); + result.setScore(preScore.subtract(deScore).doubleValue()); + }); + return ResponseData.success(resultList); + } + + /** + * 设备状态计算系数和评判,即设备维修管理查询(不分页) + */ + @PostMapping("/device/repairList") + @ResponseBody + public Object repairList(@RequestBody DeviceRepairRequest deviceRepairRequest) { + List deviceRepairLogDTOS = deviceInfoService.deviceRepairListPage(deviceRepairRequest); + return ResponseData.success(deviceRepairLogDTOS); + } + } 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 fbf8ab6..c71a15a 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 @@ -1,13 +1,12 @@ package com.casic.missiles.modular.controller.hik; +import cn.hutool.core.date.DateTime; +import cn.hutool.core.date.DateUtil; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.casic.missiles.model.response.ResponseData; import com.casic.missiles.modular.dao.HikFaceGroupInfoMapper; -import com.casic.missiles.modular.dto.hik.EventSubscribeRequest; -import com.casic.missiles.modular.dto.hik.FaceGroupAdditionRequest; -import com.casic.missiles.modular.dto.hik.HikRecvEvent; -import com.casic.missiles.modular.dto.hik.OrgBatchAdd; +import com.casic.missiles.modular.dto.hik.*; import com.casic.missiles.modular.enums.HikUri; import com.casic.missiles.modular.enums.SecurityEventType; import com.casic.missiles.modular.model.CaseInfo; @@ -18,16 +17,20 @@ import com.casic.missiles.modular.util.CaseInfoFactoryUtil; import com.casic.missiles.modular.util.HikUtil; import com.casic.missiles.modular.util.ThreadPoolUtil; +import com.casic.missiles.modular.util.WebSocket; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; -import org.springframework.web.bind.annotation.*; +import org.springframework.util.CollectionUtils; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.RestController; -import java.net.InetAddress; -import java.net.UnknownHostException; import java.util.ArrayList; +import java.util.Iterator; import java.util.List; import java.util.Objects; @@ -38,7 +41,6 @@ */ @Slf4j @RestController -@RequestMapping("/hik") public class HikController { @Autowired @@ -53,28 +55,37 @@ @Autowired private HikService hikService; + @Autowired + private HikFaceGroupInfoMapper hikFaceGroupInfoMapper; + + @Autowired + private WebSocket webSocket; + @Value("${server.port}") private int serverPort; - @Autowired - private HikFaceGroupInfoMapper hikFaceGroupInfoMapper; /** * 海康事件订阅 */ - @PostMapping("/event/subscribe") + @PostMapping("/hik/event/subscribe") @ResponseBody - public Object eventSubscribe() throws UnknownHostException { + public Object eventSubscribe() { EventSubscribeRequest eventSubscribeRequest = new EventSubscribeRequest(); ArrayList list = new ArrayList<>(); list.add(SecurityEventType.DEVICE_OFFLINE); + list.add(SecurityEventType.DEVICE_ONLINE); list.add(SecurityEventType.KEY_PERSONNEL_IDENTIFY_EVENT); list.add(SecurityEventType.MONITORING_POINT_OFFLINE); + list.add(SecurityEventType.MONITORING_POINT_ONLINE); list.add(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); list.add(SecurityEventType.PERSONNEL_GATHER_EVENT); - InetAddress localHost = InetAddress.getLocalHost(); + list.add(SecurityEventType.VISITOR_REGISTER); + list.add(SecurityEventType.VISITOR_CHECKOUT); + list.add(SecurityEventType.HIGH_ALTITUDE_PARABOLIC); +// InetAddress localHost = InetAddress.getLocalHost(); eventSubscribeRequest.setEventTypes(list); - eventSubscribeRequest.setEventDest("https://" + localHost + ":" + serverPort + "/eventRcv"); + eventSubscribeRequest.setEventDest("http://" + "192.168.10.6" + ":" + serverPort + "/eventRcv"); //订阅类型,0-订阅原始事件,1-联动事件,2-原始事件和联动事件,不填使用默认值0 eventSubscribeRequest.setSubType(0); /** @@ -92,19 +103,25 @@ } /** + * 查询事件订阅信息 + */ + @PostMapping("/hik/event/query") + @ResponseBody + public Object eventQuery() { + String result = HikUtil.hikApi(HikUri.EVENT_INFO, ""); + return result; + } + + /** * 海康事件接收 */ @PostMapping("/eventRcv") @ResponseBody public Object eventRcv(@RequestBody HikRecvEvent hikRecvEvent) { //1、接收所需事件类型 - Long eventType = hikRecvEvent.getEventType(); + Number eventType = hikRecvEvent.getEventType(); log.info("接收到安防事件类型为:{}", eventType); CaseInfo caseInfo = caseInfoFactoryUtil.getCaseInfo(eventType); - //接收到不关心事件直接返回 - if(Objects.isNull(caseInfo)){ - return ResponseData.success(); - } //2、不同事件不同处理,caseInfoFactoryUtil已设置好事件基础定义信息 // 再为事件添加状态、设备编码、设备名称、位置、区域、时间 // 异步处理事件 @@ -114,19 +131,23 @@ caseHandle(hikRecvEvent, eventType, caseInfo); } })); +// caseHandle(hikRecvEvent, eventType, caseInfo); - return null; + return ResponseData.success(); } - private void caseHandle(HikRecvEvent hikRecvEvent, Long eventType, CaseInfo caseInfo) { + private void caseHandle(HikRecvEvent hikRecvEvent, Number eventType, CaseInfo caseInfo) { JSONArray eventArray = hikRecvEvent.getEventArray(); List caseInfos = new ArrayList<>(); - while (eventArray.stream().iterator().hasNext()) { + Iterator iterator = eventArray.iterator(); + while (iterator.hasNext()) { CaseInfo caseInfo1 = new CaseInfo(); - BeanUtils.copyProperties(caseInfo, caseInfo1); - JSONObject event = (JSONObject) eventArray.stream().iterator().next(); + if(!Objects.isNull(caseInfo)){ + BeanUtils.copyProperties(caseInfo, caseInfo1); + } + JSONObject event = (JSONObject) iterator.next(); //5种事件进行不同处理 - if(SecurityEventType.KEY_PERSONNEL_IDENTIFY_EVENT == eventType){ + if (SecurityEventType.KEY_PERSONNEL_IDENTIFY_EVENT.equals(eventType)) { //判断所属人脸分组 JSONObject data = (JSONObject) event.get("data"); JSONObject faceRecognitionResult = (JSONObject) data.get("faceRecognitionResult"); @@ -142,52 +163,101 @@ if (faceGroupCode.equals(blackListGroup.getFaceGroupCode())) { //黑名单分组处理 caseInfo1 = hikService.blackListHandle(event, caseInfo1); - }else if(faceGroupCode.equals(propertyPersonnelGroup.getFaceGroupCode())){ + } else if (faceGroupCode.equals(propertyPersonnelGroup.getFaceGroupCode())) { //考勤分组处理-物业人员,添加到考勤表 hikService.propertyAttendanceHandle(event); - }else if(faceGroupCode.equals(securityPersonnelGroup.getFaceGroupCode())){ + } else if (faceGroupCode.equals(securityPersonnelGroup.getFaceGroupCode())) { //考勤分组处理-安保人员,添加到考勤表 hikService.securityPersonnelHandle(event); - }else { + } else { return; } - }else if(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT == eventType){ + } else if (SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT.equals(eventType)) { //离岗事件处理 caseInfo1 = hikService.demobilizedHandle(event, caseInfo1); - }else if(SecurityEventType.PERSONNEL_GATHER_EVENT == eventType){ + } else if (SecurityEventType.PERSONNEL_GATHER_EVENT.equals(eventType)) { //人员聚集事件处理 caseInfo1 = hikService.personGatherHandle(event, caseInfo1); - }else if(SecurityEventType.MONITORING_POINT_OFFLINE == eventType){ + } else if (SecurityEventType.MONITORING_POINT_OFFLINE.equals(eventType)) { //监控点离线事件处理 caseInfo1 = hikService.monitorPointOfflineHandle(event, caseInfo1); - }else if(SecurityEventType.DEVICE_OFFLINE == eventType){ + } else if (SecurityEventType.MONITORING_POINT_ONLINE.equals(eventType)) { + //监控点上线事件处理 + hikService.monitorPointOnlineHandle(event); + } else if (SecurityEventType.DEVICE_OFFLINE.equals(eventType)) { //装置离线事件处理 caseInfo1 = hikService.deviceOfflineHandle(event, caseInfo1); - }else if(SecurityEventType.VISITOR_REGISTER == eventType){ + } else if (SecurityEventType.DEVICE_ONLINE.equals(eventType)) { + //装置上线处理 + hikService.deviceOnlineHandle(event); + } else if (SecurityEventType.VISITOR_REGISTER.equals(eventType)) { //记录访客登记记录,添加到访客记录表 hikService.visitorRegisterHandler(event); - }else if(SecurityEventType.VISITOR_CHECKOUT == eventType){ + } else if (SecurityEventType.VISITOR_CHECKOUT.equals(eventType)) { //记录访客签离记录 hikService.visitorCheckOutHandler(event); } - if(!Objects.isNull(caseInfo1) && !StringUtils.isEmpty(caseInfo1.getHappenTime())){ + if (!Objects.isNull(caseInfo1) && !StringUtils.isEmpty(caseInfo1.getHappenTime())) { caseInfos.add(caseInfo1); } } //3、安防事件入库 - if(!caseInfoService.insertCaseInfoBatch(caseInfos)){ - log.error("安防事件批量入库异常"); + if (!CollectionUtils.isEmpty(caseInfos) && !caseInfoService.insertCaseInfoBatch(caseInfos)) { + log.error("安防事件批量入库异常!"); } // TODO: 2022/8/15 webSocket推送 + if (CollectionUtils.isEmpty(caseInfos)) { + log.info("webSocket事件推送"); + webSocket.sendAllMessage(JSONObject.toJSONString(caseInfos)); + } return; } /** + * 以图搜图,前端用于轨迹追踪 + */ + @PostMapping("/hik/search/picture") + @ResponseBody + public Object searchPictures(@RequestBody SearchPicturesRequest searchPicturesRequest) { + DateTime startDateTime = DateUtil.parse(searchPicturesRequest.getStartTime()); + DateTime endDateTime = DateUtil.parse(searchPicturesRequest.getEndTime()); + String startTime = DateUtil.format(startDateTime, "yyyy-MM-dd'T'HH:mm:ss.SSSXXX"); + String endTime = DateUtil.format(endDateTime, "yyyy-MM-dd'T'HH:mm:ss.SSSXXX"); + searchPicturesRequest.setStartTime(startTime); + searchPicturesRequest.setEndTime(endTime); + String body = JSONObject.toJSONString(searchPicturesRequest); + String resultStr = HikUtil.hikApi(HikUri.SEARCH_PICTURES, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (!"0".equals(resultJson.get("code"))) { + log.error("请求海康,以图搜图失败,海康response:{}", resultStr); + return ResponseData.error("以图搜图失败"); + } + return ResponseData.success(resultJson); + } + + + /** + * 海康事件取消订阅 + */ + @PostMapping("/hik/event/cancel") + @ResponseBody + public Object eventCancelSubscribe(@RequestBody CancelSubscribeRequest cancelSubscribeRequest) { + String body = JSONObject.toJSONString(cancelSubscribeRequest); + String resultStr = HikUtil.hikApi(HikUri.EVENT_CANCEL, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (!"0".equals(resultJson.get("code"))) { + log.error("请求海康,取消订阅失败,海康response:{}", resultStr); + return ResponseData.error("取消订阅失败"); + } + return ResponseData.success(resultJson); + } + + /** * 单个添加海康人脸分组 * api->hik单个添加人脸分组api->response->mysql */ - @PostMapping("/faceGroup/single/add") + @PostMapping("/hik/faceGroup/single/add") @ResponseBody public Object faceGroupAddition(@RequestBody FaceGroupAdditionRequest faceGroupAdditionRequest) { String body = JSONObject.toJSONString(faceGroupAdditionRequest); @@ -212,7 +282,7 @@ * 批量添加海康组织 * api->hik批量添加组织api->response */ - @PostMapping("/org/batch/add") + @PostMapping("/hik/org/batch/add") @ResponseBody public Object orgBatchAdd(@RequestBody List orgBatchAddRequest) { String body = JSONObject.toJSONString(orgBatchAddRequest); @@ -232,4 +302,62 @@ return ResponseData.error("批量添加组织失败"); } + /** + * 获取人员列表 + */ + @PostMapping("/hik/person/personList") + @ResponseBody + public Object personList() { + PersonListRequest request = new PersonListRequest(); + request.setPageNo(1); + request.setPageSize(100); + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi("/api/resource/v2/person/personList", body); + return resultStr; + } + + /** + * 获取组织列表 + */ + @PostMapping("/hik/org/orgList") + @ResponseBody + public Object orgList() { + PersonListRequest request = new PersonListRequest(); + request.setPageNo(1); + request.setPageSize(100); + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi("/api/resource/v1/org/orgList", body); + return resultStr; + } + + /** + * 查询访客权限下载记录 + */ + @PostMapping("/hik/auth/result") + @ResponseBody + public Object authResult() { + PersonListRequest request = new PersonListRequest(); + request.setPageNo(1); + request.setPageSize(100); + request.setOrderId("ba101db6246711edaea66f7939a13638"); + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi("/api/visitor/v1/auth/result", body); + return resultStr; + } + + /** + * 人脸图片获取 + */ + @PostMapping("/hik/face/picture") + @ResponseBody + public Object facePicture() { + FaceRequest request = new FaceRequest(); +// List list = new ArrayList<>(); +// list.add(""); + request.setCertificateNum("wanggong"); + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi("/api/frs/v1/face", body); + return resultStr; + } + } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/AssetInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/AssetInfoMapper.java index 4f64e83..c0684ee 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/AssetInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/AssetInfoMapper.java @@ -17,6 +17,6 @@ @Mapper public interface AssetInfoMapper extends BaseMapper { - List getAssetInfoListPage(@Param("page") Page page, AssetInfoRequest assetInfoRequest); + List getAssetInfoListPage(@Param("page") Page page, @Param("assetInfoRequest") AssetInfoRequest assetInfoRequest); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/AttendanceInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/AttendanceInfoMapper.java index f9e793e..ec87e46 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/AttendanceInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/AttendanceInfoMapper.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.statistics.AttendanceNumberDTO; import com.casic.missiles.modular.dto.statistics.AttendanceRatioDTO; import com.casic.missiles.modular.model.AttendanceInfo; import org.apache.ibatis.annotations.Mapper; @@ -17,7 +18,7 @@ */ @Mapper public interface AttendanceInfoMapper extends BaseMapper { - List getAttendanceInfoListPage(@Param("page") Page page, StaffInfoRequest attendanceInfoRequest); + List getAttendanceInfoListPage(@Param("page") Page page, @Param("attendanceInfoRequest") StaffInfoRequest attendanceInfoRequest); AttendanceInfo selectByCodeAndDate(@Param("staffCode") String staffCode); @@ -26,4 +27,8 @@ List getCountByTypeAndDateForMonth(@Param("staffType")String staffType); List getCountByTypeAndDateForYear(@Param("staffType")String staffType); + + List getCountForWeek(); + + List getCountForDay(); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java index ce94b8f..6137a7d 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java @@ -17,5 +17,5 @@ @Mapper public interface BlackInfoMapper extends BaseMapper { - List getBlackInfoListPage(@Param("page") Page page, BlackInfoRequest blackInfoRequest); + List getBlackInfoListPage(@Param("page") Page page, @Param("blackInfoRequest") BlackInfoRequest blackInfoRequest); } 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 efda6b3..50aaa6f 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 @@ -20,7 +20,7 @@ List getCaseInfoListPage(@Param("page") Page page, @Param("caseInfoRequest") CaseInfoRequest caseInfoRequest); - int updateStatusById(CaseInfoRequest caseInfoRequest); + int updateStatusById(@Param("caseInfoRequest") CaseInfoRequest caseInfoRequest); List selectByLevelAndMonth(@Param("year") String year); @@ -47,4 +47,20 @@ List selectPreWeekCountByThirtyDay(); List selectPreDayCountBySevenDay(); + + Integer selectDemobilizedCount(@Param("eventType") Number personnelDemobilizedEvent); + + List selectPreMonthCount(); + + List selectListBySevenDay(); + + List selectListByToday(); + + List selectListByToday2(); + + List selectListByToday3(); + + List selectListByType(@Param("eventType") Number eventType); + + List selectDemobilizedCountByHour(@Param("eventType") Number eventType); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/CategoryLevelMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/CategoryLevelMapper.java index 52fc714..afe1650 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/CategoryLevelMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/CategoryLevelMapper.java @@ -17,9 +17,9 @@ @Mapper public interface CategoryLevelMapper extends BaseMapper { - List getCaseCategoryLevelListPage(@Param("page") Page page, CategoryLevelRequest categoryLevelRequest); + List getCaseCategoryLevelListPage(@Param("page") Page page, @Param("categoryLevelRequest") CategoryLevelRequest categoryLevelRequest); - List getCaseCategoryLevelList(CategoryLevelRequest categoryLevelRequest); + List getCaseCategoryLevelList(@Param("categoryLevelRequest") CategoryLevelRequest categoryLevelRequest); CaseCategoryLevel getCaseCategoryLevel(@Param("categoryLevelCode") String categoryLevelCode); 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 66353b1..2555a09 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 @@ -19,7 +19,7 @@ @Mapper public interface DeviceInfoMapper extends BaseMapper { - List getDeviceInfoListPage(@Param("page") Page page, DeviceInfoRequest deviceInfoRequest); + List getDeviceInfoListPage(@Param("page") Page page, @Param("deviceInfoRequest") DeviceInfoRequest deviceInfoRequest); List getDeviceInfoList(@Param("deviceInfoRequest") DeviceInfoRequest deviceInfoRequest); @@ -27,6 +27,8 @@ DeviceInfo getByIndexCode(@Param("srcIndex") String srcIndex); + DeviceInfo getByIp(@Param("ip") String ip); + List selectIndexCodesByCodes(@Param("deviceCodes") List deviceCodes); List selectByType(@Param("devType") String devType); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java index 41dd0af..5bfaf63 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java @@ -5,6 +5,7 @@ import com.casic.missiles.modular.dto.DeviceRepairRequest; import com.casic.missiles.modular.model.DeviceRepairLog; import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; import java.util.List; @@ -16,7 +17,7 @@ @Mapper public interface DeviceRepairLogMapper extends BaseMapper { - List getDeviceRepairListPage(Page page, DeviceRepairRequest deviceRepairRequest); + List getDeviceRepairListPage(@Param("page") Page page, @Param("deviceRepairRequest")DeviceRepairRequest deviceRepairRequest); - List getDeviceRepairList(DeviceRepairRequest deviceRepairRequest); + List getDeviceRepairList(@Param("deviceRepairRequest") DeviceRepairRequest deviceRepairRequest); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java index 9035c47..4823ac1 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java @@ -18,7 +18,7 @@ @Mapper public interface FireEquipInfoMapper extends BaseMapper { - List getFireEquipInfoListPage(@Param("page") Page page, FireEquipRequest fireEquipRequest); + List getFireEquipInfoListPage(@Param("page") Page page, @Param("fireEquipRequest") FireEquipRequest fireEquipRequest); FireEquipInfo getFireEquipInfo(@Param("equipCode") String equipCode); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/GateGroupMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/GateGroupMapper.java index d8c330d..977a427 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/GateGroupMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/GateGroupMapper.java @@ -17,7 +17,7 @@ */ @Mapper public interface GateGroupMapper extends BaseMapper { - List getGateGroupListPage(@Param("page") Page page, GateGroupRequest gateGroupRequest); + List getGateGroupListPage(@Param("page") Page page, @Param("gateGroupRequest") GateGroupRequest gateGroupRequest); GateGroup getGateGroupByName(@Param("groupName") String groupName); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/BlackListController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/BlackListController.java index a27f9f8..0c06661 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/BlackListController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/BlackListController.java @@ -1,13 +1,18 @@ package com.casic.missiles.modular.controller; +import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.base.controller.ExportController; import com.casic.missiles.core.page.PageFactory; import com.casic.missiles.model.response.ResponseData; import com.casic.missiles.modular.dto.BlackInfoRequest; +import com.casic.missiles.modular.dto.BlackPictureRequest; +import com.casic.missiles.modular.dto.hik.PersonInfoRequest; +import com.casic.missiles.modular.enums.HikUri; import com.casic.missiles.modular.enums.OperateTypeEnum; import com.casic.missiles.modular.model.BlackInfo; import com.casic.missiles.modular.service.BlackInfoService; +import com.casic.missiles.modular.util.HikUtil; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; @@ -56,4 +61,22 @@ return null; } + /** + * 黑名单人员照片 + */ + @PostMapping("/personPicture") + @ResponseBody + public Object personPicture(@RequestBody BlackPictureRequest blackPictureRequest){ + //获取照片 + String picUri = blackPictureRequest.getPicUri(); + String serverIndexCode = blackPictureRequest.getServerIndexCode(); + PersonInfoRequest picRequest = new PersonInfoRequest(); + picRequest.setPicUri(picUri); + picRequest.setServerIndexCode(serverIndexCode); + String reBody = JSONObject.toJSONString(picRequest); + //重定向地址获取 + String url = HikUtil.hikApiFor302(HikUri.PERSON_PICTURE, reBody); + return ResponseData.success(url); + } + } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/DeviceController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/DeviceController.java index e1c4eba..666bbee 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/DeviceController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/DeviceController.java @@ -107,7 +107,7 @@ } /** - * 设备维修管理查询(分页),需计算MTTR=总维修时间/故障次数 + * 设备状态计算与评判/设备维修管理查询(分页),需计算MTTR=总维修时间/故障次数 */ @PostMapping("/repair/listPage") @ResponseBody @@ -211,7 +211,7 @@ //需根据设备编号获取到对应的门禁点唯一标识 doorControlRequest.setDoorIndexCodes(indexCodes); doorControlRequest.setControlType(Integer.valueOf(gateGroupDTO.getStatus())); - String body = JSONObject.toJSONString(deviceCodes); + String body = JSONObject.toJSONString(doorControlRequest); String resultStr = HikUtil.hikApi(HikUri.DOOR_CONTROL, body); JSONObject resultJson = (JSONObject)JSONObject.parse(resultStr); if (!"0".equals(resultJson.get("code"))) { diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/StaffController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/StaffController.java index b58ccab..704093c 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/StaffController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/StaffController.java @@ -2,15 +2,21 @@ import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.util.StrUtil; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.base.controller.ExportController; import com.casic.missiles.core.page.PageFactory; import com.casic.missiles.model.response.ErrorResponseData; import com.casic.missiles.model.response.ResponseData; import com.casic.missiles.modular.dto.StaffInfoRequest; +import com.casic.missiles.modular.dto.hik.PersonInfoRequest; +import com.casic.missiles.modular.dto.hik.StaffCardRequest; +import com.casic.missiles.modular.enums.HikUri; import com.casic.missiles.modular.enums.OperateTypeEnum; import com.casic.missiles.modular.model.StaffInfo; import com.casic.missiles.modular.service.StaffInfoService; +import com.casic.missiles.modular.util.HikUtil; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; @@ -110,4 +116,60 @@ } return ResponseData.success(); } + + /** + * 批量开卡,添加人员之后调用,若在一个接口中添加人员成功开卡失败则第二次添加时会有问题 + */ + @PostMapping("/cardBinding") + @ResponseBody + public Object cardBinding(@RequestBody StaffCardRequest staffCardRequest) { + String body = JSONObject.toJSONString(staffCardRequest); + String resultStr = HikUtil.hikApi(HikUri.CARD_BINDING, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (!"0".equals(resultJson.get("code"))) { + log.error("请求海康,批量开卡失败,海康response:{}", resultStr); + return ResponseData.error("批量开卡失败"); + } + //保存卡号 + if(staffInfoService.saveCardInfo(staffCardRequest) > 0){ + return ResponseData.success(); + } + return ResponseData.error("批量开卡失败"); + } + + /** + * 获取员工照片,海康存储 + */ + @PostMapping("/personPicture/{staffCode}") + @ResponseBody + public Object personPicture(@PathVariable("staffCode") String staffCode){ + //获取员工详细信息,含图片服务器、uri + PersonInfoRequest request = new PersonInfoRequest(); + List list = new ArrayList<>(); + list.add(staffCode); + request.setParamName("personId"); + request.setParamValue(list); + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi(HikUri.PERSON_INFO, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (!"0".equals(resultJson.get("code"))) { + log.error("请求海康,根据人员唯一字段获取人员详细信息失败,海康response:{}", resultStr); + return ResponseData.error("获取员工照片失败"); + } + //获取照片 + JSONObject data = (JSONObject) resultJson.get("data"); + JSONArray dataArray = (JSONArray) data.get("list"); + JSONObject jsonObject = (JSONObject) dataArray.get(0); + JSONArray personPhoto = (JSONArray) jsonObject.get("personPhoto"); + JSONObject photo = (JSONObject) personPhoto.get(0); + String picUri = photo.getString("picUri"); + String serverIndexCode = photo.getString("serverIndexCode"); + PersonInfoRequest picRequest = new PersonInfoRequest(); + picRequest.setPicUri(picUri); + picRequest.setServerIndexCode(serverIndexCode); + String reBody = JSONObject.toJSONString(picRequest); + //重定向地址获取 + String url = HikUtil.hikApiFor302(HikUri.PERSON_PICTURE, reBody); + return ResponseData.success(url); + } } 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 4a07dd9..7b1dcf6 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 @@ -16,6 +16,7 @@ import com.casic.missiles.modular.redis.key.CacheKeys; import com.casic.missiles.modular.service.CockpitService; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.util.CollectionUtils; import org.springframework.web.bind.annotation.*; @@ -24,10 +25,7 @@ import java.text.NumberFormat; import java.time.LocalDateTime; import java.time.temporal.ChronoUnit; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.util.*; import java.util.stream.Collectors; /** @@ -73,6 +71,9 @@ private StatisticNumberMapper numberMapper; @Autowired + private HazardLevelMapper hazardLevelMapper; + + @Autowired private AccessGroupConfig accessGroupConfig; /** @@ -104,8 +105,24 @@ public Object buildingNumberPerHour(){ //当天按小时分组的人数 List list = numberMapper.selectListByTime(); - Map> collect = list.stream().collect(Collectors.groupingBy(BuildingNumberDTO::getStatisticPosition)); - return ResponseData.success(collect); + Map> collect = list.stream().collect(Collectors.groupingBy(BuildingNumberDTO::getStatisticTime)); + //定时任务中已将每小时三栋楼人数存到数据库 + //将一期主楼和录制楼人数合并,二期单算 + List> resultList = new ArrayList<>(); + collect.keySet().forEach(key -> { + List buildingNumberDTOS = collect.get(key); + BuildingNumberDTO mainBuildingOne = buildingNumberDTOS.get(0); + BuildingNumberDTO mainBuildingTwo = buildingNumberDTOS.get(1); + BuildingNumberDTO recordingBuilding = buildingNumberDTOS.get(2); + HashMap resultMap = new HashMap<>(); + Integer oneQuantity = Integer.valueOf(mainBuildingOne.getStatisticQuantity()); + Integer recordingQuantity = Integer.valueOf(recordingBuilding.getStatisticQuantity()); + resultMap.put("staticTime", mainBuildingOne.getStatisticTime()); + resultMap.put(mainBuildingOne.getStatisticPositionName()+"、"+recordingBuilding.getStatisticPositionName(), String.valueOf(oneQuantity+recordingQuantity)); + resultMap.put(mainBuildingTwo.getStatisticPositionName(), mainBuildingTwo.getStatisticQuantity()); + resultList.add(resultMap); + }); + return ResponseData.success(resultList); } /** @@ -151,12 +168,11 @@ public Object securityNumber() { QueryWrapper wrapper = new QueryWrapper<>(); wrapper.eq("staff_type", 2); + // TODO: 2022/9/2 后续使用产品确定的每天出勤的安保人员的数量 Integer total = staffInfoMapper.selectCount(wrapper); - //当日离岗事件个数 - QueryWrapper wrapper1 = new QueryWrapper<>(); - wrapper1.eq("hik_event_type", SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); - wrapper1.apply("date_format(now(),'%Y-%m-%d') = date_format(happen_time,'%Y-%m-%d')"); - Integer leave = caseInfoMapper.selectCount(wrapper1); + //当日离岗事件按设备去重后的个数 + // TODO: 2022/9/2 目前相当于24小时内的计算,之后看需要可改成自定义小时数计算离岗率,即离岗+6小时内仅一次离岗则恢复为100%,多次则累加离岗次数计算离岗率 + Integer leave = caseInfoMapper.selectDemobilizedCount(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); NumberFormat numberFormat = NumberFormat.getInstance(); // 设置精确到小数点后2位 numberFormat.setMaximumFractionDigits(2); @@ -179,7 +195,6 @@ @ResponseBody public Object visitorApplyDetail() { List reasonGroup = applyMapper.selectByVisitReason(); - HashMap resultMap = new HashMap<>(); NumberFormat numberFormat = NumberFormat.getInstance(); // 设置精确到小数点后2位 numberFormat.setMaximumFractionDigits(2); @@ -187,12 +202,17 @@ if(0 == sum){ return ResponseData.success(); } + List resultList = new ArrayList<>(); reasonGroup.forEach(group -> { String reasonName = dictService.getDictNameByCode(SecurityEventDict.VISIT_REASON, group.getVisitReason()); String result = numberFormat.format((float) group.getQuantity() / (float) sum * 100); - resultMap.put(reasonName, result+"%"); + ApplyReasonGroupDTO applyReasonGroupDTO = new ApplyReasonGroupDTO(); + applyReasonGroupDTO.setQuantity(group.getQuantity()); + applyReasonGroupDTO.setVisitReason(reasonName); + applyReasonGroupDTO.setRatio(result+"%"); + resultList.add(applyReasonGroupDTO); }); - return ResponseData.success(resultMap); + return ResponseData.success(resultList); } /** @@ -247,6 +267,32 @@ } /** + * 机动力量实时在岗率,在岗人数除以总应在岗人数,用离岗+6小时内恢复为100%,6小时外再计算 + */ + @GetMapping("/staff/beOnDutyRatio") + @ResponseBody + public Object beOnDutyRatio() { + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("staff_type", 2); + // TODO: 2022/9/2 后续使用产品确定的每天出勤的安保人员的数量 + Integer total = staffInfoMapper.selectCount(wrapper); + if(0 == total){ + return ResponseData.success(null); + } + //当日离岗事件按设备去重后的个数 + // TODO: 2022/9/2 目前相当于24小时内的计算,之后看需要可改成自定义小时数计算离岗率,即离岗+6小时内仅一次离岗则恢复为100%,多次则累加离岗次数计算离岗率 + List onDutyRatioDTOS = caseInfoMapper.selectDemobilizedCountByHour(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); + onDutyRatioDTOS.forEach(dto -> { + NumberFormat numberFormat = NumberFormat.getInstance(); + // 设置精确到小数点后2位 + numberFormat.setMaximumFractionDigits(2); + String result = numberFormat.format(100 - Float.valueOf(dto.getQuantity()) / (float) total * 100); + dto.setRatio(result+"%"); + }); + return ResponseData.success(onDutyRatioDTOS); + } + + /** * 闸机速通门统计-设备状态分组计算数量,devType传闸机字典key * 视频频监控摄像机统计-设备状态分组计算数量,devType传摄像头字典key */ @@ -262,12 +308,17 @@ if(sum <= 0){ return ResponseData.error("无该类设备信息"); } + List resultList = new ArrayList<>(); gateStatusGroup.forEach(group -> { String devStatus = dictService.getDictNameByCode(SecurityEventDict.DEVICE_STATUS, group.getStatus()); String result = numberFormat.format((float) group.getQuantity() / (float) sum * 100); - resultMap.put(devStatus, result+"%"); + GateStatusGroupResponse gateStatusGroupResponse = new GateStatusGroupResponse(); + gateStatusGroupResponse.setStatus(devStatus); + gateStatusGroupResponse.setRatio(result+"%"); + resultList.add(gateStatusGroupResponse); }); - resultMap.put("总", sum); + resultMap.put("total", sum); + resultMap.put("list", resultList); return ResponseData.success(resultMap); } @@ -282,17 +333,38 @@ String position = securityScoreDTO.getPosition(); List caseInfos = caseInfoMapper.selectByPosition(position); //查询各危险级别权重、各类别权重,放入map,避免循环中多次查数据库 - + HashMap hazardScoreMap = new HashMap<>(); + List caseHazardLevelList = hazardLevelMapper.getCaseHazardLevelList(null); + caseHazardLevelList.forEach(hazardLevel -> { + hazardScoreMap.put(hazardLevel.getCode(), hazardLevel.getWeight()); + }); + HashMap categoryScoreMap = new HashMap<>(); + List categoryLevelList = categoryLevelMapper.getCaseCategoryLevelList(null); + categoryLevelList.forEach(categoryLevel -> { + categoryScoreMap.put(categoryLevel.getCode(), categoryLevel.getWeight()); + }); + //事件按楼层分组,计算 List securityScoreDTOs = new ArrayList<>(); caseInfos.forEach(caseInfo -> { SecurityScoreDTO securityScoreDTO1 = new SecurityScoreDTO(); + securityScoreDTO1.setPosition(caseInfo.getPosition()); securityScoreDTO1.setArea(caseInfo.getArea()); - // TODO: 2022/8/4 楼层评分计算根据产品定义调整 -// caseInfo.get -// securityScoreDTO1.setScore(); + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); + Double score = 100 - Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + securityScoreDTO1.setScore(score); + securityScoreDTOs.add(securityScoreDTO1); }); - - return null; + 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); + }); + return ResponseData.success(securityScoreDTOs); } /** @@ -303,9 +375,13 @@ public Object SecurityFrequency(@RequestBody SecurityFrequencyDTO securityFrequencyDTO) { String year = securityFrequencyDTO.getYear(); String month = securityFrequencyDTO.getMonth(); - Integer quantity = caseInfoMapper.selectCountByMonth(year, month); - securityFrequencyDTO.setQuantity(quantity); - return ResponseData.success(securityFrequencyDTO); + if(!StringUtils.isEmpty(year) && StringUtils.isEmpty(month)){ + Integer quantity = caseInfoMapper.selectCountByMonth(year, month); + securityFrequencyDTO.setQuantity(quantity); + return ResponseData.success(securityFrequencyDTO); + } + List list = caseInfoMapper.selectPreMonthCount(); + return ResponseData.success(list); } } 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 ae4d770..f4f075c 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 @@ -1,20 +1,25 @@ package com.casic.missiles.modular.controller.cockpit; +import cn.hutool.core.date.DateUnit; import cn.hutool.core.date.DateUtil; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.casic.missiles.model.response.ResponseData; -import com.casic.missiles.modular.dao.AttendanceInfoMapper; -import com.casic.missiles.modular.dao.CaseInfoMapper; -import com.casic.missiles.modular.dao.HazardLevelMapper; -import com.casic.missiles.modular.dao.StaffInfoMapper; +import com.casic.missiles.modular.dao.*; +import com.casic.missiles.modular.dto.DeviceRepairLogDTO; +import com.casic.missiles.modular.dto.DeviceRepairRequest; import com.casic.missiles.modular.dto.statistics.*; +import com.casic.missiles.modular.enums.SecurityEventType; +import com.casic.missiles.modular.model.CaseCategoryLevel; import com.casic.missiles.modular.model.CaseHazardLevel; +import com.casic.missiles.modular.model.CaseInfo; import com.casic.missiles.modular.model.StaffInfo; +import com.casic.missiles.modular.service.DeviceInfoService; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.util.CollectionUtils; import org.springframework.web.bind.annotation.*; +import java.math.BigDecimal; import java.text.NumberFormat; import java.util.*; import java.util.stream.Collectors; @@ -40,6 +45,12 @@ @Autowired private HazardLevelMapper hazardLevelMapper; + @Autowired + private CategoryLevelMapper categoryLevelMapper; + + @Autowired + private DeviceInfoService deviceInfoService; + /** * 安防事件时域频次统计,每月的每天安防事件个数(原方案) * 月维度:展示每个月的每天的数据 @@ -89,15 +100,17 @@ List monthList = caseInfoMapper.selectPreMonthCountByYear(year); Map> collect = monthList.stream().collect(Collectors.groupingBy(PreMonthOrWeekCaseDTO::getHazardLevelCode)); HashMap strAvgMap = new HashMap<>(); + List resultList = new ArrayList<>(); for (String key : collect.keySet()) { List preMonthOrWeekCaseDTOS = collect.get(key); int sum = preMonthOrWeekCaseDTOS.stream().mapToInt(PreMonthOrWeekCaseDTO::getQuantity).sum(); //若年份是本年,则使用个安防级别数量/当前月份数 //若不是本年,除数为12 MonthAndWeekDTO monthAndWeekDTO = new MonthAndWeekDTO(); + String hazardName = hazardLevelMapper.selectHazardNameByCode(key); + monthAndWeekDTO.setLevelName(hazardName); if(year.equals(String.valueOf(DateUtil.thisYear()))){ monthAndWeekDTO.setMonthQuantity(sum / DateUtil.thisMonth()); -// monthAndWeekDTO.setLevelName(); strAvgMap.put(key, monthAndWeekDTO); }else{ monthAndWeekDTO.setMonthQuantity(sum / 12); @@ -113,27 +126,37 @@ if(year.equals(String.valueOf(DateUtil.thisYear()))){ if(!Objects.isNull(strAvgMap.get(key))){ MonthAndWeekDTO monthAndWeekDTO = strAvgMap.get(key); + String hazardName = hazardLevelMapper.selectHazardNameByCode(key); + monthAndWeekDTO.setLevelName(hazardName); monthAndWeekDTO.setWeekQuantity(sum / DateUtil.thisWeekOfYear()); strAvgMap.put(key, monthAndWeekDTO); }else{ MonthAndWeekDTO monthAndWeekDTO = new MonthAndWeekDTO(); + String hazardName = hazardLevelMapper.selectHazardNameByCode(key); + monthAndWeekDTO.setLevelName(hazardName); monthAndWeekDTO.setWeekQuantity(sum / DateUtil.thisWeekOfYear()); strAvgMap.put(key, monthAndWeekDTO); } }else{ if(!Objects.isNull(strAvgMap.get(key))){ MonthAndWeekDTO monthAndWeekDTO = strAvgMap.get(key); + String hazardName = hazardLevelMapper.selectHazardNameByCode(key); + monthAndWeekDTO.setLevelName(hazardName); monthAndWeekDTO.setWeekQuantity(sum / 52); strAvgMap.put(key, monthAndWeekDTO); }else{ MonthAndWeekDTO monthAndWeekDTO = new MonthAndWeekDTO(); + String hazardName = hazardLevelMapper.selectHazardNameByCode(key); + monthAndWeekDTO.setLevelName(hazardName); monthAndWeekDTO.setWeekQuantity(sum / 52); strAvgMap.put(key, monthAndWeekDTO); } } } - avgMonthAndWeekGroupDTO.setMap(strAvgMap); - return ResponseData.success(avgMonthAndWeekGroupDTO); + strAvgMap.keySet().forEach(key -> { + resultList.add(strAvgMap.get(key)); + }); + return ResponseData.success(resultList); } /** @@ -181,12 +204,178 @@ } /** - * 员工考勤人数变化,功能待定 + * 员工考勤人数变化,统计当天(横坐标为时)及近7天(横坐标为天)的考勤人数变化,只要发生一次考勤识别,次数的基数就正常增加(没有上班下班区分) */ + @PostMapping("/staff/attendanceNumber/{dimension}") + @ResponseBody + public Object attendanceNumber(@PathVariable("dimension") String dimension) { + List attendanceNumberDTOs = null; + List> resultList = new ArrayList<>(); + if("week".equals(dimension)){ + //近7天数据按天分组统计 + attendanceNumberDTOs = attendanceInfoMapper.getCountForWeek(); + }else if("day".equals(dimension)) { + //今天数据按小时分组统计 + attendanceNumberDTOs = attendanceInfoMapper.getCountForDay(); + } + if(CollectionUtils.isEmpty(attendanceNumberDTOs)){ + return ResponseData.error("该查询条件下,无员工出勤数据!"); + } + Map> collect = attendanceNumberDTOs.stream().collect(Collectors.groupingBy(AttendanceNumberDTO::getDate)); + collect.keySet().forEach(key -> { + List attendanceNumberDTOS = collect.get(key); + AttendanceNumberDTO attendanceNumberDTO = attendanceNumberDTOS.get(0); + AttendanceNumberDTO attendanceNumberDTO2 = attendanceNumberDTOS.get(1); + Map resultMap = new HashMap<>(); + resultMap.put(attendanceNumberDTO.getStaffType(), attendanceNumberDTO.getQuantity()); + resultMap.put(attendanceNumberDTO2.getStaffType(), attendanceNumberDTO2.getQuantity()); + resultMap.put("staticTime", attendanceNumberDTO.getDate()); + resultList.add(resultMap); + }); + return ResponseData.success(resultList); + } /** - * 近30天/近一周安保人员到岗排行 + * 早晚高峰区域安防评估 */ + @PostMapping("/security/assessment/{dimension}") + @ResponseBody + public Object securityAssessment(@PathVariable("dimension") String dimension) { + //查询各危险级别权重、各类别权重,放入map,避免循环中多次查数据库 + HashMap hazardScoreMap = new HashMap<>(); + List caseHazardLevelList = hazardLevelMapper.getCaseHazardLevelList(null); + caseHazardLevelList.forEach(hazardLevel -> { + hazardScoreMap.put(hazardLevel.getCode(), hazardLevel.getWeight()); + }); + HashMap categoryScoreMap = new HashMap<>(); + List categoryLevelList = categoryLevelMapper.getCaseCategoryLevelList(null); + categoryLevelList.forEach(categoryLevel -> { + categoryScoreMap.put(categoryLevel.getCode(), categoryLevel.getWeight()); + }); + HashMap hashMap = new HashMap<>(); + if("week".equals(dimension)){ + //近7天早晚高峰数据 + List caseInfos = caseInfoMapper.selectListBySevenDay(); + //按时间(天)进行分组 + caseInfos.forEach(caseInfo -> { + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); + Double score = Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + String[] array = caseInfo.getHappenTime().split(" "); + String dayTime = array[0]; + BigDecimal preScore; + if(hashMap.containsKey(dayTime)){ + Double aDouble = hashMap.get(dayTime); + preScore = new BigDecimal(aDouble.toString()); + + }else{ + preScore = new BigDecimal("100.0"); + } + BigDecimal nowScore = new BigDecimal(score.toString()); + hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); + }); + return ResponseData.success(hashMap); + }else if("day".equals(dimension)) { + //今天数据按小时分组统计 + List caseInfos = caseInfoMapper.selectListByToday(); + caseInfos.forEach(caseInfo -> { + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); + Double score = Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + String[] array = caseInfo.getHappenTime().split(":"); + String dayTime = array[0]; + BigDecimal preScore; + if(hashMap.containsKey(dayTime)){ + Double aDouble = hashMap.get(dayTime); + preScore = new BigDecimal(aDouble.toString()); + + }else{ + preScore = new BigDecimal("100.0"); + } + BigDecimal nowScore = new BigDecimal(score.toString()); + hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); + }); + return ResponseData.success(hashMap); + } + return null; + } + + /** + * 重点区域安防事态评估,统计重点区域6:00-23:00按小时分组数据 + */ + @GetMapping("/security/keyAreaStatistic") + @ResponseBody + public Object keyAreaStatistic() { + //查询各危险级别权重、各类别权重,放入map,避免循环中多次查数据库 + HashMap hazardScoreMap = new HashMap<>(); + List caseHazardLevelList = hazardLevelMapper.getCaseHazardLevelList(null); + caseHazardLevelList.forEach(hazardLevel -> { + hazardScoreMap.put(hazardLevel.getCode(), hazardLevel.getWeight()); + }); + HashMap categoryScoreMap = new HashMap<>(); + List categoryLevelList = categoryLevelMapper.getCaseCategoryLevelList(null); + categoryLevelList.forEach(categoryLevel -> { + categoryScoreMap.put(categoryLevel.getCode(), categoryLevel.getWeight()); + }); + HashMap hashMap = new HashMap<>(); + //今天数据按小时分组统计 + List caseInfos = caseInfoMapper.selectListByToday2(); + caseInfos.forEach(caseInfo -> { + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); + Double score = Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + String[] array = caseInfo.getHappenTime().split(":"); + String dayTime = array[0]; + BigDecimal preScore; + if(hashMap.containsKey(dayTime)){ + Double aDouble = hashMap.get(dayTime); + preScore = new BigDecimal(aDouble.toString()); + + }else{ + preScore = new BigDecimal("100.0"); + } + BigDecimal nowScore = new BigDecimal(score.toString()); + hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); + }); + return ResponseData.success(hashMap); + } + + /** + * 安防机动支援力量调配响应评估,根据事件已解决状态及已解决时间-发送时间,按时间(小时)分组统计 + */ + @GetMapping("/security/responseAssess") + @ResponseBody + public Object responseAssess() { + //查询各危险级别权重、各类别权重,放入map,避免循环中多次查数据库 + HashMap hazardScoreMap = new HashMap<>(); + List caseHazardLevelList = hazardLevelMapper.getCaseHazardLevelList(null); + caseHazardLevelList.forEach(hazardLevel -> { + hazardScoreMap.put(hazardLevel.getCode(), hazardLevel.getWeight()); + }); + HashMap hashMap = new HashMap<>(); + //今天数据按小时分组统计 + List caseInfos = caseInfoMapper.selectListByToday3(); + caseInfos.forEach(caseInfo -> { + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + //扣分=事件级别权重*未解决小时数 + Date updateTime = DateUtil.parse(caseInfo.getUpdateTime()); + Date happenTime = DateUtil.parse(caseInfo.getHappenTime()); + long between = DateUtil.between(updateTime, happenTime, DateUnit.HOUR); + Double score = Double.valueOf(hazardWeight)*between; + String[] array = caseInfo.getHappenTime().split(":"); + String dayTime = array[0]; + BigDecimal preScore; + if(hashMap.containsKey(dayTime)){ + Double aDouble = hashMap.get(dayTime); + preScore = new BigDecimal(aDouble.toString()); + }else{ + preScore = new BigDecimal("100.0"); + } + BigDecimal nowScore = new BigDecimal(score.toString()); + hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); + }); + return ResponseData.success(hashMap); + } /** * 重点区域威胁事件类型统计,优先级2,统计近7天和近30天 @@ -224,7 +413,34 @@ } /** - * 设备状态计算系数和评判,优先级3,需确认设备恢复时间是否可以获取 + * 近30天/近一周安保人员到岗排行 */ + + /** + * 安保等级评估,发生离岗事件减1分 + */ + @GetMapping("/security/levelAssess") + @ResponseBody + public Object securityLevelAssess() { + //今天数据按小时分组统计 + List resultList = caseInfoMapper.selectListByType(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); + resultList.forEach(result -> { + BigDecimal deScore = new BigDecimal(result.getQuantity()); + BigDecimal preScore = new BigDecimal("100.0"); + result.setScore(preScore.subtract(deScore).doubleValue()); + }); + return ResponseData.success(resultList); + } + + /** + * 设备状态计算系数和评判,即设备维修管理查询(不分页) + */ + @PostMapping("/device/repairList") + @ResponseBody + public Object repairList(@RequestBody DeviceRepairRequest deviceRepairRequest) { + List deviceRepairLogDTOS = deviceInfoService.deviceRepairListPage(deviceRepairRequest); + return ResponseData.success(deviceRepairLogDTOS); + } + } 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 fbf8ab6..c71a15a 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 @@ -1,13 +1,12 @@ package com.casic.missiles.modular.controller.hik; +import cn.hutool.core.date.DateTime; +import cn.hutool.core.date.DateUtil; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.casic.missiles.model.response.ResponseData; import com.casic.missiles.modular.dao.HikFaceGroupInfoMapper; -import com.casic.missiles.modular.dto.hik.EventSubscribeRequest; -import com.casic.missiles.modular.dto.hik.FaceGroupAdditionRequest; -import com.casic.missiles.modular.dto.hik.HikRecvEvent; -import com.casic.missiles.modular.dto.hik.OrgBatchAdd; +import com.casic.missiles.modular.dto.hik.*; import com.casic.missiles.modular.enums.HikUri; import com.casic.missiles.modular.enums.SecurityEventType; import com.casic.missiles.modular.model.CaseInfo; @@ -18,16 +17,20 @@ import com.casic.missiles.modular.util.CaseInfoFactoryUtil; import com.casic.missiles.modular.util.HikUtil; import com.casic.missiles.modular.util.ThreadPoolUtil; +import com.casic.missiles.modular.util.WebSocket; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; -import org.springframework.web.bind.annotation.*; +import org.springframework.util.CollectionUtils; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.RestController; -import java.net.InetAddress; -import java.net.UnknownHostException; import java.util.ArrayList; +import java.util.Iterator; import java.util.List; import java.util.Objects; @@ -38,7 +41,6 @@ */ @Slf4j @RestController -@RequestMapping("/hik") public class HikController { @Autowired @@ -53,28 +55,37 @@ @Autowired private HikService hikService; + @Autowired + private HikFaceGroupInfoMapper hikFaceGroupInfoMapper; + + @Autowired + private WebSocket webSocket; + @Value("${server.port}") private int serverPort; - @Autowired - private HikFaceGroupInfoMapper hikFaceGroupInfoMapper; /** * 海康事件订阅 */ - @PostMapping("/event/subscribe") + @PostMapping("/hik/event/subscribe") @ResponseBody - public Object eventSubscribe() throws UnknownHostException { + public Object eventSubscribe() { EventSubscribeRequest eventSubscribeRequest = new EventSubscribeRequest(); ArrayList list = new ArrayList<>(); list.add(SecurityEventType.DEVICE_OFFLINE); + list.add(SecurityEventType.DEVICE_ONLINE); list.add(SecurityEventType.KEY_PERSONNEL_IDENTIFY_EVENT); list.add(SecurityEventType.MONITORING_POINT_OFFLINE); + list.add(SecurityEventType.MONITORING_POINT_ONLINE); list.add(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); list.add(SecurityEventType.PERSONNEL_GATHER_EVENT); - InetAddress localHost = InetAddress.getLocalHost(); + list.add(SecurityEventType.VISITOR_REGISTER); + list.add(SecurityEventType.VISITOR_CHECKOUT); + list.add(SecurityEventType.HIGH_ALTITUDE_PARABOLIC); +// InetAddress localHost = InetAddress.getLocalHost(); eventSubscribeRequest.setEventTypes(list); - eventSubscribeRequest.setEventDest("https://" + localHost + ":" + serverPort + "/eventRcv"); + eventSubscribeRequest.setEventDest("http://" + "192.168.10.6" + ":" + serverPort + "/eventRcv"); //订阅类型,0-订阅原始事件,1-联动事件,2-原始事件和联动事件,不填使用默认值0 eventSubscribeRequest.setSubType(0); /** @@ -92,19 +103,25 @@ } /** + * 查询事件订阅信息 + */ + @PostMapping("/hik/event/query") + @ResponseBody + public Object eventQuery() { + String result = HikUtil.hikApi(HikUri.EVENT_INFO, ""); + return result; + } + + /** * 海康事件接收 */ @PostMapping("/eventRcv") @ResponseBody public Object eventRcv(@RequestBody HikRecvEvent hikRecvEvent) { //1、接收所需事件类型 - Long eventType = hikRecvEvent.getEventType(); + Number eventType = hikRecvEvent.getEventType(); log.info("接收到安防事件类型为:{}", eventType); CaseInfo caseInfo = caseInfoFactoryUtil.getCaseInfo(eventType); - //接收到不关心事件直接返回 - if(Objects.isNull(caseInfo)){ - return ResponseData.success(); - } //2、不同事件不同处理,caseInfoFactoryUtil已设置好事件基础定义信息 // 再为事件添加状态、设备编码、设备名称、位置、区域、时间 // 异步处理事件 @@ -114,19 +131,23 @@ caseHandle(hikRecvEvent, eventType, caseInfo); } })); +// caseHandle(hikRecvEvent, eventType, caseInfo); - return null; + return ResponseData.success(); } - private void caseHandle(HikRecvEvent hikRecvEvent, Long eventType, CaseInfo caseInfo) { + private void caseHandle(HikRecvEvent hikRecvEvent, Number eventType, CaseInfo caseInfo) { JSONArray eventArray = hikRecvEvent.getEventArray(); List caseInfos = new ArrayList<>(); - while (eventArray.stream().iterator().hasNext()) { + Iterator iterator = eventArray.iterator(); + while (iterator.hasNext()) { CaseInfo caseInfo1 = new CaseInfo(); - BeanUtils.copyProperties(caseInfo, caseInfo1); - JSONObject event = (JSONObject) eventArray.stream().iterator().next(); + if(!Objects.isNull(caseInfo)){ + BeanUtils.copyProperties(caseInfo, caseInfo1); + } + JSONObject event = (JSONObject) iterator.next(); //5种事件进行不同处理 - if(SecurityEventType.KEY_PERSONNEL_IDENTIFY_EVENT == eventType){ + if (SecurityEventType.KEY_PERSONNEL_IDENTIFY_EVENT.equals(eventType)) { //判断所属人脸分组 JSONObject data = (JSONObject) event.get("data"); JSONObject faceRecognitionResult = (JSONObject) data.get("faceRecognitionResult"); @@ -142,52 +163,101 @@ if (faceGroupCode.equals(blackListGroup.getFaceGroupCode())) { //黑名单分组处理 caseInfo1 = hikService.blackListHandle(event, caseInfo1); - }else if(faceGroupCode.equals(propertyPersonnelGroup.getFaceGroupCode())){ + } else if (faceGroupCode.equals(propertyPersonnelGroup.getFaceGroupCode())) { //考勤分组处理-物业人员,添加到考勤表 hikService.propertyAttendanceHandle(event); - }else if(faceGroupCode.equals(securityPersonnelGroup.getFaceGroupCode())){ + } else if (faceGroupCode.equals(securityPersonnelGroup.getFaceGroupCode())) { //考勤分组处理-安保人员,添加到考勤表 hikService.securityPersonnelHandle(event); - }else { + } else { return; } - }else if(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT == eventType){ + } else if (SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT.equals(eventType)) { //离岗事件处理 caseInfo1 = hikService.demobilizedHandle(event, caseInfo1); - }else if(SecurityEventType.PERSONNEL_GATHER_EVENT == eventType){ + } else if (SecurityEventType.PERSONNEL_GATHER_EVENT.equals(eventType)) { //人员聚集事件处理 caseInfo1 = hikService.personGatherHandle(event, caseInfo1); - }else if(SecurityEventType.MONITORING_POINT_OFFLINE == eventType){ + } else if (SecurityEventType.MONITORING_POINT_OFFLINE.equals(eventType)) { //监控点离线事件处理 caseInfo1 = hikService.monitorPointOfflineHandle(event, caseInfo1); - }else if(SecurityEventType.DEVICE_OFFLINE == eventType){ + } else if (SecurityEventType.MONITORING_POINT_ONLINE.equals(eventType)) { + //监控点上线事件处理 + hikService.monitorPointOnlineHandle(event); + } else if (SecurityEventType.DEVICE_OFFLINE.equals(eventType)) { //装置离线事件处理 caseInfo1 = hikService.deviceOfflineHandle(event, caseInfo1); - }else if(SecurityEventType.VISITOR_REGISTER == eventType){ + } else if (SecurityEventType.DEVICE_ONLINE.equals(eventType)) { + //装置上线处理 + hikService.deviceOnlineHandle(event); + } else if (SecurityEventType.VISITOR_REGISTER.equals(eventType)) { //记录访客登记记录,添加到访客记录表 hikService.visitorRegisterHandler(event); - }else if(SecurityEventType.VISITOR_CHECKOUT == eventType){ + } else if (SecurityEventType.VISITOR_CHECKOUT.equals(eventType)) { //记录访客签离记录 hikService.visitorCheckOutHandler(event); } - if(!Objects.isNull(caseInfo1) && !StringUtils.isEmpty(caseInfo1.getHappenTime())){ + if (!Objects.isNull(caseInfo1) && !StringUtils.isEmpty(caseInfo1.getHappenTime())) { caseInfos.add(caseInfo1); } } //3、安防事件入库 - if(!caseInfoService.insertCaseInfoBatch(caseInfos)){ - log.error("安防事件批量入库异常"); + if (!CollectionUtils.isEmpty(caseInfos) && !caseInfoService.insertCaseInfoBatch(caseInfos)) { + log.error("安防事件批量入库异常!"); } // TODO: 2022/8/15 webSocket推送 + if (CollectionUtils.isEmpty(caseInfos)) { + log.info("webSocket事件推送"); + webSocket.sendAllMessage(JSONObject.toJSONString(caseInfos)); + } return; } /** + * 以图搜图,前端用于轨迹追踪 + */ + @PostMapping("/hik/search/picture") + @ResponseBody + public Object searchPictures(@RequestBody SearchPicturesRequest searchPicturesRequest) { + DateTime startDateTime = DateUtil.parse(searchPicturesRequest.getStartTime()); + DateTime endDateTime = DateUtil.parse(searchPicturesRequest.getEndTime()); + String startTime = DateUtil.format(startDateTime, "yyyy-MM-dd'T'HH:mm:ss.SSSXXX"); + String endTime = DateUtil.format(endDateTime, "yyyy-MM-dd'T'HH:mm:ss.SSSXXX"); + searchPicturesRequest.setStartTime(startTime); + searchPicturesRequest.setEndTime(endTime); + String body = JSONObject.toJSONString(searchPicturesRequest); + String resultStr = HikUtil.hikApi(HikUri.SEARCH_PICTURES, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (!"0".equals(resultJson.get("code"))) { + log.error("请求海康,以图搜图失败,海康response:{}", resultStr); + return ResponseData.error("以图搜图失败"); + } + return ResponseData.success(resultJson); + } + + + /** + * 海康事件取消订阅 + */ + @PostMapping("/hik/event/cancel") + @ResponseBody + public Object eventCancelSubscribe(@RequestBody CancelSubscribeRequest cancelSubscribeRequest) { + String body = JSONObject.toJSONString(cancelSubscribeRequest); + String resultStr = HikUtil.hikApi(HikUri.EVENT_CANCEL, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (!"0".equals(resultJson.get("code"))) { + log.error("请求海康,取消订阅失败,海康response:{}", resultStr); + return ResponseData.error("取消订阅失败"); + } + return ResponseData.success(resultJson); + } + + /** * 单个添加海康人脸分组 * api->hik单个添加人脸分组api->response->mysql */ - @PostMapping("/faceGroup/single/add") + @PostMapping("/hik/faceGroup/single/add") @ResponseBody public Object faceGroupAddition(@RequestBody FaceGroupAdditionRequest faceGroupAdditionRequest) { String body = JSONObject.toJSONString(faceGroupAdditionRequest); @@ -212,7 +282,7 @@ * 批量添加海康组织 * api->hik批量添加组织api->response */ - @PostMapping("/org/batch/add") + @PostMapping("/hik/org/batch/add") @ResponseBody public Object orgBatchAdd(@RequestBody List orgBatchAddRequest) { String body = JSONObject.toJSONString(orgBatchAddRequest); @@ -232,4 +302,62 @@ return ResponseData.error("批量添加组织失败"); } + /** + * 获取人员列表 + */ + @PostMapping("/hik/person/personList") + @ResponseBody + public Object personList() { + PersonListRequest request = new PersonListRequest(); + request.setPageNo(1); + request.setPageSize(100); + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi("/api/resource/v2/person/personList", body); + return resultStr; + } + + /** + * 获取组织列表 + */ + @PostMapping("/hik/org/orgList") + @ResponseBody + public Object orgList() { + PersonListRequest request = new PersonListRequest(); + request.setPageNo(1); + request.setPageSize(100); + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi("/api/resource/v1/org/orgList", body); + return resultStr; + } + + /** + * 查询访客权限下载记录 + */ + @PostMapping("/hik/auth/result") + @ResponseBody + public Object authResult() { + PersonListRequest request = new PersonListRequest(); + request.setPageNo(1); + request.setPageSize(100); + request.setOrderId("ba101db6246711edaea66f7939a13638"); + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi("/api/visitor/v1/auth/result", body); + return resultStr; + } + + /** + * 人脸图片获取 + */ + @PostMapping("/hik/face/picture") + @ResponseBody + public Object facePicture() { + FaceRequest request = new FaceRequest(); +// List list = new ArrayList<>(); +// list.add(""); + request.setCertificateNum("wanggong"); + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi("/api/frs/v1/face", body); + return resultStr; + } + } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/AssetInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/AssetInfoMapper.java index 4f64e83..c0684ee 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/AssetInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/AssetInfoMapper.java @@ -17,6 +17,6 @@ @Mapper public interface AssetInfoMapper extends BaseMapper { - List getAssetInfoListPage(@Param("page") Page page, AssetInfoRequest assetInfoRequest); + List getAssetInfoListPage(@Param("page") Page page, @Param("assetInfoRequest") AssetInfoRequest assetInfoRequest); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/AttendanceInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/AttendanceInfoMapper.java index f9e793e..ec87e46 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/AttendanceInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/AttendanceInfoMapper.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.statistics.AttendanceNumberDTO; import com.casic.missiles.modular.dto.statistics.AttendanceRatioDTO; import com.casic.missiles.modular.model.AttendanceInfo; import org.apache.ibatis.annotations.Mapper; @@ -17,7 +18,7 @@ */ @Mapper public interface AttendanceInfoMapper extends BaseMapper { - List getAttendanceInfoListPage(@Param("page") Page page, StaffInfoRequest attendanceInfoRequest); + List getAttendanceInfoListPage(@Param("page") Page page, @Param("attendanceInfoRequest") StaffInfoRequest attendanceInfoRequest); AttendanceInfo selectByCodeAndDate(@Param("staffCode") String staffCode); @@ -26,4 +27,8 @@ List getCountByTypeAndDateForMonth(@Param("staffType")String staffType); List getCountByTypeAndDateForYear(@Param("staffType")String staffType); + + List getCountForWeek(); + + List getCountForDay(); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java index ce94b8f..6137a7d 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java @@ -17,5 +17,5 @@ @Mapper public interface BlackInfoMapper extends BaseMapper { - List getBlackInfoListPage(@Param("page") Page page, BlackInfoRequest blackInfoRequest); + List getBlackInfoListPage(@Param("page") Page page, @Param("blackInfoRequest") BlackInfoRequest blackInfoRequest); } 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 efda6b3..50aaa6f 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 @@ -20,7 +20,7 @@ List getCaseInfoListPage(@Param("page") Page page, @Param("caseInfoRequest") CaseInfoRequest caseInfoRequest); - int updateStatusById(CaseInfoRequest caseInfoRequest); + int updateStatusById(@Param("caseInfoRequest") CaseInfoRequest caseInfoRequest); List selectByLevelAndMonth(@Param("year") String year); @@ -47,4 +47,20 @@ List selectPreWeekCountByThirtyDay(); List selectPreDayCountBySevenDay(); + + Integer selectDemobilizedCount(@Param("eventType") Number personnelDemobilizedEvent); + + List selectPreMonthCount(); + + List selectListBySevenDay(); + + List selectListByToday(); + + List selectListByToday2(); + + List selectListByToday3(); + + List selectListByType(@Param("eventType") Number eventType); + + List selectDemobilizedCountByHour(@Param("eventType") Number eventType); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/CategoryLevelMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/CategoryLevelMapper.java index 52fc714..afe1650 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/CategoryLevelMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/CategoryLevelMapper.java @@ -17,9 +17,9 @@ @Mapper public interface CategoryLevelMapper extends BaseMapper { - List getCaseCategoryLevelListPage(@Param("page") Page page, CategoryLevelRequest categoryLevelRequest); + List getCaseCategoryLevelListPage(@Param("page") Page page, @Param("categoryLevelRequest") CategoryLevelRequest categoryLevelRequest); - List getCaseCategoryLevelList(CategoryLevelRequest categoryLevelRequest); + List getCaseCategoryLevelList(@Param("categoryLevelRequest") CategoryLevelRequest categoryLevelRequest); CaseCategoryLevel getCaseCategoryLevel(@Param("categoryLevelCode") String categoryLevelCode); 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 66353b1..2555a09 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 @@ -19,7 +19,7 @@ @Mapper public interface DeviceInfoMapper extends BaseMapper { - List getDeviceInfoListPage(@Param("page") Page page, DeviceInfoRequest deviceInfoRequest); + List getDeviceInfoListPage(@Param("page") Page page, @Param("deviceInfoRequest") DeviceInfoRequest deviceInfoRequest); List getDeviceInfoList(@Param("deviceInfoRequest") DeviceInfoRequest deviceInfoRequest); @@ -27,6 +27,8 @@ DeviceInfo getByIndexCode(@Param("srcIndex") String srcIndex); + DeviceInfo getByIp(@Param("ip") String ip); + List selectIndexCodesByCodes(@Param("deviceCodes") List deviceCodes); List selectByType(@Param("devType") String devType); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java index 41dd0af..5bfaf63 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java @@ -5,6 +5,7 @@ import com.casic.missiles.modular.dto.DeviceRepairRequest; import com.casic.missiles.modular.model.DeviceRepairLog; import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; import java.util.List; @@ -16,7 +17,7 @@ @Mapper public interface DeviceRepairLogMapper extends BaseMapper { - List getDeviceRepairListPage(Page page, DeviceRepairRequest deviceRepairRequest); + List getDeviceRepairListPage(@Param("page") Page page, @Param("deviceRepairRequest")DeviceRepairRequest deviceRepairRequest); - List getDeviceRepairList(DeviceRepairRequest deviceRepairRequest); + List getDeviceRepairList(@Param("deviceRepairRequest") DeviceRepairRequest deviceRepairRequest); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java index 9035c47..4823ac1 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java @@ -18,7 +18,7 @@ @Mapper public interface FireEquipInfoMapper extends BaseMapper { - List getFireEquipInfoListPage(@Param("page") Page page, FireEquipRequest fireEquipRequest); + List getFireEquipInfoListPage(@Param("page") Page page, @Param("fireEquipRequest") FireEquipRequest fireEquipRequest); FireEquipInfo getFireEquipInfo(@Param("equipCode") String equipCode); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/GateGroupMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/GateGroupMapper.java index d8c330d..977a427 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/GateGroupMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/GateGroupMapper.java @@ -17,7 +17,7 @@ */ @Mapper public interface GateGroupMapper extends BaseMapper { - List getGateGroupListPage(@Param("page") Page page, GateGroupRequest gateGroupRequest); + List getGateGroupListPage(@Param("page") Page page, @Param("gateGroupRequest") GateGroupRequest gateGroupRequest); GateGroup getGateGroupByName(@Param("groupName") String groupName); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/HazardLevelMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/HazardLevelMapper.java index 8957780..dcf47bb 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/HazardLevelMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/HazardLevelMapper.java @@ -17,11 +17,13 @@ @Mapper public interface HazardLevelMapper extends BaseMapper { - List getCaseHazardLevelListPage(@Param("page") Page page, HazardLevelRequest hazardLevelRequest); + List getCaseHazardLevelListPage(@Param("page") Page page, @Param("hazardLevelRequest") HazardLevelRequest hazardLevelRequest); - List getCaseHazardLevelList(HazardLevelRequest hazardLevelRequest); + List getCaseHazardLevelList(@Param("hazardLevelRequest") HazardLevelRequest hazardLevelRequest); CaseHazardLevel getCaseHazardLevel(@Param("hazardLevelCode") String hazardLevelCode); List selectHazardName(); + + String selectHazardNameByCode(@Param("hazardLevelCode") String hazardLevelCode); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/BlackListController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/BlackListController.java index a27f9f8..0c06661 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/BlackListController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/BlackListController.java @@ -1,13 +1,18 @@ package com.casic.missiles.modular.controller; +import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.base.controller.ExportController; import com.casic.missiles.core.page.PageFactory; import com.casic.missiles.model.response.ResponseData; import com.casic.missiles.modular.dto.BlackInfoRequest; +import com.casic.missiles.modular.dto.BlackPictureRequest; +import com.casic.missiles.modular.dto.hik.PersonInfoRequest; +import com.casic.missiles.modular.enums.HikUri; import com.casic.missiles.modular.enums.OperateTypeEnum; import com.casic.missiles.modular.model.BlackInfo; import com.casic.missiles.modular.service.BlackInfoService; +import com.casic.missiles.modular.util.HikUtil; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; @@ -56,4 +61,22 @@ return null; } + /** + * 黑名单人员照片 + */ + @PostMapping("/personPicture") + @ResponseBody + public Object personPicture(@RequestBody BlackPictureRequest blackPictureRequest){ + //获取照片 + String picUri = blackPictureRequest.getPicUri(); + String serverIndexCode = blackPictureRequest.getServerIndexCode(); + PersonInfoRequest picRequest = new PersonInfoRequest(); + picRequest.setPicUri(picUri); + picRequest.setServerIndexCode(serverIndexCode); + String reBody = JSONObject.toJSONString(picRequest); + //重定向地址获取 + String url = HikUtil.hikApiFor302(HikUri.PERSON_PICTURE, reBody); + return ResponseData.success(url); + } + } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/DeviceController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/DeviceController.java index e1c4eba..666bbee 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/DeviceController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/DeviceController.java @@ -107,7 +107,7 @@ } /** - * 设备维修管理查询(分页),需计算MTTR=总维修时间/故障次数 + * 设备状态计算与评判/设备维修管理查询(分页),需计算MTTR=总维修时间/故障次数 */ @PostMapping("/repair/listPage") @ResponseBody @@ -211,7 +211,7 @@ //需根据设备编号获取到对应的门禁点唯一标识 doorControlRequest.setDoorIndexCodes(indexCodes); doorControlRequest.setControlType(Integer.valueOf(gateGroupDTO.getStatus())); - String body = JSONObject.toJSONString(deviceCodes); + String body = JSONObject.toJSONString(doorControlRequest); String resultStr = HikUtil.hikApi(HikUri.DOOR_CONTROL, body); JSONObject resultJson = (JSONObject)JSONObject.parse(resultStr); if (!"0".equals(resultJson.get("code"))) { diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/StaffController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/StaffController.java index b58ccab..704093c 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/StaffController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/StaffController.java @@ -2,15 +2,21 @@ import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.util.StrUtil; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.base.controller.ExportController; import com.casic.missiles.core.page.PageFactory; import com.casic.missiles.model.response.ErrorResponseData; import com.casic.missiles.model.response.ResponseData; import com.casic.missiles.modular.dto.StaffInfoRequest; +import com.casic.missiles.modular.dto.hik.PersonInfoRequest; +import com.casic.missiles.modular.dto.hik.StaffCardRequest; +import com.casic.missiles.modular.enums.HikUri; import com.casic.missiles.modular.enums.OperateTypeEnum; import com.casic.missiles.modular.model.StaffInfo; import com.casic.missiles.modular.service.StaffInfoService; +import com.casic.missiles.modular.util.HikUtil; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; @@ -110,4 +116,60 @@ } return ResponseData.success(); } + + /** + * 批量开卡,添加人员之后调用,若在一个接口中添加人员成功开卡失败则第二次添加时会有问题 + */ + @PostMapping("/cardBinding") + @ResponseBody + public Object cardBinding(@RequestBody StaffCardRequest staffCardRequest) { + String body = JSONObject.toJSONString(staffCardRequest); + String resultStr = HikUtil.hikApi(HikUri.CARD_BINDING, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (!"0".equals(resultJson.get("code"))) { + log.error("请求海康,批量开卡失败,海康response:{}", resultStr); + return ResponseData.error("批量开卡失败"); + } + //保存卡号 + if(staffInfoService.saveCardInfo(staffCardRequest) > 0){ + return ResponseData.success(); + } + return ResponseData.error("批量开卡失败"); + } + + /** + * 获取员工照片,海康存储 + */ + @PostMapping("/personPicture/{staffCode}") + @ResponseBody + public Object personPicture(@PathVariable("staffCode") String staffCode){ + //获取员工详细信息,含图片服务器、uri + PersonInfoRequest request = new PersonInfoRequest(); + List list = new ArrayList<>(); + list.add(staffCode); + request.setParamName("personId"); + request.setParamValue(list); + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi(HikUri.PERSON_INFO, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (!"0".equals(resultJson.get("code"))) { + log.error("请求海康,根据人员唯一字段获取人员详细信息失败,海康response:{}", resultStr); + return ResponseData.error("获取员工照片失败"); + } + //获取照片 + JSONObject data = (JSONObject) resultJson.get("data"); + JSONArray dataArray = (JSONArray) data.get("list"); + JSONObject jsonObject = (JSONObject) dataArray.get(0); + JSONArray personPhoto = (JSONArray) jsonObject.get("personPhoto"); + JSONObject photo = (JSONObject) personPhoto.get(0); + String picUri = photo.getString("picUri"); + String serverIndexCode = photo.getString("serverIndexCode"); + PersonInfoRequest picRequest = new PersonInfoRequest(); + picRequest.setPicUri(picUri); + picRequest.setServerIndexCode(serverIndexCode); + String reBody = JSONObject.toJSONString(picRequest); + //重定向地址获取 + String url = HikUtil.hikApiFor302(HikUri.PERSON_PICTURE, reBody); + return ResponseData.success(url); + } } 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 4a07dd9..7b1dcf6 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 @@ -16,6 +16,7 @@ import com.casic.missiles.modular.redis.key.CacheKeys; import com.casic.missiles.modular.service.CockpitService; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.util.CollectionUtils; import org.springframework.web.bind.annotation.*; @@ -24,10 +25,7 @@ import java.text.NumberFormat; import java.time.LocalDateTime; import java.time.temporal.ChronoUnit; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.util.*; import java.util.stream.Collectors; /** @@ -73,6 +71,9 @@ private StatisticNumberMapper numberMapper; @Autowired + private HazardLevelMapper hazardLevelMapper; + + @Autowired private AccessGroupConfig accessGroupConfig; /** @@ -104,8 +105,24 @@ public Object buildingNumberPerHour(){ //当天按小时分组的人数 List list = numberMapper.selectListByTime(); - Map> collect = list.stream().collect(Collectors.groupingBy(BuildingNumberDTO::getStatisticPosition)); - return ResponseData.success(collect); + Map> collect = list.stream().collect(Collectors.groupingBy(BuildingNumberDTO::getStatisticTime)); + //定时任务中已将每小时三栋楼人数存到数据库 + //将一期主楼和录制楼人数合并,二期单算 + List> resultList = new ArrayList<>(); + collect.keySet().forEach(key -> { + List buildingNumberDTOS = collect.get(key); + BuildingNumberDTO mainBuildingOne = buildingNumberDTOS.get(0); + BuildingNumberDTO mainBuildingTwo = buildingNumberDTOS.get(1); + BuildingNumberDTO recordingBuilding = buildingNumberDTOS.get(2); + HashMap resultMap = new HashMap<>(); + Integer oneQuantity = Integer.valueOf(mainBuildingOne.getStatisticQuantity()); + Integer recordingQuantity = Integer.valueOf(recordingBuilding.getStatisticQuantity()); + resultMap.put("staticTime", mainBuildingOne.getStatisticTime()); + resultMap.put(mainBuildingOne.getStatisticPositionName()+"、"+recordingBuilding.getStatisticPositionName(), String.valueOf(oneQuantity+recordingQuantity)); + resultMap.put(mainBuildingTwo.getStatisticPositionName(), mainBuildingTwo.getStatisticQuantity()); + resultList.add(resultMap); + }); + return ResponseData.success(resultList); } /** @@ -151,12 +168,11 @@ public Object securityNumber() { QueryWrapper wrapper = new QueryWrapper<>(); wrapper.eq("staff_type", 2); + // TODO: 2022/9/2 后续使用产品确定的每天出勤的安保人员的数量 Integer total = staffInfoMapper.selectCount(wrapper); - //当日离岗事件个数 - QueryWrapper wrapper1 = new QueryWrapper<>(); - wrapper1.eq("hik_event_type", SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); - wrapper1.apply("date_format(now(),'%Y-%m-%d') = date_format(happen_time,'%Y-%m-%d')"); - Integer leave = caseInfoMapper.selectCount(wrapper1); + //当日离岗事件按设备去重后的个数 + // TODO: 2022/9/2 目前相当于24小时内的计算,之后看需要可改成自定义小时数计算离岗率,即离岗+6小时内仅一次离岗则恢复为100%,多次则累加离岗次数计算离岗率 + Integer leave = caseInfoMapper.selectDemobilizedCount(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); NumberFormat numberFormat = NumberFormat.getInstance(); // 设置精确到小数点后2位 numberFormat.setMaximumFractionDigits(2); @@ -179,7 +195,6 @@ @ResponseBody public Object visitorApplyDetail() { List reasonGroup = applyMapper.selectByVisitReason(); - HashMap resultMap = new HashMap<>(); NumberFormat numberFormat = NumberFormat.getInstance(); // 设置精确到小数点后2位 numberFormat.setMaximumFractionDigits(2); @@ -187,12 +202,17 @@ if(0 == sum){ return ResponseData.success(); } + List resultList = new ArrayList<>(); reasonGroup.forEach(group -> { String reasonName = dictService.getDictNameByCode(SecurityEventDict.VISIT_REASON, group.getVisitReason()); String result = numberFormat.format((float) group.getQuantity() / (float) sum * 100); - resultMap.put(reasonName, result+"%"); + ApplyReasonGroupDTO applyReasonGroupDTO = new ApplyReasonGroupDTO(); + applyReasonGroupDTO.setQuantity(group.getQuantity()); + applyReasonGroupDTO.setVisitReason(reasonName); + applyReasonGroupDTO.setRatio(result+"%"); + resultList.add(applyReasonGroupDTO); }); - return ResponseData.success(resultMap); + return ResponseData.success(resultList); } /** @@ -247,6 +267,32 @@ } /** + * 机动力量实时在岗率,在岗人数除以总应在岗人数,用离岗+6小时内恢复为100%,6小时外再计算 + */ + @GetMapping("/staff/beOnDutyRatio") + @ResponseBody + public Object beOnDutyRatio() { + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("staff_type", 2); + // TODO: 2022/9/2 后续使用产品确定的每天出勤的安保人员的数量 + Integer total = staffInfoMapper.selectCount(wrapper); + if(0 == total){ + return ResponseData.success(null); + } + //当日离岗事件按设备去重后的个数 + // TODO: 2022/9/2 目前相当于24小时内的计算,之后看需要可改成自定义小时数计算离岗率,即离岗+6小时内仅一次离岗则恢复为100%,多次则累加离岗次数计算离岗率 + List onDutyRatioDTOS = caseInfoMapper.selectDemobilizedCountByHour(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); + onDutyRatioDTOS.forEach(dto -> { + NumberFormat numberFormat = NumberFormat.getInstance(); + // 设置精确到小数点后2位 + numberFormat.setMaximumFractionDigits(2); + String result = numberFormat.format(100 - Float.valueOf(dto.getQuantity()) / (float) total * 100); + dto.setRatio(result+"%"); + }); + return ResponseData.success(onDutyRatioDTOS); + } + + /** * 闸机速通门统计-设备状态分组计算数量,devType传闸机字典key * 视频频监控摄像机统计-设备状态分组计算数量,devType传摄像头字典key */ @@ -262,12 +308,17 @@ if(sum <= 0){ return ResponseData.error("无该类设备信息"); } + List resultList = new ArrayList<>(); gateStatusGroup.forEach(group -> { String devStatus = dictService.getDictNameByCode(SecurityEventDict.DEVICE_STATUS, group.getStatus()); String result = numberFormat.format((float) group.getQuantity() / (float) sum * 100); - resultMap.put(devStatus, result+"%"); + GateStatusGroupResponse gateStatusGroupResponse = new GateStatusGroupResponse(); + gateStatusGroupResponse.setStatus(devStatus); + gateStatusGroupResponse.setRatio(result+"%"); + resultList.add(gateStatusGroupResponse); }); - resultMap.put("总", sum); + resultMap.put("total", sum); + resultMap.put("list", resultList); return ResponseData.success(resultMap); } @@ -282,17 +333,38 @@ String position = securityScoreDTO.getPosition(); List caseInfos = caseInfoMapper.selectByPosition(position); //查询各危险级别权重、各类别权重,放入map,避免循环中多次查数据库 - + HashMap hazardScoreMap = new HashMap<>(); + List caseHazardLevelList = hazardLevelMapper.getCaseHazardLevelList(null); + caseHazardLevelList.forEach(hazardLevel -> { + hazardScoreMap.put(hazardLevel.getCode(), hazardLevel.getWeight()); + }); + HashMap categoryScoreMap = new HashMap<>(); + List categoryLevelList = categoryLevelMapper.getCaseCategoryLevelList(null); + categoryLevelList.forEach(categoryLevel -> { + categoryScoreMap.put(categoryLevel.getCode(), categoryLevel.getWeight()); + }); + //事件按楼层分组,计算 List securityScoreDTOs = new ArrayList<>(); caseInfos.forEach(caseInfo -> { SecurityScoreDTO securityScoreDTO1 = new SecurityScoreDTO(); + securityScoreDTO1.setPosition(caseInfo.getPosition()); securityScoreDTO1.setArea(caseInfo.getArea()); - // TODO: 2022/8/4 楼层评分计算根据产品定义调整 -// caseInfo.get -// securityScoreDTO1.setScore(); + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); + Double score = 100 - Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + securityScoreDTO1.setScore(score); + securityScoreDTOs.add(securityScoreDTO1); }); - - return null; + 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); + }); + return ResponseData.success(securityScoreDTOs); } /** @@ -303,9 +375,13 @@ public Object SecurityFrequency(@RequestBody SecurityFrequencyDTO securityFrequencyDTO) { String year = securityFrequencyDTO.getYear(); String month = securityFrequencyDTO.getMonth(); - Integer quantity = caseInfoMapper.selectCountByMonth(year, month); - securityFrequencyDTO.setQuantity(quantity); - return ResponseData.success(securityFrequencyDTO); + if(!StringUtils.isEmpty(year) && StringUtils.isEmpty(month)){ + Integer quantity = caseInfoMapper.selectCountByMonth(year, month); + securityFrequencyDTO.setQuantity(quantity); + return ResponseData.success(securityFrequencyDTO); + } + List list = caseInfoMapper.selectPreMonthCount(); + return ResponseData.success(list); } } 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 ae4d770..f4f075c 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 @@ -1,20 +1,25 @@ package com.casic.missiles.modular.controller.cockpit; +import cn.hutool.core.date.DateUnit; import cn.hutool.core.date.DateUtil; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.casic.missiles.model.response.ResponseData; -import com.casic.missiles.modular.dao.AttendanceInfoMapper; -import com.casic.missiles.modular.dao.CaseInfoMapper; -import com.casic.missiles.modular.dao.HazardLevelMapper; -import com.casic.missiles.modular.dao.StaffInfoMapper; +import com.casic.missiles.modular.dao.*; +import com.casic.missiles.modular.dto.DeviceRepairLogDTO; +import com.casic.missiles.modular.dto.DeviceRepairRequest; import com.casic.missiles.modular.dto.statistics.*; +import com.casic.missiles.modular.enums.SecurityEventType; +import com.casic.missiles.modular.model.CaseCategoryLevel; import com.casic.missiles.modular.model.CaseHazardLevel; +import com.casic.missiles.modular.model.CaseInfo; import com.casic.missiles.modular.model.StaffInfo; +import com.casic.missiles.modular.service.DeviceInfoService; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.util.CollectionUtils; import org.springframework.web.bind.annotation.*; +import java.math.BigDecimal; import java.text.NumberFormat; import java.util.*; import java.util.stream.Collectors; @@ -40,6 +45,12 @@ @Autowired private HazardLevelMapper hazardLevelMapper; + @Autowired + private CategoryLevelMapper categoryLevelMapper; + + @Autowired + private DeviceInfoService deviceInfoService; + /** * 安防事件时域频次统计,每月的每天安防事件个数(原方案) * 月维度:展示每个月的每天的数据 @@ -89,15 +100,17 @@ List monthList = caseInfoMapper.selectPreMonthCountByYear(year); Map> collect = monthList.stream().collect(Collectors.groupingBy(PreMonthOrWeekCaseDTO::getHazardLevelCode)); HashMap strAvgMap = new HashMap<>(); + List resultList = new ArrayList<>(); for (String key : collect.keySet()) { List preMonthOrWeekCaseDTOS = collect.get(key); int sum = preMonthOrWeekCaseDTOS.stream().mapToInt(PreMonthOrWeekCaseDTO::getQuantity).sum(); //若年份是本年,则使用个安防级别数量/当前月份数 //若不是本年,除数为12 MonthAndWeekDTO monthAndWeekDTO = new MonthAndWeekDTO(); + String hazardName = hazardLevelMapper.selectHazardNameByCode(key); + monthAndWeekDTO.setLevelName(hazardName); if(year.equals(String.valueOf(DateUtil.thisYear()))){ monthAndWeekDTO.setMonthQuantity(sum / DateUtil.thisMonth()); -// monthAndWeekDTO.setLevelName(); strAvgMap.put(key, monthAndWeekDTO); }else{ monthAndWeekDTO.setMonthQuantity(sum / 12); @@ -113,27 +126,37 @@ if(year.equals(String.valueOf(DateUtil.thisYear()))){ if(!Objects.isNull(strAvgMap.get(key))){ MonthAndWeekDTO monthAndWeekDTO = strAvgMap.get(key); + String hazardName = hazardLevelMapper.selectHazardNameByCode(key); + monthAndWeekDTO.setLevelName(hazardName); monthAndWeekDTO.setWeekQuantity(sum / DateUtil.thisWeekOfYear()); strAvgMap.put(key, monthAndWeekDTO); }else{ MonthAndWeekDTO monthAndWeekDTO = new MonthAndWeekDTO(); + String hazardName = hazardLevelMapper.selectHazardNameByCode(key); + monthAndWeekDTO.setLevelName(hazardName); monthAndWeekDTO.setWeekQuantity(sum / DateUtil.thisWeekOfYear()); strAvgMap.put(key, monthAndWeekDTO); } }else{ if(!Objects.isNull(strAvgMap.get(key))){ MonthAndWeekDTO monthAndWeekDTO = strAvgMap.get(key); + String hazardName = hazardLevelMapper.selectHazardNameByCode(key); + monthAndWeekDTO.setLevelName(hazardName); monthAndWeekDTO.setWeekQuantity(sum / 52); strAvgMap.put(key, monthAndWeekDTO); }else{ MonthAndWeekDTO monthAndWeekDTO = new MonthAndWeekDTO(); + String hazardName = hazardLevelMapper.selectHazardNameByCode(key); + monthAndWeekDTO.setLevelName(hazardName); monthAndWeekDTO.setWeekQuantity(sum / 52); strAvgMap.put(key, monthAndWeekDTO); } } } - avgMonthAndWeekGroupDTO.setMap(strAvgMap); - return ResponseData.success(avgMonthAndWeekGroupDTO); + strAvgMap.keySet().forEach(key -> { + resultList.add(strAvgMap.get(key)); + }); + return ResponseData.success(resultList); } /** @@ -181,12 +204,178 @@ } /** - * 员工考勤人数变化,功能待定 + * 员工考勤人数变化,统计当天(横坐标为时)及近7天(横坐标为天)的考勤人数变化,只要发生一次考勤识别,次数的基数就正常增加(没有上班下班区分) */ + @PostMapping("/staff/attendanceNumber/{dimension}") + @ResponseBody + public Object attendanceNumber(@PathVariable("dimension") String dimension) { + List attendanceNumberDTOs = null; + List> resultList = new ArrayList<>(); + if("week".equals(dimension)){ + //近7天数据按天分组统计 + attendanceNumberDTOs = attendanceInfoMapper.getCountForWeek(); + }else if("day".equals(dimension)) { + //今天数据按小时分组统计 + attendanceNumberDTOs = attendanceInfoMapper.getCountForDay(); + } + if(CollectionUtils.isEmpty(attendanceNumberDTOs)){ + return ResponseData.error("该查询条件下,无员工出勤数据!"); + } + Map> collect = attendanceNumberDTOs.stream().collect(Collectors.groupingBy(AttendanceNumberDTO::getDate)); + collect.keySet().forEach(key -> { + List attendanceNumberDTOS = collect.get(key); + AttendanceNumberDTO attendanceNumberDTO = attendanceNumberDTOS.get(0); + AttendanceNumberDTO attendanceNumberDTO2 = attendanceNumberDTOS.get(1); + Map resultMap = new HashMap<>(); + resultMap.put(attendanceNumberDTO.getStaffType(), attendanceNumberDTO.getQuantity()); + resultMap.put(attendanceNumberDTO2.getStaffType(), attendanceNumberDTO2.getQuantity()); + resultMap.put("staticTime", attendanceNumberDTO.getDate()); + resultList.add(resultMap); + }); + return ResponseData.success(resultList); + } /** - * 近30天/近一周安保人员到岗排行 + * 早晚高峰区域安防评估 */ + @PostMapping("/security/assessment/{dimension}") + @ResponseBody + public Object securityAssessment(@PathVariable("dimension") String dimension) { + //查询各危险级别权重、各类别权重,放入map,避免循环中多次查数据库 + HashMap hazardScoreMap = new HashMap<>(); + List caseHazardLevelList = hazardLevelMapper.getCaseHazardLevelList(null); + caseHazardLevelList.forEach(hazardLevel -> { + hazardScoreMap.put(hazardLevel.getCode(), hazardLevel.getWeight()); + }); + HashMap categoryScoreMap = new HashMap<>(); + List categoryLevelList = categoryLevelMapper.getCaseCategoryLevelList(null); + categoryLevelList.forEach(categoryLevel -> { + categoryScoreMap.put(categoryLevel.getCode(), categoryLevel.getWeight()); + }); + HashMap hashMap = new HashMap<>(); + if("week".equals(dimension)){ + //近7天早晚高峰数据 + List caseInfos = caseInfoMapper.selectListBySevenDay(); + //按时间(天)进行分组 + caseInfos.forEach(caseInfo -> { + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); + Double score = Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + String[] array = caseInfo.getHappenTime().split(" "); + String dayTime = array[0]; + BigDecimal preScore; + if(hashMap.containsKey(dayTime)){ + Double aDouble = hashMap.get(dayTime); + preScore = new BigDecimal(aDouble.toString()); + + }else{ + preScore = new BigDecimal("100.0"); + } + BigDecimal nowScore = new BigDecimal(score.toString()); + hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); + }); + return ResponseData.success(hashMap); + }else if("day".equals(dimension)) { + //今天数据按小时分组统计 + List caseInfos = caseInfoMapper.selectListByToday(); + caseInfos.forEach(caseInfo -> { + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); + Double score = Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + String[] array = caseInfo.getHappenTime().split(":"); + String dayTime = array[0]; + BigDecimal preScore; + if(hashMap.containsKey(dayTime)){ + Double aDouble = hashMap.get(dayTime); + preScore = new BigDecimal(aDouble.toString()); + + }else{ + preScore = new BigDecimal("100.0"); + } + BigDecimal nowScore = new BigDecimal(score.toString()); + hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); + }); + return ResponseData.success(hashMap); + } + return null; + } + + /** + * 重点区域安防事态评估,统计重点区域6:00-23:00按小时分组数据 + */ + @GetMapping("/security/keyAreaStatistic") + @ResponseBody + public Object keyAreaStatistic() { + //查询各危险级别权重、各类别权重,放入map,避免循环中多次查数据库 + HashMap hazardScoreMap = new HashMap<>(); + List caseHazardLevelList = hazardLevelMapper.getCaseHazardLevelList(null); + caseHazardLevelList.forEach(hazardLevel -> { + hazardScoreMap.put(hazardLevel.getCode(), hazardLevel.getWeight()); + }); + HashMap categoryScoreMap = new HashMap<>(); + List categoryLevelList = categoryLevelMapper.getCaseCategoryLevelList(null); + categoryLevelList.forEach(categoryLevel -> { + categoryScoreMap.put(categoryLevel.getCode(), categoryLevel.getWeight()); + }); + HashMap hashMap = new HashMap<>(); + //今天数据按小时分组统计 + List caseInfos = caseInfoMapper.selectListByToday2(); + caseInfos.forEach(caseInfo -> { + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); + Double score = Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + String[] array = caseInfo.getHappenTime().split(":"); + String dayTime = array[0]; + BigDecimal preScore; + if(hashMap.containsKey(dayTime)){ + Double aDouble = hashMap.get(dayTime); + preScore = new BigDecimal(aDouble.toString()); + + }else{ + preScore = new BigDecimal("100.0"); + } + BigDecimal nowScore = new BigDecimal(score.toString()); + hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); + }); + return ResponseData.success(hashMap); + } + + /** + * 安防机动支援力量调配响应评估,根据事件已解决状态及已解决时间-发送时间,按时间(小时)分组统计 + */ + @GetMapping("/security/responseAssess") + @ResponseBody + public Object responseAssess() { + //查询各危险级别权重、各类别权重,放入map,避免循环中多次查数据库 + HashMap hazardScoreMap = new HashMap<>(); + List caseHazardLevelList = hazardLevelMapper.getCaseHazardLevelList(null); + caseHazardLevelList.forEach(hazardLevel -> { + hazardScoreMap.put(hazardLevel.getCode(), hazardLevel.getWeight()); + }); + HashMap hashMap = new HashMap<>(); + //今天数据按小时分组统计 + List caseInfos = caseInfoMapper.selectListByToday3(); + caseInfos.forEach(caseInfo -> { + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + //扣分=事件级别权重*未解决小时数 + Date updateTime = DateUtil.parse(caseInfo.getUpdateTime()); + Date happenTime = DateUtil.parse(caseInfo.getHappenTime()); + long between = DateUtil.between(updateTime, happenTime, DateUnit.HOUR); + Double score = Double.valueOf(hazardWeight)*between; + String[] array = caseInfo.getHappenTime().split(":"); + String dayTime = array[0]; + BigDecimal preScore; + if(hashMap.containsKey(dayTime)){ + Double aDouble = hashMap.get(dayTime); + preScore = new BigDecimal(aDouble.toString()); + }else{ + preScore = new BigDecimal("100.0"); + } + BigDecimal nowScore = new BigDecimal(score.toString()); + hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); + }); + return ResponseData.success(hashMap); + } /** * 重点区域威胁事件类型统计,优先级2,统计近7天和近30天 @@ -224,7 +413,34 @@ } /** - * 设备状态计算系数和评判,优先级3,需确认设备恢复时间是否可以获取 + * 近30天/近一周安保人员到岗排行 */ + + /** + * 安保等级评估,发生离岗事件减1分 + */ + @GetMapping("/security/levelAssess") + @ResponseBody + public Object securityLevelAssess() { + //今天数据按小时分组统计 + List resultList = caseInfoMapper.selectListByType(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); + resultList.forEach(result -> { + BigDecimal deScore = new BigDecimal(result.getQuantity()); + BigDecimal preScore = new BigDecimal("100.0"); + result.setScore(preScore.subtract(deScore).doubleValue()); + }); + return ResponseData.success(resultList); + } + + /** + * 设备状态计算系数和评判,即设备维修管理查询(不分页) + */ + @PostMapping("/device/repairList") + @ResponseBody + public Object repairList(@RequestBody DeviceRepairRequest deviceRepairRequest) { + List deviceRepairLogDTOS = deviceInfoService.deviceRepairListPage(deviceRepairRequest); + return ResponseData.success(deviceRepairLogDTOS); + } + } 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 fbf8ab6..c71a15a 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 @@ -1,13 +1,12 @@ package com.casic.missiles.modular.controller.hik; +import cn.hutool.core.date.DateTime; +import cn.hutool.core.date.DateUtil; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.casic.missiles.model.response.ResponseData; import com.casic.missiles.modular.dao.HikFaceGroupInfoMapper; -import com.casic.missiles.modular.dto.hik.EventSubscribeRequest; -import com.casic.missiles.modular.dto.hik.FaceGroupAdditionRequest; -import com.casic.missiles.modular.dto.hik.HikRecvEvent; -import com.casic.missiles.modular.dto.hik.OrgBatchAdd; +import com.casic.missiles.modular.dto.hik.*; import com.casic.missiles.modular.enums.HikUri; import com.casic.missiles.modular.enums.SecurityEventType; import com.casic.missiles.modular.model.CaseInfo; @@ -18,16 +17,20 @@ import com.casic.missiles.modular.util.CaseInfoFactoryUtil; import com.casic.missiles.modular.util.HikUtil; import com.casic.missiles.modular.util.ThreadPoolUtil; +import com.casic.missiles.modular.util.WebSocket; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; -import org.springframework.web.bind.annotation.*; +import org.springframework.util.CollectionUtils; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.RestController; -import java.net.InetAddress; -import java.net.UnknownHostException; import java.util.ArrayList; +import java.util.Iterator; import java.util.List; import java.util.Objects; @@ -38,7 +41,6 @@ */ @Slf4j @RestController -@RequestMapping("/hik") public class HikController { @Autowired @@ -53,28 +55,37 @@ @Autowired private HikService hikService; + @Autowired + private HikFaceGroupInfoMapper hikFaceGroupInfoMapper; + + @Autowired + private WebSocket webSocket; + @Value("${server.port}") private int serverPort; - @Autowired - private HikFaceGroupInfoMapper hikFaceGroupInfoMapper; /** * 海康事件订阅 */ - @PostMapping("/event/subscribe") + @PostMapping("/hik/event/subscribe") @ResponseBody - public Object eventSubscribe() throws UnknownHostException { + public Object eventSubscribe() { EventSubscribeRequest eventSubscribeRequest = new EventSubscribeRequest(); ArrayList list = new ArrayList<>(); list.add(SecurityEventType.DEVICE_OFFLINE); + list.add(SecurityEventType.DEVICE_ONLINE); list.add(SecurityEventType.KEY_PERSONNEL_IDENTIFY_EVENT); list.add(SecurityEventType.MONITORING_POINT_OFFLINE); + list.add(SecurityEventType.MONITORING_POINT_ONLINE); list.add(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); list.add(SecurityEventType.PERSONNEL_GATHER_EVENT); - InetAddress localHost = InetAddress.getLocalHost(); + list.add(SecurityEventType.VISITOR_REGISTER); + list.add(SecurityEventType.VISITOR_CHECKOUT); + list.add(SecurityEventType.HIGH_ALTITUDE_PARABOLIC); +// InetAddress localHost = InetAddress.getLocalHost(); eventSubscribeRequest.setEventTypes(list); - eventSubscribeRequest.setEventDest("https://" + localHost + ":" + serverPort + "/eventRcv"); + eventSubscribeRequest.setEventDest("http://" + "192.168.10.6" + ":" + serverPort + "/eventRcv"); //订阅类型,0-订阅原始事件,1-联动事件,2-原始事件和联动事件,不填使用默认值0 eventSubscribeRequest.setSubType(0); /** @@ -92,19 +103,25 @@ } /** + * 查询事件订阅信息 + */ + @PostMapping("/hik/event/query") + @ResponseBody + public Object eventQuery() { + String result = HikUtil.hikApi(HikUri.EVENT_INFO, ""); + return result; + } + + /** * 海康事件接收 */ @PostMapping("/eventRcv") @ResponseBody public Object eventRcv(@RequestBody HikRecvEvent hikRecvEvent) { //1、接收所需事件类型 - Long eventType = hikRecvEvent.getEventType(); + Number eventType = hikRecvEvent.getEventType(); log.info("接收到安防事件类型为:{}", eventType); CaseInfo caseInfo = caseInfoFactoryUtil.getCaseInfo(eventType); - //接收到不关心事件直接返回 - if(Objects.isNull(caseInfo)){ - return ResponseData.success(); - } //2、不同事件不同处理,caseInfoFactoryUtil已设置好事件基础定义信息 // 再为事件添加状态、设备编码、设备名称、位置、区域、时间 // 异步处理事件 @@ -114,19 +131,23 @@ caseHandle(hikRecvEvent, eventType, caseInfo); } })); +// caseHandle(hikRecvEvent, eventType, caseInfo); - return null; + return ResponseData.success(); } - private void caseHandle(HikRecvEvent hikRecvEvent, Long eventType, CaseInfo caseInfo) { + private void caseHandle(HikRecvEvent hikRecvEvent, Number eventType, CaseInfo caseInfo) { JSONArray eventArray = hikRecvEvent.getEventArray(); List caseInfos = new ArrayList<>(); - while (eventArray.stream().iterator().hasNext()) { + Iterator iterator = eventArray.iterator(); + while (iterator.hasNext()) { CaseInfo caseInfo1 = new CaseInfo(); - BeanUtils.copyProperties(caseInfo, caseInfo1); - JSONObject event = (JSONObject) eventArray.stream().iterator().next(); + if(!Objects.isNull(caseInfo)){ + BeanUtils.copyProperties(caseInfo, caseInfo1); + } + JSONObject event = (JSONObject) iterator.next(); //5种事件进行不同处理 - if(SecurityEventType.KEY_PERSONNEL_IDENTIFY_EVENT == eventType){ + if (SecurityEventType.KEY_PERSONNEL_IDENTIFY_EVENT.equals(eventType)) { //判断所属人脸分组 JSONObject data = (JSONObject) event.get("data"); JSONObject faceRecognitionResult = (JSONObject) data.get("faceRecognitionResult"); @@ -142,52 +163,101 @@ if (faceGroupCode.equals(blackListGroup.getFaceGroupCode())) { //黑名单分组处理 caseInfo1 = hikService.blackListHandle(event, caseInfo1); - }else if(faceGroupCode.equals(propertyPersonnelGroup.getFaceGroupCode())){ + } else if (faceGroupCode.equals(propertyPersonnelGroup.getFaceGroupCode())) { //考勤分组处理-物业人员,添加到考勤表 hikService.propertyAttendanceHandle(event); - }else if(faceGroupCode.equals(securityPersonnelGroup.getFaceGroupCode())){ + } else if (faceGroupCode.equals(securityPersonnelGroup.getFaceGroupCode())) { //考勤分组处理-安保人员,添加到考勤表 hikService.securityPersonnelHandle(event); - }else { + } else { return; } - }else if(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT == eventType){ + } else if (SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT.equals(eventType)) { //离岗事件处理 caseInfo1 = hikService.demobilizedHandle(event, caseInfo1); - }else if(SecurityEventType.PERSONNEL_GATHER_EVENT == eventType){ + } else if (SecurityEventType.PERSONNEL_GATHER_EVENT.equals(eventType)) { //人员聚集事件处理 caseInfo1 = hikService.personGatherHandle(event, caseInfo1); - }else if(SecurityEventType.MONITORING_POINT_OFFLINE == eventType){ + } else if (SecurityEventType.MONITORING_POINT_OFFLINE.equals(eventType)) { //监控点离线事件处理 caseInfo1 = hikService.monitorPointOfflineHandle(event, caseInfo1); - }else if(SecurityEventType.DEVICE_OFFLINE == eventType){ + } else if (SecurityEventType.MONITORING_POINT_ONLINE.equals(eventType)) { + //监控点上线事件处理 + hikService.monitorPointOnlineHandle(event); + } else if (SecurityEventType.DEVICE_OFFLINE.equals(eventType)) { //装置离线事件处理 caseInfo1 = hikService.deviceOfflineHandle(event, caseInfo1); - }else if(SecurityEventType.VISITOR_REGISTER == eventType){ + } else if (SecurityEventType.DEVICE_ONLINE.equals(eventType)) { + //装置上线处理 + hikService.deviceOnlineHandle(event); + } else if (SecurityEventType.VISITOR_REGISTER.equals(eventType)) { //记录访客登记记录,添加到访客记录表 hikService.visitorRegisterHandler(event); - }else if(SecurityEventType.VISITOR_CHECKOUT == eventType){ + } else if (SecurityEventType.VISITOR_CHECKOUT.equals(eventType)) { //记录访客签离记录 hikService.visitorCheckOutHandler(event); } - if(!Objects.isNull(caseInfo1) && !StringUtils.isEmpty(caseInfo1.getHappenTime())){ + if (!Objects.isNull(caseInfo1) && !StringUtils.isEmpty(caseInfo1.getHappenTime())) { caseInfos.add(caseInfo1); } } //3、安防事件入库 - if(!caseInfoService.insertCaseInfoBatch(caseInfos)){ - log.error("安防事件批量入库异常"); + if (!CollectionUtils.isEmpty(caseInfos) && !caseInfoService.insertCaseInfoBatch(caseInfos)) { + log.error("安防事件批量入库异常!"); } // TODO: 2022/8/15 webSocket推送 + if (CollectionUtils.isEmpty(caseInfos)) { + log.info("webSocket事件推送"); + webSocket.sendAllMessage(JSONObject.toJSONString(caseInfos)); + } return; } /** + * 以图搜图,前端用于轨迹追踪 + */ + @PostMapping("/hik/search/picture") + @ResponseBody + public Object searchPictures(@RequestBody SearchPicturesRequest searchPicturesRequest) { + DateTime startDateTime = DateUtil.parse(searchPicturesRequest.getStartTime()); + DateTime endDateTime = DateUtil.parse(searchPicturesRequest.getEndTime()); + String startTime = DateUtil.format(startDateTime, "yyyy-MM-dd'T'HH:mm:ss.SSSXXX"); + String endTime = DateUtil.format(endDateTime, "yyyy-MM-dd'T'HH:mm:ss.SSSXXX"); + searchPicturesRequest.setStartTime(startTime); + searchPicturesRequest.setEndTime(endTime); + String body = JSONObject.toJSONString(searchPicturesRequest); + String resultStr = HikUtil.hikApi(HikUri.SEARCH_PICTURES, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (!"0".equals(resultJson.get("code"))) { + log.error("请求海康,以图搜图失败,海康response:{}", resultStr); + return ResponseData.error("以图搜图失败"); + } + return ResponseData.success(resultJson); + } + + + /** + * 海康事件取消订阅 + */ + @PostMapping("/hik/event/cancel") + @ResponseBody + public Object eventCancelSubscribe(@RequestBody CancelSubscribeRequest cancelSubscribeRequest) { + String body = JSONObject.toJSONString(cancelSubscribeRequest); + String resultStr = HikUtil.hikApi(HikUri.EVENT_CANCEL, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (!"0".equals(resultJson.get("code"))) { + log.error("请求海康,取消订阅失败,海康response:{}", resultStr); + return ResponseData.error("取消订阅失败"); + } + return ResponseData.success(resultJson); + } + + /** * 单个添加海康人脸分组 * api->hik单个添加人脸分组api->response->mysql */ - @PostMapping("/faceGroup/single/add") + @PostMapping("/hik/faceGroup/single/add") @ResponseBody public Object faceGroupAddition(@RequestBody FaceGroupAdditionRequest faceGroupAdditionRequest) { String body = JSONObject.toJSONString(faceGroupAdditionRequest); @@ -212,7 +282,7 @@ * 批量添加海康组织 * api->hik批量添加组织api->response */ - @PostMapping("/org/batch/add") + @PostMapping("/hik/org/batch/add") @ResponseBody public Object orgBatchAdd(@RequestBody List orgBatchAddRequest) { String body = JSONObject.toJSONString(orgBatchAddRequest); @@ -232,4 +302,62 @@ return ResponseData.error("批量添加组织失败"); } + /** + * 获取人员列表 + */ + @PostMapping("/hik/person/personList") + @ResponseBody + public Object personList() { + PersonListRequest request = new PersonListRequest(); + request.setPageNo(1); + request.setPageSize(100); + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi("/api/resource/v2/person/personList", body); + return resultStr; + } + + /** + * 获取组织列表 + */ + @PostMapping("/hik/org/orgList") + @ResponseBody + public Object orgList() { + PersonListRequest request = new PersonListRequest(); + request.setPageNo(1); + request.setPageSize(100); + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi("/api/resource/v1/org/orgList", body); + return resultStr; + } + + /** + * 查询访客权限下载记录 + */ + @PostMapping("/hik/auth/result") + @ResponseBody + public Object authResult() { + PersonListRequest request = new PersonListRequest(); + request.setPageNo(1); + request.setPageSize(100); + request.setOrderId("ba101db6246711edaea66f7939a13638"); + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi("/api/visitor/v1/auth/result", body); + return resultStr; + } + + /** + * 人脸图片获取 + */ + @PostMapping("/hik/face/picture") + @ResponseBody + public Object facePicture() { + FaceRequest request = new FaceRequest(); +// List list = new ArrayList<>(); +// list.add(""); + request.setCertificateNum("wanggong"); + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi("/api/frs/v1/face", body); + return resultStr; + } + } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/AssetInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/AssetInfoMapper.java index 4f64e83..c0684ee 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/AssetInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/AssetInfoMapper.java @@ -17,6 +17,6 @@ @Mapper public interface AssetInfoMapper extends BaseMapper { - List getAssetInfoListPage(@Param("page") Page page, AssetInfoRequest assetInfoRequest); + List getAssetInfoListPage(@Param("page") Page page, @Param("assetInfoRequest") AssetInfoRequest assetInfoRequest); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/AttendanceInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/AttendanceInfoMapper.java index f9e793e..ec87e46 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/AttendanceInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/AttendanceInfoMapper.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.statistics.AttendanceNumberDTO; import com.casic.missiles.modular.dto.statistics.AttendanceRatioDTO; import com.casic.missiles.modular.model.AttendanceInfo; import org.apache.ibatis.annotations.Mapper; @@ -17,7 +18,7 @@ */ @Mapper public interface AttendanceInfoMapper extends BaseMapper { - List getAttendanceInfoListPage(@Param("page") Page page, StaffInfoRequest attendanceInfoRequest); + List getAttendanceInfoListPage(@Param("page") Page page, @Param("attendanceInfoRequest") StaffInfoRequest attendanceInfoRequest); AttendanceInfo selectByCodeAndDate(@Param("staffCode") String staffCode); @@ -26,4 +27,8 @@ List getCountByTypeAndDateForMonth(@Param("staffType")String staffType); List getCountByTypeAndDateForYear(@Param("staffType")String staffType); + + List getCountForWeek(); + + List getCountForDay(); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java index ce94b8f..6137a7d 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java @@ -17,5 +17,5 @@ @Mapper public interface BlackInfoMapper extends BaseMapper { - List getBlackInfoListPage(@Param("page") Page page, BlackInfoRequest blackInfoRequest); + List getBlackInfoListPage(@Param("page") Page page, @Param("blackInfoRequest") BlackInfoRequest blackInfoRequest); } 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 efda6b3..50aaa6f 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 @@ -20,7 +20,7 @@ List getCaseInfoListPage(@Param("page") Page page, @Param("caseInfoRequest") CaseInfoRequest caseInfoRequest); - int updateStatusById(CaseInfoRequest caseInfoRequest); + int updateStatusById(@Param("caseInfoRequest") CaseInfoRequest caseInfoRequest); List selectByLevelAndMonth(@Param("year") String year); @@ -47,4 +47,20 @@ List selectPreWeekCountByThirtyDay(); List selectPreDayCountBySevenDay(); + + Integer selectDemobilizedCount(@Param("eventType") Number personnelDemobilizedEvent); + + List selectPreMonthCount(); + + List selectListBySevenDay(); + + List selectListByToday(); + + List selectListByToday2(); + + List selectListByToday3(); + + List selectListByType(@Param("eventType") Number eventType); + + List selectDemobilizedCountByHour(@Param("eventType") Number eventType); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/CategoryLevelMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/CategoryLevelMapper.java index 52fc714..afe1650 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/CategoryLevelMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/CategoryLevelMapper.java @@ -17,9 +17,9 @@ @Mapper public interface CategoryLevelMapper extends BaseMapper { - List getCaseCategoryLevelListPage(@Param("page") Page page, CategoryLevelRequest categoryLevelRequest); + List getCaseCategoryLevelListPage(@Param("page") Page page, @Param("categoryLevelRequest") CategoryLevelRequest categoryLevelRequest); - List getCaseCategoryLevelList(CategoryLevelRequest categoryLevelRequest); + List getCaseCategoryLevelList(@Param("categoryLevelRequest") CategoryLevelRequest categoryLevelRequest); CaseCategoryLevel getCaseCategoryLevel(@Param("categoryLevelCode") String categoryLevelCode); 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 66353b1..2555a09 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 @@ -19,7 +19,7 @@ @Mapper public interface DeviceInfoMapper extends BaseMapper { - List getDeviceInfoListPage(@Param("page") Page page, DeviceInfoRequest deviceInfoRequest); + List getDeviceInfoListPage(@Param("page") Page page, @Param("deviceInfoRequest") DeviceInfoRequest deviceInfoRequest); List getDeviceInfoList(@Param("deviceInfoRequest") DeviceInfoRequest deviceInfoRequest); @@ -27,6 +27,8 @@ DeviceInfo getByIndexCode(@Param("srcIndex") String srcIndex); + DeviceInfo getByIp(@Param("ip") String ip); + List selectIndexCodesByCodes(@Param("deviceCodes") List deviceCodes); List selectByType(@Param("devType") String devType); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java index 41dd0af..5bfaf63 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java @@ -5,6 +5,7 @@ import com.casic.missiles.modular.dto.DeviceRepairRequest; import com.casic.missiles.modular.model.DeviceRepairLog; import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; import java.util.List; @@ -16,7 +17,7 @@ @Mapper public interface DeviceRepairLogMapper extends BaseMapper { - List getDeviceRepairListPage(Page page, DeviceRepairRequest deviceRepairRequest); + List getDeviceRepairListPage(@Param("page") Page page, @Param("deviceRepairRequest")DeviceRepairRequest deviceRepairRequest); - List getDeviceRepairList(DeviceRepairRequest deviceRepairRequest); + List getDeviceRepairList(@Param("deviceRepairRequest") DeviceRepairRequest deviceRepairRequest); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java index 9035c47..4823ac1 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java @@ -18,7 +18,7 @@ @Mapper public interface FireEquipInfoMapper extends BaseMapper { - List getFireEquipInfoListPage(@Param("page") Page page, FireEquipRequest fireEquipRequest); + List getFireEquipInfoListPage(@Param("page") Page page, @Param("fireEquipRequest") FireEquipRequest fireEquipRequest); FireEquipInfo getFireEquipInfo(@Param("equipCode") String equipCode); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/GateGroupMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/GateGroupMapper.java index d8c330d..977a427 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/GateGroupMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/GateGroupMapper.java @@ -17,7 +17,7 @@ */ @Mapper public interface GateGroupMapper extends BaseMapper { - List getGateGroupListPage(@Param("page") Page page, GateGroupRequest gateGroupRequest); + List getGateGroupListPage(@Param("page") Page page, @Param("gateGroupRequest") GateGroupRequest gateGroupRequest); GateGroup getGateGroupByName(@Param("groupName") String groupName); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/HazardLevelMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/HazardLevelMapper.java index 8957780..dcf47bb 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/HazardLevelMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/HazardLevelMapper.java @@ -17,11 +17,13 @@ @Mapper public interface HazardLevelMapper extends BaseMapper { - List getCaseHazardLevelListPage(@Param("page") Page page, HazardLevelRequest hazardLevelRequest); + List getCaseHazardLevelListPage(@Param("page") Page page, @Param("hazardLevelRequest") HazardLevelRequest hazardLevelRequest); - List getCaseHazardLevelList(HazardLevelRequest hazardLevelRequest); + List getCaseHazardLevelList(@Param("hazardLevelRequest") HazardLevelRequest hazardLevelRequest); CaseHazardLevel getCaseHazardLevel(@Param("hazardLevelCode") String hazardLevelCode); List selectHazardName(); + + String selectHazardNameByCode(@Param("hazardLevelCode") String hazardLevelCode); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/HikCaseDefineMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/HikCaseDefineMapper.java index 0dc47d1..f162fef 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/HikCaseDefineMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/HikCaseDefineMapper.java @@ -12,5 +12,5 @@ */ @Mapper public interface HikCaseDefineMapper extends BaseMapper { - HikCaseDefine getHikCaseDefine(@Param("caseTypeCode") Long caseTypeCode); + HikCaseDefine getHikCaseDefine(@Param("caseTypeCode") Number caseTypeCode); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/BlackListController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/BlackListController.java index a27f9f8..0c06661 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/BlackListController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/BlackListController.java @@ -1,13 +1,18 @@ package com.casic.missiles.modular.controller; +import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.base.controller.ExportController; import com.casic.missiles.core.page.PageFactory; import com.casic.missiles.model.response.ResponseData; import com.casic.missiles.modular.dto.BlackInfoRequest; +import com.casic.missiles.modular.dto.BlackPictureRequest; +import com.casic.missiles.modular.dto.hik.PersonInfoRequest; +import com.casic.missiles.modular.enums.HikUri; import com.casic.missiles.modular.enums.OperateTypeEnum; import com.casic.missiles.modular.model.BlackInfo; import com.casic.missiles.modular.service.BlackInfoService; +import com.casic.missiles.modular.util.HikUtil; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; @@ -56,4 +61,22 @@ return null; } + /** + * 黑名单人员照片 + */ + @PostMapping("/personPicture") + @ResponseBody + public Object personPicture(@RequestBody BlackPictureRequest blackPictureRequest){ + //获取照片 + String picUri = blackPictureRequest.getPicUri(); + String serverIndexCode = blackPictureRequest.getServerIndexCode(); + PersonInfoRequest picRequest = new PersonInfoRequest(); + picRequest.setPicUri(picUri); + picRequest.setServerIndexCode(serverIndexCode); + String reBody = JSONObject.toJSONString(picRequest); + //重定向地址获取 + String url = HikUtil.hikApiFor302(HikUri.PERSON_PICTURE, reBody); + return ResponseData.success(url); + } + } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/DeviceController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/DeviceController.java index e1c4eba..666bbee 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/DeviceController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/DeviceController.java @@ -107,7 +107,7 @@ } /** - * 设备维修管理查询(分页),需计算MTTR=总维修时间/故障次数 + * 设备状态计算与评判/设备维修管理查询(分页),需计算MTTR=总维修时间/故障次数 */ @PostMapping("/repair/listPage") @ResponseBody @@ -211,7 +211,7 @@ //需根据设备编号获取到对应的门禁点唯一标识 doorControlRequest.setDoorIndexCodes(indexCodes); doorControlRequest.setControlType(Integer.valueOf(gateGroupDTO.getStatus())); - String body = JSONObject.toJSONString(deviceCodes); + String body = JSONObject.toJSONString(doorControlRequest); String resultStr = HikUtil.hikApi(HikUri.DOOR_CONTROL, body); JSONObject resultJson = (JSONObject)JSONObject.parse(resultStr); if (!"0".equals(resultJson.get("code"))) { diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/StaffController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/StaffController.java index b58ccab..704093c 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/StaffController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/StaffController.java @@ -2,15 +2,21 @@ import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.util.StrUtil; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.base.controller.ExportController; import com.casic.missiles.core.page.PageFactory; import com.casic.missiles.model.response.ErrorResponseData; import com.casic.missiles.model.response.ResponseData; import com.casic.missiles.modular.dto.StaffInfoRequest; +import com.casic.missiles.modular.dto.hik.PersonInfoRequest; +import com.casic.missiles.modular.dto.hik.StaffCardRequest; +import com.casic.missiles.modular.enums.HikUri; import com.casic.missiles.modular.enums.OperateTypeEnum; import com.casic.missiles.modular.model.StaffInfo; import com.casic.missiles.modular.service.StaffInfoService; +import com.casic.missiles.modular.util.HikUtil; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; @@ -110,4 +116,60 @@ } return ResponseData.success(); } + + /** + * 批量开卡,添加人员之后调用,若在一个接口中添加人员成功开卡失败则第二次添加时会有问题 + */ + @PostMapping("/cardBinding") + @ResponseBody + public Object cardBinding(@RequestBody StaffCardRequest staffCardRequest) { + String body = JSONObject.toJSONString(staffCardRequest); + String resultStr = HikUtil.hikApi(HikUri.CARD_BINDING, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (!"0".equals(resultJson.get("code"))) { + log.error("请求海康,批量开卡失败,海康response:{}", resultStr); + return ResponseData.error("批量开卡失败"); + } + //保存卡号 + if(staffInfoService.saveCardInfo(staffCardRequest) > 0){ + return ResponseData.success(); + } + return ResponseData.error("批量开卡失败"); + } + + /** + * 获取员工照片,海康存储 + */ + @PostMapping("/personPicture/{staffCode}") + @ResponseBody + public Object personPicture(@PathVariable("staffCode") String staffCode){ + //获取员工详细信息,含图片服务器、uri + PersonInfoRequest request = new PersonInfoRequest(); + List list = new ArrayList<>(); + list.add(staffCode); + request.setParamName("personId"); + request.setParamValue(list); + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi(HikUri.PERSON_INFO, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (!"0".equals(resultJson.get("code"))) { + log.error("请求海康,根据人员唯一字段获取人员详细信息失败,海康response:{}", resultStr); + return ResponseData.error("获取员工照片失败"); + } + //获取照片 + JSONObject data = (JSONObject) resultJson.get("data"); + JSONArray dataArray = (JSONArray) data.get("list"); + JSONObject jsonObject = (JSONObject) dataArray.get(0); + JSONArray personPhoto = (JSONArray) jsonObject.get("personPhoto"); + JSONObject photo = (JSONObject) personPhoto.get(0); + String picUri = photo.getString("picUri"); + String serverIndexCode = photo.getString("serverIndexCode"); + PersonInfoRequest picRequest = new PersonInfoRequest(); + picRequest.setPicUri(picUri); + picRequest.setServerIndexCode(serverIndexCode); + String reBody = JSONObject.toJSONString(picRequest); + //重定向地址获取 + String url = HikUtil.hikApiFor302(HikUri.PERSON_PICTURE, reBody); + return ResponseData.success(url); + } } 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 4a07dd9..7b1dcf6 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 @@ -16,6 +16,7 @@ import com.casic.missiles.modular.redis.key.CacheKeys; import com.casic.missiles.modular.service.CockpitService; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.util.CollectionUtils; import org.springframework.web.bind.annotation.*; @@ -24,10 +25,7 @@ import java.text.NumberFormat; import java.time.LocalDateTime; import java.time.temporal.ChronoUnit; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.util.*; import java.util.stream.Collectors; /** @@ -73,6 +71,9 @@ private StatisticNumberMapper numberMapper; @Autowired + private HazardLevelMapper hazardLevelMapper; + + @Autowired private AccessGroupConfig accessGroupConfig; /** @@ -104,8 +105,24 @@ public Object buildingNumberPerHour(){ //当天按小时分组的人数 List list = numberMapper.selectListByTime(); - Map> collect = list.stream().collect(Collectors.groupingBy(BuildingNumberDTO::getStatisticPosition)); - return ResponseData.success(collect); + Map> collect = list.stream().collect(Collectors.groupingBy(BuildingNumberDTO::getStatisticTime)); + //定时任务中已将每小时三栋楼人数存到数据库 + //将一期主楼和录制楼人数合并,二期单算 + List> resultList = new ArrayList<>(); + collect.keySet().forEach(key -> { + List buildingNumberDTOS = collect.get(key); + BuildingNumberDTO mainBuildingOne = buildingNumberDTOS.get(0); + BuildingNumberDTO mainBuildingTwo = buildingNumberDTOS.get(1); + BuildingNumberDTO recordingBuilding = buildingNumberDTOS.get(2); + HashMap resultMap = new HashMap<>(); + Integer oneQuantity = Integer.valueOf(mainBuildingOne.getStatisticQuantity()); + Integer recordingQuantity = Integer.valueOf(recordingBuilding.getStatisticQuantity()); + resultMap.put("staticTime", mainBuildingOne.getStatisticTime()); + resultMap.put(mainBuildingOne.getStatisticPositionName()+"、"+recordingBuilding.getStatisticPositionName(), String.valueOf(oneQuantity+recordingQuantity)); + resultMap.put(mainBuildingTwo.getStatisticPositionName(), mainBuildingTwo.getStatisticQuantity()); + resultList.add(resultMap); + }); + return ResponseData.success(resultList); } /** @@ -151,12 +168,11 @@ public Object securityNumber() { QueryWrapper wrapper = new QueryWrapper<>(); wrapper.eq("staff_type", 2); + // TODO: 2022/9/2 后续使用产品确定的每天出勤的安保人员的数量 Integer total = staffInfoMapper.selectCount(wrapper); - //当日离岗事件个数 - QueryWrapper wrapper1 = new QueryWrapper<>(); - wrapper1.eq("hik_event_type", SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); - wrapper1.apply("date_format(now(),'%Y-%m-%d') = date_format(happen_time,'%Y-%m-%d')"); - Integer leave = caseInfoMapper.selectCount(wrapper1); + //当日离岗事件按设备去重后的个数 + // TODO: 2022/9/2 目前相当于24小时内的计算,之后看需要可改成自定义小时数计算离岗率,即离岗+6小时内仅一次离岗则恢复为100%,多次则累加离岗次数计算离岗率 + Integer leave = caseInfoMapper.selectDemobilizedCount(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); NumberFormat numberFormat = NumberFormat.getInstance(); // 设置精确到小数点后2位 numberFormat.setMaximumFractionDigits(2); @@ -179,7 +195,6 @@ @ResponseBody public Object visitorApplyDetail() { List reasonGroup = applyMapper.selectByVisitReason(); - HashMap resultMap = new HashMap<>(); NumberFormat numberFormat = NumberFormat.getInstance(); // 设置精确到小数点后2位 numberFormat.setMaximumFractionDigits(2); @@ -187,12 +202,17 @@ if(0 == sum){ return ResponseData.success(); } + List resultList = new ArrayList<>(); reasonGroup.forEach(group -> { String reasonName = dictService.getDictNameByCode(SecurityEventDict.VISIT_REASON, group.getVisitReason()); String result = numberFormat.format((float) group.getQuantity() / (float) sum * 100); - resultMap.put(reasonName, result+"%"); + ApplyReasonGroupDTO applyReasonGroupDTO = new ApplyReasonGroupDTO(); + applyReasonGroupDTO.setQuantity(group.getQuantity()); + applyReasonGroupDTO.setVisitReason(reasonName); + applyReasonGroupDTO.setRatio(result+"%"); + resultList.add(applyReasonGroupDTO); }); - return ResponseData.success(resultMap); + return ResponseData.success(resultList); } /** @@ -247,6 +267,32 @@ } /** + * 机动力量实时在岗率,在岗人数除以总应在岗人数,用离岗+6小时内恢复为100%,6小时外再计算 + */ + @GetMapping("/staff/beOnDutyRatio") + @ResponseBody + public Object beOnDutyRatio() { + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("staff_type", 2); + // TODO: 2022/9/2 后续使用产品确定的每天出勤的安保人员的数量 + Integer total = staffInfoMapper.selectCount(wrapper); + if(0 == total){ + return ResponseData.success(null); + } + //当日离岗事件按设备去重后的个数 + // TODO: 2022/9/2 目前相当于24小时内的计算,之后看需要可改成自定义小时数计算离岗率,即离岗+6小时内仅一次离岗则恢复为100%,多次则累加离岗次数计算离岗率 + List onDutyRatioDTOS = caseInfoMapper.selectDemobilizedCountByHour(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); + onDutyRatioDTOS.forEach(dto -> { + NumberFormat numberFormat = NumberFormat.getInstance(); + // 设置精确到小数点后2位 + numberFormat.setMaximumFractionDigits(2); + String result = numberFormat.format(100 - Float.valueOf(dto.getQuantity()) / (float) total * 100); + dto.setRatio(result+"%"); + }); + return ResponseData.success(onDutyRatioDTOS); + } + + /** * 闸机速通门统计-设备状态分组计算数量,devType传闸机字典key * 视频频监控摄像机统计-设备状态分组计算数量,devType传摄像头字典key */ @@ -262,12 +308,17 @@ if(sum <= 0){ return ResponseData.error("无该类设备信息"); } + List resultList = new ArrayList<>(); gateStatusGroup.forEach(group -> { String devStatus = dictService.getDictNameByCode(SecurityEventDict.DEVICE_STATUS, group.getStatus()); String result = numberFormat.format((float) group.getQuantity() / (float) sum * 100); - resultMap.put(devStatus, result+"%"); + GateStatusGroupResponse gateStatusGroupResponse = new GateStatusGroupResponse(); + gateStatusGroupResponse.setStatus(devStatus); + gateStatusGroupResponse.setRatio(result+"%"); + resultList.add(gateStatusGroupResponse); }); - resultMap.put("总", sum); + resultMap.put("total", sum); + resultMap.put("list", resultList); return ResponseData.success(resultMap); } @@ -282,17 +333,38 @@ String position = securityScoreDTO.getPosition(); List caseInfos = caseInfoMapper.selectByPosition(position); //查询各危险级别权重、各类别权重,放入map,避免循环中多次查数据库 - + HashMap hazardScoreMap = new HashMap<>(); + List caseHazardLevelList = hazardLevelMapper.getCaseHazardLevelList(null); + caseHazardLevelList.forEach(hazardLevel -> { + hazardScoreMap.put(hazardLevel.getCode(), hazardLevel.getWeight()); + }); + HashMap categoryScoreMap = new HashMap<>(); + List categoryLevelList = categoryLevelMapper.getCaseCategoryLevelList(null); + categoryLevelList.forEach(categoryLevel -> { + categoryScoreMap.put(categoryLevel.getCode(), categoryLevel.getWeight()); + }); + //事件按楼层分组,计算 List securityScoreDTOs = new ArrayList<>(); caseInfos.forEach(caseInfo -> { SecurityScoreDTO securityScoreDTO1 = new SecurityScoreDTO(); + securityScoreDTO1.setPosition(caseInfo.getPosition()); securityScoreDTO1.setArea(caseInfo.getArea()); - // TODO: 2022/8/4 楼层评分计算根据产品定义调整 -// caseInfo.get -// securityScoreDTO1.setScore(); + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); + Double score = 100 - Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + securityScoreDTO1.setScore(score); + securityScoreDTOs.add(securityScoreDTO1); }); - - return null; + 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); + }); + return ResponseData.success(securityScoreDTOs); } /** @@ -303,9 +375,13 @@ public Object SecurityFrequency(@RequestBody SecurityFrequencyDTO securityFrequencyDTO) { String year = securityFrequencyDTO.getYear(); String month = securityFrequencyDTO.getMonth(); - Integer quantity = caseInfoMapper.selectCountByMonth(year, month); - securityFrequencyDTO.setQuantity(quantity); - return ResponseData.success(securityFrequencyDTO); + if(!StringUtils.isEmpty(year) && StringUtils.isEmpty(month)){ + Integer quantity = caseInfoMapper.selectCountByMonth(year, month); + securityFrequencyDTO.setQuantity(quantity); + return ResponseData.success(securityFrequencyDTO); + } + List list = caseInfoMapper.selectPreMonthCount(); + return ResponseData.success(list); } } 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 ae4d770..f4f075c 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 @@ -1,20 +1,25 @@ package com.casic.missiles.modular.controller.cockpit; +import cn.hutool.core.date.DateUnit; import cn.hutool.core.date.DateUtil; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.casic.missiles.model.response.ResponseData; -import com.casic.missiles.modular.dao.AttendanceInfoMapper; -import com.casic.missiles.modular.dao.CaseInfoMapper; -import com.casic.missiles.modular.dao.HazardLevelMapper; -import com.casic.missiles.modular.dao.StaffInfoMapper; +import com.casic.missiles.modular.dao.*; +import com.casic.missiles.modular.dto.DeviceRepairLogDTO; +import com.casic.missiles.modular.dto.DeviceRepairRequest; import com.casic.missiles.modular.dto.statistics.*; +import com.casic.missiles.modular.enums.SecurityEventType; +import com.casic.missiles.modular.model.CaseCategoryLevel; import com.casic.missiles.modular.model.CaseHazardLevel; +import com.casic.missiles.modular.model.CaseInfo; import com.casic.missiles.modular.model.StaffInfo; +import com.casic.missiles.modular.service.DeviceInfoService; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.util.CollectionUtils; import org.springframework.web.bind.annotation.*; +import java.math.BigDecimal; import java.text.NumberFormat; import java.util.*; import java.util.stream.Collectors; @@ -40,6 +45,12 @@ @Autowired private HazardLevelMapper hazardLevelMapper; + @Autowired + private CategoryLevelMapper categoryLevelMapper; + + @Autowired + private DeviceInfoService deviceInfoService; + /** * 安防事件时域频次统计,每月的每天安防事件个数(原方案) * 月维度:展示每个月的每天的数据 @@ -89,15 +100,17 @@ List monthList = caseInfoMapper.selectPreMonthCountByYear(year); Map> collect = monthList.stream().collect(Collectors.groupingBy(PreMonthOrWeekCaseDTO::getHazardLevelCode)); HashMap strAvgMap = new HashMap<>(); + List resultList = new ArrayList<>(); for (String key : collect.keySet()) { List preMonthOrWeekCaseDTOS = collect.get(key); int sum = preMonthOrWeekCaseDTOS.stream().mapToInt(PreMonthOrWeekCaseDTO::getQuantity).sum(); //若年份是本年,则使用个安防级别数量/当前月份数 //若不是本年,除数为12 MonthAndWeekDTO monthAndWeekDTO = new MonthAndWeekDTO(); + String hazardName = hazardLevelMapper.selectHazardNameByCode(key); + monthAndWeekDTO.setLevelName(hazardName); if(year.equals(String.valueOf(DateUtil.thisYear()))){ monthAndWeekDTO.setMonthQuantity(sum / DateUtil.thisMonth()); -// monthAndWeekDTO.setLevelName(); strAvgMap.put(key, monthAndWeekDTO); }else{ monthAndWeekDTO.setMonthQuantity(sum / 12); @@ -113,27 +126,37 @@ if(year.equals(String.valueOf(DateUtil.thisYear()))){ if(!Objects.isNull(strAvgMap.get(key))){ MonthAndWeekDTO monthAndWeekDTO = strAvgMap.get(key); + String hazardName = hazardLevelMapper.selectHazardNameByCode(key); + monthAndWeekDTO.setLevelName(hazardName); monthAndWeekDTO.setWeekQuantity(sum / DateUtil.thisWeekOfYear()); strAvgMap.put(key, monthAndWeekDTO); }else{ MonthAndWeekDTO monthAndWeekDTO = new MonthAndWeekDTO(); + String hazardName = hazardLevelMapper.selectHazardNameByCode(key); + monthAndWeekDTO.setLevelName(hazardName); monthAndWeekDTO.setWeekQuantity(sum / DateUtil.thisWeekOfYear()); strAvgMap.put(key, monthAndWeekDTO); } }else{ if(!Objects.isNull(strAvgMap.get(key))){ MonthAndWeekDTO monthAndWeekDTO = strAvgMap.get(key); + String hazardName = hazardLevelMapper.selectHazardNameByCode(key); + monthAndWeekDTO.setLevelName(hazardName); monthAndWeekDTO.setWeekQuantity(sum / 52); strAvgMap.put(key, monthAndWeekDTO); }else{ MonthAndWeekDTO monthAndWeekDTO = new MonthAndWeekDTO(); + String hazardName = hazardLevelMapper.selectHazardNameByCode(key); + monthAndWeekDTO.setLevelName(hazardName); monthAndWeekDTO.setWeekQuantity(sum / 52); strAvgMap.put(key, monthAndWeekDTO); } } } - avgMonthAndWeekGroupDTO.setMap(strAvgMap); - return ResponseData.success(avgMonthAndWeekGroupDTO); + strAvgMap.keySet().forEach(key -> { + resultList.add(strAvgMap.get(key)); + }); + return ResponseData.success(resultList); } /** @@ -181,12 +204,178 @@ } /** - * 员工考勤人数变化,功能待定 + * 员工考勤人数变化,统计当天(横坐标为时)及近7天(横坐标为天)的考勤人数变化,只要发生一次考勤识别,次数的基数就正常增加(没有上班下班区分) */ + @PostMapping("/staff/attendanceNumber/{dimension}") + @ResponseBody + public Object attendanceNumber(@PathVariable("dimension") String dimension) { + List attendanceNumberDTOs = null; + List> resultList = new ArrayList<>(); + if("week".equals(dimension)){ + //近7天数据按天分组统计 + attendanceNumberDTOs = attendanceInfoMapper.getCountForWeek(); + }else if("day".equals(dimension)) { + //今天数据按小时分组统计 + attendanceNumberDTOs = attendanceInfoMapper.getCountForDay(); + } + if(CollectionUtils.isEmpty(attendanceNumberDTOs)){ + return ResponseData.error("该查询条件下,无员工出勤数据!"); + } + Map> collect = attendanceNumberDTOs.stream().collect(Collectors.groupingBy(AttendanceNumberDTO::getDate)); + collect.keySet().forEach(key -> { + List attendanceNumberDTOS = collect.get(key); + AttendanceNumberDTO attendanceNumberDTO = attendanceNumberDTOS.get(0); + AttendanceNumberDTO attendanceNumberDTO2 = attendanceNumberDTOS.get(1); + Map resultMap = new HashMap<>(); + resultMap.put(attendanceNumberDTO.getStaffType(), attendanceNumberDTO.getQuantity()); + resultMap.put(attendanceNumberDTO2.getStaffType(), attendanceNumberDTO2.getQuantity()); + resultMap.put("staticTime", attendanceNumberDTO.getDate()); + resultList.add(resultMap); + }); + return ResponseData.success(resultList); + } /** - * 近30天/近一周安保人员到岗排行 + * 早晚高峰区域安防评估 */ + @PostMapping("/security/assessment/{dimension}") + @ResponseBody + public Object securityAssessment(@PathVariable("dimension") String dimension) { + //查询各危险级别权重、各类别权重,放入map,避免循环中多次查数据库 + HashMap hazardScoreMap = new HashMap<>(); + List caseHazardLevelList = hazardLevelMapper.getCaseHazardLevelList(null); + caseHazardLevelList.forEach(hazardLevel -> { + hazardScoreMap.put(hazardLevel.getCode(), hazardLevel.getWeight()); + }); + HashMap categoryScoreMap = new HashMap<>(); + List categoryLevelList = categoryLevelMapper.getCaseCategoryLevelList(null); + categoryLevelList.forEach(categoryLevel -> { + categoryScoreMap.put(categoryLevel.getCode(), categoryLevel.getWeight()); + }); + HashMap hashMap = new HashMap<>(); + if("week".equals(dimension)){ + //近7天早晚高峰数据 + List caseInfos = caseInfoMapper.selectListBySevenDay(); + //按时间(天)进行分组 + caseInfos.forEach(caseInfo -> { + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); + Double score = Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + String[] array = caseInfo.getHappenTime().split(" "); + String dayTime = array[0]; + BigDecimal preScore; + if(hashMap.containsKey(dayTime)){ + Double aDouble = hashMap.get(dayTime); + preScore = new BigDecimal(aDouble.toString()); + + }else{ + preScore = new BigDecimal("100.0"); + } + BigDecimal nowScore = new BigDecimal(score.toString()); + hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); + }); + return ResponseData.success(hashMap); + }else if("day".equals(dimension)) { + //今天数据按小时分组统计 + List caseInfos = caseInfoMapper.selectListByToday(); + caseInfos.forEach(caseInfo -> { + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); + Double score = Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + String[] array = caseInfo.getHappenTime().split(":"); + String dayTime = array[0]; + BigDecimal preScore; + if(hashMap.containsKey(dayTime)){ + Double aDouble = hashMap.get(dayTime); + preScore = new BigDecimal(aDouble.toString()); + + }else{ + preScore = new BigDecimal("100.0"); + } + BigDecimal nowScore = new BigDecimal(score.toString()); + hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); + }); + return ResponseData.success(hashMap); + } + return null; + } + + /** + * 重点区域安防事态评估,统计重点区域6:00-23:00按小时分组数据 + */ + @GetMapping("/security/keyAreaStatistic") + @ResponseBody + public Object keyAreaStatistic() { + //查询各危险级别权重、各类别权重,放入map,避免循环中多次查数据库 + HashMap hazardScoreMap = new HashMap<>(); + List caseHazardLevelList = hazardLevelMapper.getCaseHazardLevelList(null); + caseHazardLevelList.forEach(hazardLevel -> { + hazardScoreMap.put(hazardLevel.getCode(), hazardLevel.getWeight()); + }); + HashMap categoryScoreMap = new HashMap<>(); + List categoryLevelList = categoryLevelMapper.getCaseCategoryLevelList(null); + categoryLevelList.forEach(categoryLevel -> { + categoryScoreMap.put(categoryLevel.getCode(), categoryLevel.getWeight()); + }); + HashMap hashMap = new HashMap<>(); + //今天数据按小时分组统计 + List caseInfos = caseInfoMapper.selectListByToday2(); + caseInfos.forEach(caseInfo -> { + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); + Double score = Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + String[] array = caseInfo.getHappenTime().split(":"); + String dayTime = array[0]; + BigDecimal preScore; + if(hashMap.containsKey(dayTime)){ + Double aDouble = hashMap.get(dayTime); + preScore = new BigDecimal(aDouble.toString()); + + }else{ + preScore = new BigDecimal("100.0"); + } + BigDecimal nowScore = new BigDecimal(score.toString()); + hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); + }); + return ResponseData.success(hashMap); + } + + /** + * 安防机动支援力量调配响应评估,根据事件已解决状态及已解决时间-发送时间,按时间(小时)分组统计 + */ + @GetMapping("/security/responseAssess") + @ResponseBody + public Object responseAssess() { + //查询各危险级别权重、各类别权重,放入map,避免循环中多次查数据库 + HashMap hazardScoreMap = new HashMap<>(); + List caseHazardLevelList = hazardLevelMapper.getCaseHazardLevelList(null); + caseHazardLevelList.forEach(hazardLevel -> { + hazardScoreMap.put(hazardLevel.getCode(), hazardLevel.getWeight()); + }); + HashMap hashMap = new HashMap<>(); + //今天数据按小时分组统计 + List caseInfos = caseInfoMapper.selectListByToday3(); + caseInfos.forEach(caseInfo -> { + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + //扣分=事件级别权重*未解决小时数 + Date updateTime = DateUtil.parse(caseInfo.getUpdateTime()); + Date happenTime = DateUtil.parse(caseInfo.getHappenTime()); + long between = DateUtil.between(updateTime, happenTime, DateUnit.HOUR); + Double score = Double.valueOf(hazardWeight)*between; + String[] array = caseInfo.getHappenTime().split(":"); + String dayTime = array[0]; + BigDecimal preScore; + if(hashMap.containsKey(dayTime)){ + Double aDouble = hashMap.get(dayTime); + preScore = new BigDecimal(aDouble.toString()); + }else{ + preScore = new BigDecimal("100.0"); + } + BigDecimal nowScore = new BigDecimal(score.toString()); + hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); + }); + return ResponseData.success(hashMap); + } /** * 重点区域威胁事件类型统计,优先级2,统计近7天和近30天 @@ -224,7 +413,34 @@ } /** - * 设备状态计算系数和评判,优先级3,需确认设备恢复时间是否可以获取 + * 近30天/近一周安保人员到岗排行 */ + + /** + * 安保等级评估,发生离岗事件减1分 + */ + @GetMapping("/security/levelAssess") + @ResponseBody + public Object securityLevelAssess() { + //今天数据按小时分组统计 + List resultList = caseInfoMapper.selectListByType(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); + resultList.forEach(result -> { + BigDecimal deScore = new BigDecimal(result.getQuantity()); + BigDecimal preScore = new BigDecimal("100.0"); + result.setScore(preScore.subtract(deScore).doubleValue()); + }); + return ResponseData.success(resultList); + } + + /** + * 设备状态计算系数和评判,即设备维修管理查询(不分页) + */ + @PostMapping("/device/repairList") + @ResponseBody + public Object repairList(@RequestBody DeviceRepairRequest deviceRepairRequest) { + List deviceRepairLogDTOS = deviceInfoService.deviceRepairListPage(deviceRepairRequest); + return ResponseData.success(deviceRepairLogDTOS); + } + } 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 fbf8ab6..c71a15a 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 @@ -1,13 +1,12 @@ package com.casic.missiles.modular.controller.hik; +import cn.hutool.core.date.DateTime; +import cn.hutool.core.date.DateUtil; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.casic.missiles.model.response.ResponseData; import com.casic.missiles.modular.dao.HikFaceGroupInfoMapper; -import com.casic.missiles.modular.dto.hik.EventSubscribeRequest; -import com.casic.missiles.modular.dto.hik.FaceGroupAdditionRequest; -import com.casic.missiles.modular.dto.hik.HikRecvEvent; -import com.casic.missiles.modular.dto.hik.OrgBatchAdd; +import com.casic.missiles.modular.dto.hik.*; import com.casic.missiles.modular.enums.HikUri; import com.casic.missiles.modular.enums.SecurityEventType; import com.casic.missiles.modular.model.CaseInfo; @@ -18,16 +17,20 @@ import com.casic.missiles.modular.util.CaseInfoFactoryUtil; import com.casic.missiles.modular.util.HikUtil; import com.casic.missiles.modular.util.ThreadPoolUtil; +import com.casic.missiles.modular.util.WebSocket; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; -import org.springframework.web.bind.annotation.*; +import org.springframework.util.CollectionUtils; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.RestController; -import java.net.InetAddress; -import java.net.UnknownHostException; import java.util.ArrayList; +import java.util.Iterator; import java.util.List; import java.util.Objects; @@ -38,7 +41,6 @@ */ @Slf4j @RestController -@RequestMapping("/hik") public class HikController { @Autowired @@ -53,28 +55,37 @@ @Autowired private HikService hikService; + @Autowired + private HikFaceGroupInfoMapper hikFaceGroupInfoMapper; + + @Autowired + private WebSocket webSocket; + @Value("${server.port}") private int serverPort; - @Autowired - private HikFaceGroupInfoMapper hikFaceGroupInfoMapper; /** * 海康事件订阅 */ - @PostMapping("/event/subscribe") + @PostMapping("/hik/event/subscribe") @ResponseBody - public Object eventSubscribe() throws UnknownHostException { + public Object eventSubscribe() { EventSubscribeRequest eventSubscribeRequest = new EventSubscribeRequest(); ArrayList list = new ArrayList<>(); list.add(SecurityEventType.DEVICE_OFFLINE); + list.add(SecurityEventType.DEVICE_ONLINE); list.add(SecurityEventType.KEY_PERSONNEL_IDENTIFY_EVENT); list.add(SecurityEventType.MONITORING_POINT_OFFLINE); + list.add(SecurityEventType.MONITORING_POINT_ONLINE); list.add(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); list.add(SecurityEventType.PERSONNEL_GATHER_EVENT); - InetAddress localHost = InetAddress.getLocalHost(); + list.add(SecurityEventType.VISITOR_REGISTER); + list.add(SecurityEventType.VISITOR_CHECKOUT); + list.add(SecurityEventType.HIGH_ALTITUDE_PARABOLIC); +// InetAddress localHost = InetAddress.getLocalHost(); eventSubscribeRequest.setEventTypes(list); - eventSubscribeRequest.setEventDest("https://" + localHost + ":" + serverPort + "/eventRcv"); + eventSubscribeRequest.setEventDest("http://" + "192.168.10.6" + ":" + serverPort + "/eventRcv"); //订阅类型,0-订阅原始事件,1-联动事件,2-原始事件和联动事件,不填使用默认值0 eventSubscribeRequest.setSubType(0); /** @@ -92,19 +103,25 @@ } /** + * 查询事件订阅信息 + */ + @PostMapping("/hik/event/query") + @ResponseBody + public Object eventQuery() { + String result = HikUtil.hikApi(HikUri.EVENT_INFO, ""); + return result; + } + + /** * 海康事件接收 */ @PostMapping("/eventRcv") @ResponseBody public Object eventRcv(@RequestBody HikRecvEvent hikRecvEvent) { //1、接收所需事件类型 - Long eventType = hikRecvEvent.getEventType(); + Number eventType = hikRecvEvent.getEventType(); log.info("接收到安防事件类型为:{}", eventType); CaseInfo caseInfo = caseInfoFactoryUtil.getCaseInfo(eventType); - //接收到不关心事件直接返回 - if(Objects.isNull(caseInfo)){ - return ResponseData.success(); - } //2、不同事件不同处理,caseInfoFactoryUtil已设置好事件基础定义信息 // 再为事件添加状态、设备编码、设备名称、位置、区域、时间 // 异步处理事件 @@ -114,19 +131,23 @@ caseHandle(hikRecvEvent, eventType, caseInfo); } })); +// caseHandle(hikRecvEvent, eventType, caseInfo); - return null; + return ResponseData.success(); } - private void caseHandle(HikRecvEvent hikRecvEvent, Long eventType, CaseInfo caseInfo) { + private void caseHandle(HikRecvEvent hikRecvEvent, Number eventType, CaseInfo caseInfo) { JSONArray eventArray = hikRecvEvent.getEventArray(); List caseInfos = new ArrayList<>(); - while (eventArray.stream().iterator().hasNext()) { + Iterator iterator = eventArray.iterator(); + while (iterator.hasNext()) { CaseInfo caseInfo1 = new CaseInfo(); - BeanUtils.copyProperties(caseInfo, caseInfo1); - JSONObject event = (JSONObject) eventArray.stream().iterator().next(); + if(!Objects.isNull(caseInfo)){ + BeanUtils.copyProperties(caseInfo, caseInfo1); + } + JSONObject event = (JSONObject) iterator.next(); //5种事件进行不同处理 - if(SecurityEventType.KEY_PERSONNEL_IDENTIFY_EVENT == eventType){ + if (SecurityEventType.KEY_PERSONNEL_IDENTIFY_EVENT.equals(eventType)) { //判断所属人脸分组 JSONObject data = (JSONObject) event.get("data"); JSONObject faceRecognitionResult = (JSONObject) data.get("faceRecognitionResult"); @@ -142,52 +163,101 @@ if (faceGroupCode.equals(blackListGroup.getFaceGroupCode())) { //黑名单分组处理 caseInfo1 = hikService.blackListHandle(event, caseInfo1); - }else if(faceGroupCode.equals(propertyPersonnelGroup.getFaceGroupCode())){ + } else if (faceGroupCode.equals(propertyPersonnelGroup.getFaceGroupCode())) { //考勤分组处理-物业人员,添加到考勤表 hikService.propertyAttendanceHandle(event); - }else if(faceGroupCode.equals(securityPersonnelGroup.getFaceGroupCode())){ + } else if (faceGroupCode.equals(securityPersonnelGroup.getFaceGroupCode())) { //考勤分组处理-安保人员,添加到考勤表 hikService.securityPersonnelHandle(event); - }else { + } else { return; } - }else if(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT == eventType){ + } else if (SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT.equals(eventType)) { //离岗事件处理 caseInfo1 = hikService.demobilizedHandle(event, caseInfo1); - }else if(SecurityEventType.PERSONNEL_GATHER_EVENT == eventType){ + } else if (SecurityEventType.PERSONNEL_GATHER_EVENT.equals(eventType)) { //人员聚集事件处理 caseInfo1 = hikService.personGatherHandle(event, caseInfo1); - }else if(SecurityEventType.MONITORING_POINT_OFFLINE == eventType){ + } else if (SecurityEventType.MONITORING_POINT_OFFLINE.equals(eventType)) { //监控点离线事件处理 caseInfo1 = hikService.monitorPointOfflineHandle(event, caseInfo1); - }else if(SecurityEventType.DEVICE_OFFLINE == eventType){ + } else if (SecurityEventType.MONITORING_POINT_ONLINE.equals(eventType)) { + //监控点上线事件处理 + hikService.monitorPointOnlineHandle(event); + } else if (SecurityEventType.DEVICE_OFFLINE.equals(eventType)) { //装置离线事件处理 caseInfo1 = hikService.deviceOfflineHandle(event, caseInfo1); - }else if(SecurityEventType.VISITOR_REGISTER == eventType){ + } else if (SecurityEventType.DEVICE_ONLINE.equals(eventType)) { + //装置上线处理 + hikService.deviceOnlineHandle(event); + } else if (SecurityEventType.VISITOR_REGISTER.equals(eventType)) { //记录访客登记记录,添加到访客记录表 hikService.visitorRegisterHandler(event); - }else if(SecurityEventType.VISITOR_CHECKOUT == eventType){ + } else if (SecurityEventType.VISITOR_CHECKOUT.equals(eventType)) { //记录访客签离记录 hikService.visitorCheckOutHandler(event); } - if(!Objects.isNull(caseInfo1) && !StringUtils.isEmpty(caseInfo1.getHappenTime())){ + if (!Objects.isNull(caseInfo1) && !StringUtils.isEmpty(caseInfo1.getHappenTime())) { caseInfos.add(caseInfo1); } } //3、安防事件入库 - if(!caseInfoService.insertCaseInfoBatch(caseInfos)){ - log.error("安防事件批量入库异常"); + if (!CollectionUtils.isEmpty(caseInfos) && !caseInfoService.insertCaseInfoBatch(caseInfos)) { + log.error("安防事件批量入库异常!"); } // TODO: 2022/8/15 webSocket推送 + if (CollectionUtils.isEmpty(caseInfos)) { + log.info("webSocket事件推送"); + webSocket.sendAllMessage(JSONObject.toJSONString(caseInfos)); + } return; } /** + * 以图搜图,前端用于轨迹追踪 + */ + @PostMapping("/hik/search/picture") + @ResponseBody + public Object searchPictures(@RequestBody SearchPicturesRequest searchPicturesRequest) { + DateTime startDateTime = DateUtil.parse(searchPicturesRequest.getStartTime()); + DateTime endDateTime = DateUtil.parse(searchPicturesRequest.getEndTime()); + String startTime = DateUtil.format(startDateTime, "yyyy-MM-dd'T'HH:mm:ss.SSSXXX"); + String endTime = DateUtil.format(endDateTime, "yyyy-MM-dd'T'HH:mm:ss.SSSXXX"); + searchPicturesRequest.setStartTime(startTime); + searchPicturesRequest.setEndTime(endTime); + String body = JSONObject.toJSONString(searchPicturesRequest); + String resultStr = HikUtil.hikApi(HikUri.SEARCH_PICTURES, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (!"0".equals(resultJson.get("code"))) { + log.error("请求海康,以图搜图失败,海康response:{}", resultStr); + return ResponseData.error("以图搜图失败"); + } + return ResponseData.success(resultJson); + } + + + /** + * 海康事件取消订阅 + */ + @PostMapping("/hik/event/cancel") + @ResponseBody + public Object eventCancelSubscribe(@RequestBody CancelSubscribeRequest cancelSubscribeRequest) { + String body = JSONObject.toJSONString(cancelSubscribeRequest); + String resultStr = HikUtil.hikApi(HikUri.EVENT_CANCEL, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (!"0".equals(resultJson.get("code"))) { + log.error("请求海康,取消订阅失败,海康response:{}", resultStr); + return ResponseData.error("取消订阅失败"); + } + return ResponseData.success(resultJson); + } + + /** * 单个添加海康人脸分组 * api->hik单个添加人脸分组api->response->mysql */ - @PostMapping("/faceGroup/single/add") + @PostMapping("/hik/faceGroup/single/add") @ResponseBody public Object faceGroupAddition(@RequestBody FaceGroupAdditionRequest faceGroupAdditionRequest) { String body = JSONObject.toJSONString(faceGroupAdditionRequest); @@ -212,7 +282,7 @@ * 批量添加海康组织 * api->hik批量添加组织api->response */ - @PostMapping("/org/batch/add") + @PostMapping("/hik/org/batch/add") @ResponseBody public Object orgBatchAdd(@RequestBody List orgBatchAddRequest) { String body = JSONObject.toJSONString(orgBatchAddRequest); @@ -232,4 +302,62 @@ return ResponseData.error("批量添加组织失败"); } + /** + * 获取人员列表 + */ + @PostMapping("/hik/person/personList") + @ResponseBody + public Object personList() { + PersonListRequest request = new PersonListRequest(); + request.setPageNo(1); + request.setPageSize(100); + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi("/api/resource/v2/person/personList", body); + return resultStr; + } + + /** + * 获取组织列表 + */ + @PostMapping("/hik/org/orgList") + @ResponseBody + public Object orgList() { + PersonListRequest request = new PersonListRequest(); + request.setPageNo(1); + request.setPageSize(100); + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi("/api/resource/v1/org/orgList", body); + return resultStr; + } + + /** + * 查询访客权限下载记录 + */ + @PostMapping("/hik/auth/result") + @ResponseBody + public Object authResult() { + PersonListRequest request = new PersonListRequest(); + request.setPageNo(1); + request.setPageSize(100); + request.setOrderId("ba101db6246711edaea66f7939a13638"); + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi("/api/visitor/v1/auth/result", body); + return resultStr; + } + + /** + * 人脸图片获取 + */ + @PostMapping("/hik/face/picture") + @ResponseBody + public Object facePicture() { + FaceRequest request = new FaceRequest(); +// List list = new ArrayList<>(); +// list.add(""); + request.setCertificateNum("wanggong"); + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi("/api/frs/v1/face", body); + return resultStr; + } + } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/AssetInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/AssetInfoMapper.java index 4f64e83..c0684ee 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/AssetInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/AssetInfoMapper.java @@ -17,6 +17,6 @@ @Mapper public interface AssetInfoMapper extends BaseMapper { - List getAssetInfoListPage(@Param("page") Page page, AssetInfoRequest assetInfoRequest); + List getAssetInfoListPage(@Param("page") Page page, @Param("assetInfoRequest") AssetInfoRequest assetInfoRequest); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/AttendanceInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/AttendanceInfoMapper.java index f9e793e..ec87e46 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/AttendanceInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/AttendanceInfoMapper.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.statistics.AttendanceNumberDTO; import com.casic.missiles.modular.dto.statistics.AttendanceRatioDTO; import com.casic.missiles.modular.model.AttendanceInfo; import org.apache.ibatis.annotations.Mapper; @@ -17,7 +18,7 @@ */ @Mapper public interface AttendanceInfoMapper extends BaseMapper { - List getAttendanceInfoListPage(@Param("page") Page page, StaffInfoRequest attendanceInfoRequest); + List getAttendanceInfoListPage(@Param("page") Page page, @Param("attendanceInfoRequest") StaffInfoRequest attendanceInfoRequest); AttendanceInfo selectByCodeAndDate(@Param("staffCode") String staffCode); @@ -26,4 +27,8 @@ List getCountByTypeAndDateForMonth(@Param("staffType")String staffType); List getCountByTypeAndDateForYear(@Param("staffType")String staffType); + + List getCountForWeek(); + + List getCountForDay(); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java index ce94b8f..6137a7d 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java @@ -17,5 +17,5 @@ @Mapper public interface BlackInfoMapper extends BaseMapper { - List getBlackInfoListPage(@Param("page") Page page, BlackInfoRequest blackInfoRequest); + List getBlackInfoListPage(@Param("page") Page page, @Param("blackInfoRequest") BlackInfoRequest blackInfoRequest); } 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 efda6b3..50aaa6f 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 @@ -20,7 +20,7 @@ List getCaseInfoListPage(@Param("page") Page page, @Param("caseInfoRequest") CaseInfoRequest caseInfoRequest); - int updateStatusById(CaseInfoRequest caseInfoRequest); + int updateStatusById(@Param("caseInfoRequest") CaseInfoRequest caseInfoRequest); List selectByLevelAndMonth(@Param("year") String year); @@ -47,4 +47,20 @@ List selectPreWeekCountByThirtyDay(); List selectPreDayCountBySevenDay(); + + Integer selectDemobilizedCount(@Param("eventType") Number personnelDemobilizedEvent); + + List selectPreMonthCount(); + + List selectListBySevenDay(); + + List selectListByToday(); + + List selectListByToday2(); + + List selectListByToday3(); + + List selectListByType(@Param("eventType") Number eventType); + + List selectDemobilizedCountByHour(@Param("eventType") Number eventType); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/CategoryLevelMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/CategoryLevelMapper.java index 52fc714..afe1650 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/CategoryLevelMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/CategoryLevelMapper.java @@ -17,9 +17,9 @@ @Mapper public interface CategoryLevelMapper extends BaseMapper { - List getCaseCategoryLevelListPage(@Param("page") Page page, CategoryLevelRequest categoryLevelRequest); + List getCaseCategoryLevelListPage(@Param("page") Page page, @Param("categoryLevelRequest") CategoryLevelRequest categoryLevelRequest); - List getCaseCategoryLevelList(CategoryLevelRequest categoryLevelRequest); + List getCaseCategoryLevelList(@Param("categoryLevelRequest") CategoryLevelRequest categoryLevelRequest); CaseCategoryLevel getCaseCategoryLevel(@Param("categoryLevelCode") String categoryLevelCode); 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 66353b1..2555a09 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 @@ -19,7 +19,7 @@ @Mapper public interface DeviceInfoMapper extends BaseMapper { - List getDeviceInfoListPage(@Param("page") Page page, DeviceInfoRequest deviceInfoRequest); + List getDeviceInfoListPage(@Param("page") Page page, @Param("deviceInfoRequest") DeviceInfoRequest deviceInfoRequest); List getDeviceInfoList(@Param("deviceInfoRequest") DeviceInfoRequest deviceInfoRequest); @@ -27,6 +27,8 @@ DeviceInfo getByIndexCode(@Param("srcIndex") String srcIndex); + DeviceInfo getByIp(@Param("ip") String ip); + List selectIndexCodesByCodes(@Param("deviceCodes") List deviceCodes); List selectByType(@Param("devType") String devType); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java index 41dd0af..5bfaf63 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java @@ -5,6 +5,7 @@ import com.casic.missiles.modular.dto.DeviceRepairRequest; import com.casic.missiles.modular.model.DeviceRepairLog; import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; import java.util.List; @@ -16,7 +17,7 @@ @Mapper public interface DeviceRepairLogMapper extends BaseMapper { - List getDeviceRepairListPage(Page page, DeviceRepairRequest deviceRepairRequest); + List getDeviceRepairListPage(@Param("page") Page page, @Param("deviceRepairRequest")DeviceRepairRequest deviceRepairRequest); - List getDeviceRepairList(DeviceRepairRequest deviceRepairRequest); + List getDeviceRepairList(@Param("deviceRepairRequest") DeviceRepairRequest deviceRepairRequest); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java index 9035c47..4823ac1 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java @@ -18,7 +18,7 @@ @Mapper public interface FireEquipInfoMapper extends BaseMapper { - List getFireEquipInfoListPage(@Param("page") Page page, FireEquipRequest fireEquipRequest); + List getFireEquipInfoListPage(@Param("page") Page page, @Param("fireEquipRequest") FireEquipRequest fireEquipRequest); FireEquipInfo getFireEquipInfo(@Param("equipCode") String equipCode); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/GateGroupMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/GateGroupMapper.java index d8c330d..977a427 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/GateGroupMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/GateGroupMapper.java @@ -17,7 +17,7 @@ */ @Mapper public interface GateGroupMapper extends BaseMapper { - List getGateGroupListPage(@Param("page") Page page, GateGroupRequest gateGroupRequest); + List getGateGroupListPage(@Param("page") Page page, @Param("gateGroupRequest") GateGroupRequest gateGroupRequest); GateGroup getGateGroupByName(@Param("groupName") String groupName); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/HazardLevelMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/HazardLevelMapper.java index 8957780..dcf47bb 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/HazardLevelMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/HazardLevelMapper.java @@ -17,11 +17,13 @@ @Mapper public interface HazardLevelMapper extends BaseMapper { - List getCaseHazardLevelListPage(@Param("page") Page page, HazardLevelRequest hazardLevelRequest); + List getCaseHazardLevelListPage(@Param("page") Page page, @Param("hazardLevelRequest") HazardLevelRequest hazardLevelRequest); - List getCaseHazardLevelList(HazardLevelRequest hazardLevelRequest); + List getCaseHazardLevelList(@Param("hazardLevelRequest") HazardLevelRequest hazardLevelRequest); CaseHazardLevel getCaseHazardLevel(@Param("hazardLevelCode") String hazardLevelCode); List selectHazardName(); + + String selectHazardNameByCode(@Param("hazardLevelCode") String hazardLevelCode); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/HikCaseDefineMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/HikCaseDefineMapper.java index 0dc47d1..f162fef 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/HikCaseDefineMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/HikCaseDefineMapper.java @@ -12,5 +12,5 @@ */ @Mapper public interface HikCaseDefineMapper extends BaseMapper { - HikCaseDefine getHikCaseDefine(@Param("caseTypeCode") Long caseTypeCode); + HikCaseDefine getHikCaseDefine(@Param("caseTypeCode") Number caseTypeCode); } 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 f8a674c..fe5afc2 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 @@ -17,11 +17,13 @@ @Mapper public interface StaffInfoMapper extends BaseMapper { - List getStaffInfoListPage(@Param("page") Page page, StaffInfoRequest staffInfoRequest); + List getStaffInfoListPage(@Param("page") Page page, @Param("staffInfoRequest") StaffInfoRequest staffInfoRequest); StaffInfo selectByCode(@Param("staffCode") String staffCode); - List getStaffInfoList(StaffInfoRequest staffInfoRequest); + List getStaffInfoList(@Param("staffInfoRequest") StaffInfoRequest staffInfoRequest); - List selectBatchCodes(List list); + List selectBatchCodes(@Param("list") List list); + + int updateByCodeForCard(@Param("staffCode") String staffCode, @Param("cardNo") String cardNo); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/BlackListController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/BlackListController.java index a27f9f8..0c06661 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/BlackListController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/BlackListController.java @@ -1,13 +1,18 @@ package com.casic.missiles.modular.controller; +import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.base.controller.ExportController; import com.casic.missiles.core.page.PageFactory; import com.casic.missiles.model.response.ResponseData; import com.casic.missiles.modular.dto.BlackInfoRequest; +import com.casic.missiles.modular.dto.BlackPictureRequest; +import com.casic.missiles.modular.dto.hik.PersonInfoRequest; +import com.casic.missiles.modular.enums.HikUri; import com.casic.missiles.modular.enums.OperateTypeEnum; import com.casic.missiles.modular.model.BlackInfo; import com.casic.missiles.modular.service.BlackInfoService; +import com.casic.missiles.modular.util.HikUtil; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; @@ -56,4 +61,22 @@ return null; } + /** + * 黑名单人员照片 + */ + @PostMapping("/personPicture") + @ResponseBody + public Object personPicture(@RequestBody BlackPictureRequest blackPictureRequest){ + //获取照片 + String picUri = blackPictureRequest.getPicUri(); + String serverIndexCode = blackPictureRequest.getServerIndexCode(); + PersonInfoRequest picRequest = new PersonInfoRequest(); + picRequest.setPicUri(picUri); + picRequest.setServerIndexCode(serverIndexCode); + String reBody = JSONObject.toJSONString(picRequest); + //重定向地址获取 + String url = HikUtil.hikApiFor302(HikUri.PERSON_PICTURE, reBody); + return ResponseData.success(url); + } + } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/DeviceController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/DeviceController.java index e1c4eba..666bbee 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/DeviceController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/DeviceController.java @@ -107,7 +107,7 @@ } /** - * 设备维修管理查询(分页),需计算MTTR=总维修时间/故障次数 + * 设备状态计算与评判/设备维修管理查询(分页),需计算MTTR=总维修时间/故障次数 */ @PostMapping("/repair/listPage") @ResponseBody @@ -211,7 +211,7 @@ //需根据设备编号获取到对应的门禁点唯一标识 doorControlRequest.setDoorIndexCodes(indexCodes); doorControlRequest.setControlType(Integer.valueOf(gateGroupDTO.getStatus())); - String body = JSONObject.toJSONString(deviceCodes); + String body = JSONObject.toJSONString(doorControlRequest); String resultStr = HikUtil.hikApi(HikUri.DOOR_CONTROL, body); JSONObject resultJson = (JSONObject)JSONObject.parse(resultStr); if (!"0".equals(resultJson.get("code"))) { diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/StaffController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/StaffController.java index b58ccab..704093c 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/StaffController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/StaffController.java @@ -2,15 +2,21 @@ import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.util.StrUtil; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.base.controller.ExportController; import com.casic.missiles.core.page.PageFactory; import com.casic.missiles.model.response.ErrorResponseData; import com.casic.missiles.model.response.ResponseData; import com.casic.missiles.modular.dto.StaffInfoRequest; +import com.casic.missiles.modular.dto.hik.PersonInfoRequest; +import com.casic.missiles.modular.dto.hik.StaffCardRequest; +import com.casic.missiles.modular.enums.HikUri; import com.casic.missiles.modular.enums.OperateTypeEnum; import com.casic.missiles.modular.model.StaffInfo; import com.casic.missiles.modular.service.StaffInfoService; +import com.casic.missiles.modular.util.HikUtil; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; @@ -110,4 +116,60 @@ } return ResponseData.success(); } + + /** + * 批量开卡,添加人员之后调用,若在一个接口中添加人员成功开卡失败则第二次添加时会有问题 + */ + @PostMapping("/cardBinding") + @ResponseBody + public Object cardBinding(@RequestBody StaffCardRequest staffCardRequest) { + String body = JSONObject.toJSONString(staffCardRequest); + String resultStr = HikUtil.hikApi(HikUri.CARD_BINDING, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (!"0".equals(resultJson.get("code"))) { + log.error("请求海康,批量开卡失败,海康response:{}", resultStr); + return ResponseData.error("批量开卡失败"); + } + //保存卡号 + if(staffInfoService.saveCardInfo(staffCardRequest) > 0){ + return ResponseData.success(); + } + return ResponseData.error("批量开卡失败"); + } + + /** + * 获取员工照片,海康存储 + */ + @PostMapping("/personPicture/{staffCode}") + @ResponseBody + public Object personPicture(@PathVariable("staffCode") String staffCode){ + //获取员工详细信息,含图片服务器、uri + PersonInfoRequest request = new PersonInfoRequest(); + List list = new ArrayList<>(); + list.add(staffCode); + request.setParamName("personId"); + request.setParamValue(list); + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi(HikUri.PERSON_INFO, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (!"0".equals(resultJson.get("code"))) { + log.error("请求海康,根据人员唯一字段获取人员详细信息失败,海康response:{}", resultStr); + return ResponseData.error("获取员工照片失败"); + } + //获取照片 + JSONObject data = (JSONObject) resultJson.get("data"); + JSONArray dataArray = (JSONArray) data.get("list"); + JSONObject jsonObject = (JSONObject) dataArray.get(0); + JSONArray personPhoto = (JSONArray) jsonObject.get("personPhoto"); + JSONObject photo = (JSONObject) personPhoto.get(0); + String picUri = photo.getString("picUri"); + String serverIndexCode = photo.getString("serverIndexCode"); + PersonInfoRequest picRequest = new PersonInfoRequest(); + picRequest.setPicUri(picUri); + picRequest.setServerIndexCode(serverIndexCode); + String reBody = JSONObject.toJSONString(picRequest); + //重定向地址获取 + String url = HikUtil.hikApiFor302(HikUri.PERSON_PICTURE, reBody); + return ResponseData.success(url); + } } 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 4a07dd9..7b1dcf6 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 @@ -16,6 +16,7 @@ import com.casic.missiles.modular.redis.key.CacheKeys; import com.casic.missiles.modular.service.CockpitService; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.util.CollectionUtils; import org.springframework.web.bind.annotation.*; @@ -24,10 +25,7 @@ import java.text.NumberFormat; import java.time.LocalDateTime; import java.time.temporal.ChronoUnit; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.util.*; import java.util.stream.Collectors; /** @@ -73,6 +71,9 @@ private StatisticNumberMapper numberMapper; @Autowired + private HazardLevelMapper hazardLevelMapper; + + @Autowired private AccessGroupConfig accessGroupConfig; /** @@ -104,8 +105,24 @@ public Object buildingNumberPerHour(){ //当天按小时分组的人数 List list = numberMapper.selectListByTime(); - Map> collect = list.stream().collect(Collectors.groupingBy(BuildingNumberDTO::getStatisticPosition)); - return ResponseData.success(collect); + Map> collect = list.stream().collect(Collectors.groupingBy(BuildingNumberDTO::getStatisticTime)); + //定时任务中已将每小时三栋楼人数存到数据库 + //将一期主楼和录制楼人数合并,二期单算 + List> resultList = new ArrayList<>(); + collect.keySet().forEach(key -> { + List buildingNumberDTOS = collect.get(key); + BuildingNumberDTO mainBuildingOne = buildingNumberDTOS.get(0); + BuildingNumberDTO mainBuildingTwo = buildingNumberDTOS.get(1); + BuildingNumberDTO recordingBuilding = buildingNumberDTOS.get(2); + HashMap resultMap = new HashMap<>(); + Integer oneQuantity = Integer.valueOf(mainBuildingOne.getStatisticQuantity()); + Integer recordingQuantity = Integer.valueOf(recordingBuilding.getStatisticQuantity()); + resultMap.put("staticTime", mainBuildingOne.getStatisticTime()); + resultMap.put(mainBuildingOne.getStatisticPositionName()+"、"+recordingBuilding.getStatisticPositionName(), String.valueOf(oneQuantity+recordingQuantity)); + resultMap.put(mainBuildingTwo.getStatisticPositionName(), mainBuildingTwo.getStatisticQuantity()); + resultList.add(resultMap); + }); + return ResponseData.success(resultList); } /** @@ -151,12 +168,11 @@ public Object securityNumber() { QueryWrapper wrapper = new QueryWrapper<>(); wrapper.eq("staff_type", 2); + // TODO: 2022/9/2 后续使用产品确定的每天出勤的安保人员的数量 Integer total = staffInfoMapper.selectCount(wrapper); - //当日离岗事件个数 - QueryWrapper wrapper1 = new QueryWrapper<>(); - wrapper1.eq("hik_event_type", SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); - wrapper1.apply("date_format(now(),'%Y-%m-%d') = date_format(happen_time,'%Y-%m-%d')"); - Integer leave = caseInfoMapper.selectCount(wrapper1); + //当日离岗事件按设备去重后的个数 + // TODO: 2022/9/2 目前相当于24小时内的计算,之后看需要可改成自定义小时数计算离岗率,即离岗+6小时内仅一次离岗则恢复为100%,多次则累加离岗次数计算离岗率 + Integer leave = caseInfoMapper.selectDemobilizedCount(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); NumberFormat numberFormat = NumberFormat.getInstance(); // 设置精确到小数点后2位 numberFormat.setMaximumFractionDigits(2); @@ -179,7 +195,6 @@ @ResponseBody public Object visitorApplyDetail() { List reasonGroup = applyMapper.selectByVisitReason(); - HashMap resultMap = new HashMap<>(); NumberFormat numberFormat = NumberFormat.getInstance(); // 设置精确到小数点后2位 numberFormat.setMaximumFractionDigits(2); @@ -187,12 +202,17 @@ if(0 == sum){ return ResponseData.success(); } + List resultList = new ArrayList<>(); reasonGroup.forEach(group -> { String reasonName = dictService.getDictNameByCode(SecurityEventDict.VISIT_REASON, group.getVisitReason()); String result = numberFormat.format((float) group.getQuantity() / (float) sum * 100); - resultMap.put(reasonName, result+"%"); + ApplyReasonGroupDTO applyReasonGroupDTO = new ApplyReasonGroupDTO(); + applyReasonGroupDTO.setQuantity(group.getQuantity()); + applyReasonGroupDTO.setVisitReason(reasonName); + applyReasonGroupDTO.setRatio(result+"%"); + resultList.add(applyReasonGroupDTO); }); - return ResponseData.success(resultMap); + return ResponseData.success(resultList); } /** @@ -247,6 +267,32 @@ } /** + * 机动力量实时在岗率,在岗人数除以总应在岗人数,用离岗+6小时内恢复为100%,6小时外再计算 + */ + @GetMapping("/staff/beOnDutyRatio") + @ResponseBody + public Object beOnDutyRatio() { + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("staff_type", 2); + // TODO: 2022/9/2 后续使用产品确定的每天出勤的安保人员的数量 + Integer total = staffInfoMapper.selectCount(wrapper); + if(0 == total){ + return ResponseData.success(null); + } + //当日离岗事件按设备去重后的个数 + // TODO: 2022/9/2 目前相当于24小时内的计算,之后看需要可改成自定义小时数计算离岗率,即离岗+6小时内仅一次离岗则恢复为100%,多次则累加离岗次数计算离岗率 + List onDutyRatioDTOS = caseInfoMapper.selectDemobilizedCountByHour(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); + onDutyRatioDTOS.forEach(dto -> { + NumberFormat numberFormat = NumberFormat.getInstance(); + // 设置精确到小数点后2位 + numberFormat.setMaximumFractionDigits(2); + String result = numberFormat.format(100 - Float.valueOf(dto.getQuantity()) / (float) total * 100); + dto.setRatio(result+"%"); + }); + return ResponseData.success(onDutyRatioDTOS); + } + + /** * 闸机速通门统计-设备状态分组计算数量,devType传闸机字典key * 视频频监控摄像机统计-设备状态分组计算数量,devType传摄像头字典key */ @@ -262,12 +308,17 @@ if(sum <= 0){ return ResponseData.error("无该类设备信息"); } + List resultList = new ArrayList<>(); gateStatusGroup.forEach(group -> { String devStatus = dictService.getDictNameByCode(SecurityEventDict.DEVICE_STATUS, group.getStatus()); String result = numberFormat.format((float) group.getQuantity() / (float) sum * 100); - resultMap.put(devStatus, result+"%"); + GateStatusGroupResponse gateStatusGroupResponse = new GateStatusGroupResponse(); + gateStatusGroupResponse.setStatus(devStatus); + gateStatusGroupResponse.setRatio(result+"%"); + resultList.add(gateStatusGroupResponse); }); - resultMap.put("总", sum); + resultMap.put("total", sum); + resultMap.put("list", resultList); return ResponseData.success(resultMap); } @@ -282,17 +333,38 @@ String position = securityScoreDTO.getPosition(); List caseInfos = caseInfoMapper.selectByPosition(position); //查询各危险级别权重、各类别权重,放入map,避免循环中多次查数据库 - + HashMap hazardScoreMap = new HashMap<>(); + List caseHazardLevelList = hazardLevelMapper.getCaseHazardLevelList(null); + caseHazardLevelList.forEach(hazardLevel -> { + hazardScoreMap.put(hazardLevel.getCode(), hazardLevel.getWeight()); + }); + HashMap categoryScoreMap = new HashMap<>(); + List categoryLevelList = categoryLevelMapper.getCaseCategoryLevelList(null); + categoryLevelList.forEach(categoryLevel -> { + categoryScoreMap.put(categoryLevel.getCode(), categoryLevel.getWeight()); + }); + //事件按楼层分组,计算 List securityScoreDTOs = new ArrayList<>(); caseInfos.forEach(caseInfo -> { SecurityScoreDTO securityScoreDTO1 = new SecurityScoreDTO(); + securityScoreDTO1.setPosition(caseInfo.getPosition()); securityScoreDTO1.setArea(caseInfo.getArea()); - // TODO: 2022/8/4 楼层评分计算根据产品定义调整 -// caseInfo.get -// securityScoreDTO1.setScore(); + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); + Double score = 100 - Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + securityScoreDTO1.setScore(score); + securityScoreDTOs.add(securityScoreDTO1); }); - - return null; + 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); + }); + return ResponseData.success(securityScoreDTOs); } /** @@ -303,9 +375,13 @@ public Object SecurityFrequency(@RequestBody SecurityFrequencyDTO securityFrequencyDTO) { String year = securityFrequencyDTO.getYear(); String month = securityFrequencyDTO.getMonth(); - Integer quantity = caseInfoMapper.selectCountByMonth(year, month); - securityFrequencyDTO.setQuantity(quantity); - return ResponseData.success(securityFrequencyDTO); + if(!StringUtils.isEmpty(year) && StringUtils.isEmpty(month)){ + Integer quantity = caseInfoMapper.selectCountByMonth(year, month); + securityFrequencyDTO.setQuantity(quantity); + return ResponseData.success(securityFrequencyDTO); + } + List list = caseInfoMapper.selectPreMonthCount(); + return ResponseData.success(list); } } 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 ae4d770..f4f075c 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 @@ -1,20 +1,25 @@ package com.casic.missiles.modular.controller.cockpit; +import cn.hutool.core.date.DateUnit; import cn.hutool.core.date.DateUtil; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.casic.missiles.model.response.ResponseData; -import com.casic.missiles.modular.dao.AttendanceInfoMapper; -import com.casic.missiles.modular.dao.CaseInfoMapper; -import com.casic.missiles.modular.dao.HazardLevelMapper; -import com.casic.missiles.modular.dao.StaffInfoMapper; +import com.casic.missiles.modular.dao.*; +import com.casic.missiles.modular.dto.DeviceRepairLogDTO; +import com.casic.missiles.modular.dto.DeviceRepairRequest; import com.casic.missiles.modular.dto.statistics.*; +import com.casic.missiles.modular.enums.SecurityEventType; +import com.casic.missiles.modular.model.CaseCategoryLevel; import com.casic.missiles.modular.model.CaseHazardLevel; +import com.casic.missiles.modular.model.CaseInfo; import com.casic.missiles.modular.model.StaffInfo; +import com.casic.missiles.modular.service.DeviceInfoService; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.util.CollectionUtils; import org.springframework.web.bind.annotation.*; +import java.math.BigDecimal; import java.text.NumberFormat; import java.util.*; import java.util.stream.Collectors; @@ -40,6 +45,12 @@ @Autowired private HazardLevelMapper hazardLevelMapper; + @Autowired + private CategoryLevelMapper categoryLevelMapper; + + @Autowired + private DeviceInfoService deviceInfoService; + /** * 安防事件时域频次统计,每月的每天安防事件个数(原方案) * 月维度:展示每个月的每天的数据 @@ -89,15 +100,17 @@ List monthList = caseInfoMapper.selectPreMonthCountByYear(year); Map> collect = monthList.stream().collect(Collectors.groupingBy(PreMonthOrWeekCaseDTO::getHazardLevelCode)); HashMap strAvgMap = new HashMap<>(); + List resultList = new ArrayList<>(); for (String key : collect.keySet()) { List preMonthOrWeekCaseDTOS = collect.get(key); int sum = preMonthOrWeekCaseDTOS.stream().mapToInt(PreMonthOrWeekCaseDTO::getQuantity).sum(); //若年份是本年,则使用个安防级别数量/当前月份数 //若不是本年,除数为12 MonthAndWeekDTO monthAndWeekDTO = new MonthAndWeekDTO(); + String hazardName = hazardLevelMapper.selectHazardNameByCode(key); + monthAndWeekDTO.setLevelName(hazardName); if(year.equals(String.valueOf(DateUtil.thisYear()))){ monthAndWeekDTO.setMonthQuantity(sum / DateUtil.thisMonth()); -// monthAndWeekDTO.setLevelName(); strAvgMap.put(key, monthAndWeekDTO); }else{ monthAndWeekDTO.setMonthQuantity(sum / 12); @@ -113,27 +126,37 @@ if(year.equals(String.valueOf(DateUtil.thisYear()))){ if(!Objects.isNull(strAvgMap.get(key))){ MonthAndWeekDTO monthAndWeekDTO = strAvgMap.get(key); + String hazardName = hazardLevelMapper.selectHazardNameByCode(key); + monthAndWeekDTO.setLevelName(hazardName); monthAndWeekDTO.setWeekQuantity(sum / DateUtil.thisWeekOfYear()); strAvgMap.put(key, monthAndWeekDTO); }else{ MonthAndWeekDTO monthAndWeekDTO = new MonthAndWeekDTO(); + String hazardName = hazardLevelMapper.selectHazardNameByCode(key); + monthAndWeekDTO.setLevelName(hazardName); monthAndWeekDTO.setWeekQuantity(sum / DateUtil.thisWeekOfYear()); strAvgMap.put(key, monthAndWeekDTO); } }else{ if(!Objects.isNull(strAvgMap.get(key))){ MonthAndWeekDTO monthAndWeekDTO = strAvgMap.get(key); + String hazardName = hazardLevelMapper.selectHazardNameByCode(key); + monthAndWeekDTO.setLevelName(hazardName); monthAndWeekDTO.setWeekQuantity(sum / 52); strAvgMap.put(key, monthAndWeekDTO); }else{ MonthAndWeekDTO monthAndWeekDTO = new MonthAndWeekDTO(); + String hazardName = hazardLevelMapper.selectHazardNameByCode(key); + monthAndWeekDTO.setLevelName(hazardName); monthAndWeekDTO.setWeekQuantity(sum / 52); strAvgMap.put(key, monthAndWeekDTO); } } } - avgMonthAndWeekGroupDTO.setMap(strAvgMap); - return ResponseData.success(avgMonthAndWeekGroupDTO); + strAvgMap.keySet().forEach(key -> { + resultList.add(strAvgMap.get(key)); + }); + return ResponseData.success(resultList); } /** @@ -181,12 +204,178 @@ } /** - * 员工考勤人数变化,功能待定 + * 员工考勤人数变化,统计当天(横坐标为时)及近7天(横坐标为天)的考勤人数变化,只要发生一次考勤识别,次数的基数就正常增加(没有上班下班区分) */ + @PostMapping("/staff/attendanceNumber/{dimension}") + @ResponseBody + public Object attendanceNumber(@PathVariable("dimension") String dimension) { + List attendanceNumberDTOs = null; + List> resultList = new ArrayList<>(); + if("week".equals(dimension)){ + //近7天数据按天分组统计 + attendanceNumberDTOs = attendanceInfoMapper.getCountForWeek(); + }else if("day".equals(dimension)) { + //今天数据按小时分组统计 + attendanceNumberDTOs = attendanceInfoMapper.getCountForDay(); + } + if(CollectionUtils.isEmpty(attendanceNumberDTOs)){ + return ResponseData.error("该查询条件下,无员工出勤数据!"); + } + Map> collect = attendanceNumberDTOs.stream().collect(Collectors.groupingBy(AttendanceNumberDTO::getDate)); + collect.keySet().forEach(key -> { + List attendanceNumberDTOS = collect.get(key); + AttendanceNumberDTO attendanceNumberDTO = attendanceNumberDTOS.get(0); + AttendanceNumberDTO attendanceNumberDTO2 = attendanceNumberDTOS.get(1); + Map resultMap = new HashMap<>(); + resultMap.put(attendanceNumberDTO.getStaffType(), attendanceNumberDTO.getQuantity()); + resultMap.put(attendanceNumberDTO2.getStaffType(), attendanceNumberDTO2.getQuantity()); + resultMap.put("staticTime", attendanceNumberDTO.getDate()); + resultList.add(resultMap); + }); + return ResponseData.success(resultList); + } /** - * 近30天/近一周安保人员到岗排行 + * 早晚高峰区域安防评估 */ + @PostMapping("/security/assessment/{dimension}") + @ResponseBody + public Object securityAssessment(@PathVariable("dimension") String dimension) { + //查询各危险级别权重、各类别权重,放入map,避免循环中多次查数据库 + HashMap hazardScoreMap = new HashMap<>(); + List caseHazardLevelList = hazardLevelMapper.getCaseHazardLevelList(null); + caseHazardLevelList.forEach(hazardLevel -> { + hazardScoreMap.put(hazardLevel.getCode(), hazardLevel.getWeight()); + }); + HashMap categoryScoreMap = new HashMap<>(); + List categoryLevelList = categoryLevelMapper.getCaseCategoryLevelList(null); + categoryLevelList.forEach(categoryLevel -> { + categoryScoreMap.put(categoryLevel.getCode(), categoryLevel.getWeight()); + }); + HashMap hashMap = new HashMap<>(); + if("week".equals(dimension)){ + //近7天早晚高峰数据 + List caseInfos = caseInfoMapper.selectListBySevenDay(); + //按时间(天)进行分组 + caseInfos.forEach(caseInfo -> { + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); + Double score = Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + String[] array = caseInfo.getHappenTime().split(" "); + String dayTime = array[0]; + BigDecimal preScore; + if(hashMap.containsKey(dayTime)){ + Double aDouble = hashMap.get(dayTime); + preScore = new BigDecimal(aDouble.toString()); + + }else{ + preScore = new BigDecimal("100.0"); + } + BigDecimal nowScore = new BigDecimal(score.toString()); + hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); + }); + return ResponseData.success(hashMap); + }else if("day".equals(dimension)) { + //今天数据按小时分组统计 + List caseInfos = caseInfoMapper.selectListByToday(); + caseInfos.forEach(caseInfo -> { + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); + Double score = Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + String[] array = caseInfo.getHappenTime().split(":"); + String dayTime = array[0]; + BigDecimal preScore; + if(hashMap.containsKey(dayTime)){ + Double aDouble = hashMap.get(dayTime); + preScore = new BigDecimal(aDouble.toString()); + + }else{ + preScore = new BigDecimal("100.0"); + } + BigDecimal nowScore = new BigDecimal(score.toString()); + hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); + }); + return ResponseData.success(hashMap); + } + return null; + } + + /** + * 重点区域安防事态评估,统计重点区域6:00-23:00按小时分组数据 + */ + @GetMapping("/security/keyAreaStatistic") + @ResponseBody + public Object keyAreaStatistic() { + //查询各危险级别权重、各类别权重,放入map,避免循环中多次查数据库 + HashMap hazardScoreMap = new HashMap<>(); + List caseHazardLevelList = hazardLevelMapper.getCaseHazardLevelList(null); + caseHazardLevelList.forEach(hazardLevel -> { + hazardScoreMap.put(hazardLevel.getCode(), hazardLevel.getWeight()); + }); + HashMap categoryScoreMap = new HashMap<>(); + List categoryLevelList = categoryLevelMapper.getCaseCategoryLevelList(null); + categoryLevelList.forEach(categoryLevel -> { + categoryScoreMap.put(categoryLevel.getCode(), categoryLevel.getWeight()); + }); + HashMap hashMap = new HashMap<>(); + //今天数据按小时分组统计 + List caseInfos = caseInfoMapper.selectListByToday2(); + caseInfos.forEach(caseInfo -> { + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); + Double score = Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + String[] array = caseInfo.getHappenTime().split(":"); + String dayTime = array[0]; + BigDecimal preScore; + if(hashMap.containsKey(dayTime)){ + Double aDouble = hashMap.get(dayTime); + preScore = new BigDecimal(aDouble.toString()); + + }else{ + preScore = new BigDecimal("100.0"); + } + BigDecimal nowScore = new BigDecimal(score.toString()); + hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); + }); + return ResponseData.success(hashMap); + } + + /** + * 安防机动支援力量调配响应评估,根据事件已解决状态及已解决时间-发送时间,按时间(小时)分组统计 + */ + @GetMapping("/security/responseAssess") + @ResponseBody + public Object responseAssess() { + //查询各危险级别权重、各类别权重,放入map,避免循环中多次查数据库 + HashMap hazardScoreMap = new HashMap<>(); + List caseHazardLevelList = hazardLevelMapper.getCaseHazardLevelList(null); + caseHazardLevelList.forEach(hazardLevel -> { + hazardScoreMap.put(hazardLevel.getCode(), hazardLevel.getWeight()); + }); + HashMap hashMap = new HashMap<>(); + //今天数据按小时分组统计 + List caseInfos = caseInfoMapper.selectListByToday3(); + caseInfos.forEach(caseInfo -> { + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + //扣分=事件级别权重*未解决小时数 + Date updateTime = DateUtil.parse(caseInfo.getUpdateTime()); + Date happenTime = DateUtil.parse(caseInfo.getHappenTime()); + long between = DateUtil.between(updateTime, happenTime, DateUnit.HOUR); + Double score = Double.valueOf(hazardWeight)*between; + String[] array = caseInfo.getHappenTime().split(":"); + String dayTime = array[0]; + BigDecimal preScore; + if(hashMap.containsKey(dayTime)){ + Double aDouble = hashMap.get(dayTime); + preScore = new BigDecimal(aDouble.toString()); + }else{ + preScore = new BigDecimal("100.0"); + } + BigDecimal nowScore = new BigDecimal(score.toString()); + hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); + }); + return ResponseData.success(hashMap); + } /** * 重点区域威胁事件类型统计,优先级2,统计近7天和近30天 @@ -224,7 +413,34 @@ } /** - * 设备状态计算系数和评判,优先级3,需确认设备恢复时间是否可以获取 + * 近30天/近一周安保人员到岗排行 */ + + /** + * 安保等级评估,发生离岗事件减1分 + */ + @GetMapping("/security/levelAssess") + @ResponseBody + public Object securityLevelAssess() { + //今天数据按小时分组统计 + List resultList = caseInfoMapper.selectListByType(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); + resultList.forEach(result -> { + BigDecimal deScore = new BigDecimal(result.getQuantity()); + BigDecimal preScore = new BigDecimal("100.0"); + result.setScore(preScore.subtract(deScore).doubleValue()); + }); + return ResponseData.success(resultList); + } + + /** + * 设备状态计算系数和评判,即设备维修管理查询(不分页) + */ + @PostMapping("/device/repairList") + @ResponseBody + public Object repairList(@RequestBody DeviceRepairRequest deviceRepairRequest) { + List deviceRepairLogDTOS = deviceInfoService.deviceRepairListPage(deviceRepairRequest); + return ResponseData.success(deviceRepairLogDTOS); + } + } 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 fbf8ab6..c71a15a 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 @@ -1,13 +1,12 @@ package com.casic.missiles.modular.controller.hik; +import cn.hutool.core.date.DateTime; +import cn.hutool.core.date.DateUtil; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.casic.missiles.model.response.ResponseData; import com.casic.missiles.modular.dao.HikFaceGroupInfoMapper; -import com.casic.missiles.modular.dto.hik.EventSubscribeRequest; -import com.casic.missiles.modular.dto.hik.FaceGroupAdditionRequest; -import com.casic.missiles.modular.dto.hik.HikRecvEvent; -import com.casic.missiles.modular.dto.hik.OrgBatchAdd; +import com.casic.missiles.modular.dto.hik.*; import com.casic.missiles.modular.enums.HikUri; import com.casic.missiles.modular.enums.SecurityEventType; import com.casic.missiles.modular.model.CaseInfo; @@ -18,16 +17,20 @@ import com.casic.missiles.modular.util.CaseInfoFactoryUtil; import com.casic.missiles.modular.util.HikUtil; import com.casic.missiles.modular.util.ThreadPoolUtil; +import com.casic.missiles.modular.util.WebSocket; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; -import org.springframework.web.bind.annotation.*; +import org.springframework.util.CollectionUtils; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.RestController; -import java.net.InetAddress; -import java.net.UnknownHostException; import java.util.ArrayList; +import java.util.Iterator; import java.util.List; import java.util.Objects; @@ -38,7 +41,6 @@ */ @Slf4j @RestController -@RequestMapping("/hik") public class HikController { @Autowired @@ -53,28 +55,37 @@ @Autowired private HikService hikService; + @Autowired + private HikFaceGroupInfoMapper hikFaceGroupInfoMapper; + + @Autowired + private WebSocket webSocket; + @Value("${server.port}") private int serverPort; - @Autowired - private HikFaceGroupInfoMapper hikFaceGroupInfoMapper; /** * 海康事件订阅 */ - @PostMapping("/event/subscribe") + @PostMapping("/hik/event/subscribe") @ResponseBody - public Object eventSubscribe() throws UnknownHostException { + public Object eventSubscribe() { EventSubscribeRequest eventSubscribeRequest = new EventSubscribeRequest(); ArrayList list = new ArrayList<>(); list.add(SecurityEventType.DEVICE_OFFLINE); + list.add(SecurityEventType.DEVICE_ONLINE); list.add(SecurityEventType.KEY_PERSONNEL_IDENTIFY_EVENT); list.add(SecurityEventType.MONITORING_POINT_OFFLINE); + list.add(SecurityEventType.MONITORING_POINT_ONLINE); list.add(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); list.add(SecurityEventType.PERSONNEL_GATHER_EVENT); - InetAddress localHost = InetAddress.getLocalHost(); + list.add(SecurityEventType.VISITOR_REGISTER); + list.add(SecurityEventType.VISITOR_CHECKOUT); + list.add(SecurityEventType.HIGH_ALTITUDE_PARABOLIC); +// InetAddress localHost = InetAddress.getLocalHost(); eventSubscribeRequest.setEventTypes(list); - eventSubscribeRequest.setEventDest("https://" + localHost + ":" + serverPort + "/eventRcv"); + eventSubscribeRequest.setEventDest("http://" + "192.168.10.6" + ":" + serverPort + "/eventRcv"); //订阅类型,0-订阅原始事件,1-联动事件,2-原始事件和联动事件,不填使用默认值0 eventSubscribeRequest.setSubType(0); /** @@ -92,19 +103,25 @@ } /** + * 查询事件订阅信息 + */ + @PostMapping("/hik/event/query") + @ResponseBody + public Object eventQuery() { + String result = HikUtil.hikApi(HikUri.EVENT_INFO, ""); + return result; + } + + /** * 海康事件接收 */ @PostMapping("/eventRcv") @ResponseBody public Object eventRcv(@RequestBody HikRecvEvent hikRecvEvent) { //1、接收所需事件类型 - Long eventType = hikRecvEvent.getEventType(); + Number eventType = hikRecvEvent.getEventType(); log.info("接收到安防事件类型为:{}", eventType); CaseInfo caseInfo = caseInfoFactoryUtil.getCaseInfo(eventType); - //接收到不关心事件直接返回 - if(Objects.isNull(caseInfo)){ - return ResponseData.success(); - } //2、不同事件不同处理,caseInfoFactoryUtil已设置好事件基础定义信息 // 再为事件添加状态、设备编码、设备名称、位置、区域、时间 // 异步处理事件 @@ -114,19 +131,23 @@ caseHandle(hikRecvEvent, eventType, caseInfo); } })); +// caseHandle(hikRecvEvent, eventType, caseInfo); - return null; + return ResponseData.success(); } - private void caseHandle(HikRecvEvent hikRecvEvent, Long eventType, CaseInfo caseInfo) { + private void caseHandle(HikRecvEvent hikRecvEvent, Number eventType, CaseInfo caseInfo) { JSONArray eventArray = hikRecvEvent.getEventArray(); List caseInfos = new ArrayList<>(); - while (eventArray.stream().iterator().hasNext()) { + Iterator iterator = eventArray.iterator(); + while (iterator.hasNext()) { CaseInfo caseInfo1 = new CaseInfo(); - BeanUtils.copyProperties(caseInfo, caseInfo1); - JSONObject event = (JSONObject) eventArray.stream().iterator().next(); + if(!Objects.isNull(caseInfo)){ + BeanUtils.copyProperties(caseInfo, caseInfo1); + } + JSONObject event = (JSONObject) iterator.next(); //5种事件进行不同处理 - if(SecurityEventType.KEY_PERSONNEL_IDENTIFY_EVENT == eventType){ + if (SecurityEventType.KEY_PERSONNEL_IDENTIFY_EVENT.equals(eventType)) { //判断所属人脸分组 JSONObject data = (JSONObject) event.get("data"); JSONObject faceRecognitionResult = (JSONObject) data.get("faceRecognitionResult"); @@ -142,52 +163,101 @@ if (faceGroupCode.equals(blackListGroup.getFaceGroupCode())) { //黑名单分组处理 caseInfo1 = hikService.blackListHandle(event, caseInfo1); - }else if(faceGroupCode.equals(propertyPersonnelGroup.getFaceGroupCode())){ + } else if (faceGroupCode.equals(propertyPersonnelGroup.getFaceGroupCode())) { //考勤分组处理-物业人员,添加到考勤表 hikService.propertyAttendanceHandle(event); - }else if(faceGroupCode.equals(securityPersonnelGroup.getFaceGroupCode())){ + } else if (faceGroupCode.equals(securityPersonnelGroup.getFaceGroupCode())) { //考勤分组处理-安保人员,添加到考勤表 hikService.securityPersonnelHandle(event); - }else { + } else { return; } - }else if(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT == eventType){ + } else if (SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT.equals(eventType)) { //离岗事件处理 caseInfo1 = hikService.demobilizedHandle(event, caseInfo1); - }else if(SecurityEventType.PERSONNEL_GATHER_EVENT == eventType){ + } else if (SecurityEventType.PERSONNEL_GATHER_EVENT.equals(eventType)) { //人员聚集事件处理 caseInfo1 = hikService.personGatherHandle(event, caseInfo1); - }else if(SecurityEventType.MONITORING_POINT_OFFLINE == eventType){ + } else if (SecurityEventType.MONITORING_POINT_OFFLINE.equals(eventType)) { //监控点离线事件处理 caseInfo1 = hikService.monitorPointOfflineHandle(event, caseInfo1); - }else if(SecurityEventType.DEVICE_OFFLINE == eventType){ + } else if (SecurityEventType.MONITORING_POINT_ONLINE.equals(eventType)) { + //监控点上线事件处理 + hikService.monitorPointOnlineHandle(event); + } else if (SecurityEventType.DEVICE_OFFLINE.equals(eventType)) { //装置离线事件处理 caseInfo1 = hikService.deviceOfflineHandle(event, caseInfo1); - }else if(SecurityEventType.VISITOR_REGISTER == eventType){ + } else if (SecurityEventType.DEVICE_ONLINE.equals(eventType)) { + //装置上线处理 + hikService.deviceOnlineHandle(event); + } else if (SecurityEventType.VISITOR_REGISTER.equals(eventType)) { //记录访客登记记录,添加到访客记录表 hikService.visitorRegisterHandler(event); - }else if(SecurityEventType.VISITOR_CHECKOUT == eventType){ + } else if (SecurityEventType.VISITOR_CHECKOUT.equals(eventType)) { //记录访客签离记录 hikService.visitorCheckOutHandler(event); } - if(!Objects.isNull(caseInfo1) && !StringUtils.isEmpty(caseInfo1.getHappenTime())){ + if (!Objects.isNull(caseInfo1) && !StringUtils.isEmpty(caseInfo1.getHappenTime())) { caseInfos.add(caseInfo1); } } //3、安防事件入库 - if(!caseInfoService.insertCaseInfoBatch(caseInfos)){ - log.error("安防事件批量入库异常"); + if (!CollectionUtils.isEmpty(caseInfos) && !caseInfoService.insertCaseInfoBatch(caseInfos)) { + log.error("安防事件批量入库异常!"); } // TODO: 2022/8/15 webSocket推送 + if (CollectionUtils.isEmpty(caseInfos)) { + log.info("webSocket事件推送"); + webSocket.sendAllMessage(JSONObject.toJSONString(caseInfos)); + } return; } /** + * 以图搜图,前端用于轨迹追踪 + */ + @PostMapping("/hik/search/picture") + @ResponseBody + public Object searchPictures(@RequestBody SearchPicturesRequest searchPicturesRequest) { + DateTime startDateTime = DateUtil.parse(searchPicturesRequest.getStartTime()); + DateTime endDateTime = DateUtil.parse(searchPicturesRequest.getEndTime()); + String startTime = DateUtil.format(startDateTime, "yyyy-MM-dd'T'HH:mm:ss.SSSXXX"); + String endTime = DateUtil.format(endDateTime, "yyyy-MM-dd'T'HH:mm:ss.SSSXXX"); + searchPicturesRequest.setStartTime(startTime); + searchPicturesRequest.setEndTime(endTime); + String body = JSONObject.toJSONString(searchPicturesRequest); + String resultStr = HikUtil.hikApi(HikUri.SEARCH_PICTURES, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (!"0".equals(resultJson.get("code"))) { + log.error("请求海康,以图搜图失败,海康response:{}", resultStr); + return ResponseData.error("以图搜图失败"); + } + return ResponseData.success(resultJson); + } + + + /** + * 海康事件取消订阅 + */ + @PostMapping("/hik/event/cancel") + @ResponseBody + public Object eventCancelSubscribe(@RequestBody CancelSubscribeRequest cancelSubscribeRequest) { + String body = JSONObject.toJSONString(cancelSubscribeRequest); + String resultStr = HikUtil.hikApi(HikUri.EVENT_CANCEL, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (!"0".equals(resultJson.get("code"))) { + log.error("请求海康,取消订阅失败,海康response:{}", resultStr); + return ResponseData.error("取消订阅失败"); + } + return ResponseData.success(resultJson); + } + + /** * 单个添加海康人脸分组 * api->hik单个添加人脸分组api->response->mysql */ - @PostMapping("/faceGroup/single/add") + @PostMapping("/hik/faceGroup/single/add") @ResponseBody public Object faceGroupAddition(@RequestBody FaceGroupAdditionRequest faceGroupAdditionRequest) { String body = JSONObject.toJSONString(faceGroupAdditionRequest); @@ -212,7 +282,7 @@ * 批量添加海康组织 * api->hik批量添加组织api->response */ - @PostMapping("/org/batch/add") + @PostMapping("/hik/org/batch/add") @ResponseBody public Object orgBatchAdd(@RequestBody List orgBatchAddRequest) { String body = JSONObject.toJSONString(orgBatchAddRequest); @@ -232,4 +302,62 @@ return ResponseData.error("批量添加组织失败"); } + /** + * 获取人员列表 + */ + @PostMapping("/hik/person/personList") + @ResponseBody + public Object personList() { + PersonListRequest request = new PersonListRequest(); + request.setPageNo(1); + request.setPageSize(100); + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi("/api/resource/v2/person/personList", body); + return resultStr; + } + + /** + * 获取组织列表 + */ + @PostMapping("/hik/org/orgList") + @ResponseBody + public Object orgList() { + PersonListRequest request = new PersonListRequest(); + request.setPageNo(1); + request.setPageSize(100); + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi("/api/resource/v1/org/orgList", body); + return resultStr; + } + + /** + * 查询访客权限下载记录 + */ + @PostMapping("/hik/auth/result") + @ResponseBody + public Object authResult() { + PersonListRequest request = new PersonListRequest(); + request.setPageNo(1); + request.setPageSize(100); + request.setOrderId("ba101db6246711edaea66f7939a13638"); + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi("/api/visitor/v1/auth/result", body); + return resultStr; + } + + /** + * 人脸图片获取 + */ + @PostMapping("/hik/face/picture") + @ResponseBody + public Object facePicture() { + FaceRequest request = new FaceRequest(); +// List list = new ArrayList<>(); +// list.add(""); + request.setCertificateNum("wanggong"); + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi("/api/frs/v1/face", body); + return resultStr; + } + } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/AssetInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/AssetInfoMapper.java index 4f64e83..c0684ee 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/AssetInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/AssetInfoMapper.java @@ -17,6 +17,6 @@ @Mapper public interface AssetInfoMapper extends BaseMapper { - List getAssetInfoListPage(@Param("page") Page page, AssetInfoRequest assetInfoRequest); + List getAssetInfoListPage(@Param("page") Page page, @Param("assetInfoRequest") AssetInfoRequest assetInfoRequest); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/AttendanceInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/AttendanceInfoMapper.java index f9e793e..ec87e46 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/AttendanceInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/AttendanceInfoMapper.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.statistics.AttendanceNumberDTO; import com.casic.missiles.modular.dto.statistics.AttendanceRatioDTO; import com.casic.missiles.modular.model.AttendanceInfo; import org.apache.ibatis.annotations.Mapper; @@ -17,7 +18,7 @@ */ @Mapper public interface AttendanceInfoMapper extends BaseMapper { - List getAttendanceInfoListPage(@Param("page") Page page, StaffInfoRequest attendanceInfoRequest); + List getAttendanceInfoListPage(@Param("page") Page page, @Param("attendanceInfoRequest") StaffInfoRequest attendanceInfoRequest); AttendanceInfo selectByCodeAndDate(@Param("staffCode") String staffCode); @@ -26,4 +27,8 @@ List getCountByTypeAndDateForMonth(@Param("staffType")String staffType); List getCountByTypeAndDateForYear(@Param("staffType")String staffType); + + List getCountForWeek(); + + List getCountForDay(); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java index ce94b8f..6137a7d 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java @@ -17,5 +17,5 @@ @Mapper public interface BlackInfoMapper extends BaseMapper { - List getBlackInfoListPage(@Param("page") Page page, BlackInfoRequest blackInfoRequest); + List getBlackInfoListPage(@Param("page") Page page, @Param("blackInfoRequest") BlackInfoRequest blackInfoRequest); } 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 efda6b3..50aaa6f 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 @@ -20,7 +20,7 @@ List getCaseInfoListPage(@Param("page") Page page, @Param("caseInfoRequest") CaseInfoRequest caseInfoRequest); - int updateStatusById(CaseInfoRequest caseInfoRequest); + int updateStatusById(@Param("caseInfoRequest") CaseInfoRequest caseInfoRequest); List selectByLevelAndMonth(@Param("year") String year); @@ -47,4 +47,20 @@ List selectPreWeekCountByThirtyDay(); List selectPreDayCountBySevenDay(); + + Integer selectDemobilizedCount(@Param("eventType") Number personnelDemobilizedEvent); + + List selectPreMonthCount(); + + List selectListBySevenDay(); + + List selectListByToday(); + + List selectListByToday2(); + + List selectListByToday3(); + + List selectListByType(@Param("eventType") Number eventType); + + List selectDemobilizedCountByHour(@Param("eventType") Number eventType); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/CategoryLevelMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/CategoryLevelMapper.java index 52fc714..afe1650 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/CategoryLevelMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/CategoryLevelMapper.java @@ -17,9 +17,9 @@ @Mapper public interface CategoryLevelMapper extends BaseMapper { - List getCaseCategoryLevelListPage(@Param("page") Page page, CategoryLevelRequest categoryLevelRequest); + List getCaseCategoryLevelListPage(@Param("page") Page page, @Param("categoryLevelRequest") CategoryLevelRequest categoryLevelRequest); - List getCaseCategoryLevelList(CategoryLevelRequest categoryLevelRequest); + List getCaseCategoryLevelList(@Param("categoryLevelRequest") CategoryLevelRequest categoryLevelRequest); CaseCategoryLevel getCaseCategoryLevel(@Param("categoryLevelCode") String categoryLevelCode); 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 66353b1..2555a09 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 @@ -19,7 +19,7 @@ @Mapper public interface DeviceInfoMapper extends BaseMapper { - List getDeviceInfoListPage(@Param("page") Page page, DeviceInfoRequest deviceInfoRequest); + List getDeviceInfoListPage(@Param("page") Page page, @Param("deviceInfoRequest") DeviceInfoRequest deviceInfoRequest); List getDeviceInfoList(@Param("deviceInfoRequest") DeviceInfoRequest deviceInfoRequest); @@ -27,6 +27,8 @@ DeviceInfo getByIndexCode(@Param("srcIndex") String srcIndex); + DeviceInfo getByIp(@Param("ip") String ip); + List selectIndexCodesByCodes(@Param("deviceCodes") List deviceCodes); List selectByType(@Param("devType") String devType); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java index 41dd0af..5bfaf63 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java @@ -5,6 +5,7 @@ import com.casic.missiles.modular.dto.DeviceRepairRequest; import com.casic.missiles.modular.model.DeviceRepairLog; import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; import java.util.List; @@ -16,7 +17,7 @@ @Mapper public interface DeviceRepairLogMapper extends BaseMapper { - List getDeviceRepairListPage(Page page, DeviceRepairRequest deviceRepairRequest); + List getDeviceRepairListPage(@Param("page") Page page, @Param("deviceRepairRequest")DeviceRepairRequest deviceRepairRequest); - List getDeviceRepairList(DeviceRepairRequest deviceRepairRequest); + List getDeviceRepairList(@Param("deviceRepairRequest") DeviceRepairRequest deviceRepairRequest); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java index 9035c47..4823ac1 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java @@ -18,7 +18,7 @@ @Mapper public interface FireEquipInfoMapper extends BaseMapper { - List getFireEquipInfoListPage(@Param("page") Page page, FireEquipRequest fireEquipRequest); + List getFireEquipInfoListPage(@Param("page") Page page, @Param("fireEquipRequest") FireEquipRequest fireEquipRequest); FireEquipInfo getFireEquipInfo(@Param("equipCode") String equipCode); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/GateGroupMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/GateGroupMapper.java index d8c330d..977a427 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/GateGroupMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/GateGroupMapper.java @@ -17,7 +17,7 @@ */ @Mapper public interface GateGroupMapper extends BaseMapper { - List getGateGroupListPage(@Param("page") Page page, GateGroupRequest gateGroupRequest); + List getGateGroupListPage(@Param("page") Page page, @Param("gateGroupRequest") GateGroupRequest gateGroupRequest); GateGroup getGateGroupByName(@Param("groupName") String groupName); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/HazardLevelMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/HazardLevelMapper.java index 8957780..dcf47bb 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/HazardLevelMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/HazardLevelMapper.java @@ -17,11 +17,13 @@ @Mapper public interface HazardLevelMapper extends BaseMapper { - List getCaseHazardLevelListPage(@Param("page") Page page, HazardLevelRequest hazardLevelRequest); + List getCaseHazardLevelListPage(@Param("page") Page page, @Param("hazardLevelRequest") HazardLevelRequest hazardLevelRequest); - List getCaseHazardLevelList(HazardLevelRequest hazardLevelRequest); + List getCaseHazardLevelList(@Param("hazardLevelRequest") HazardLevelRequest hazardLevelRequest); CaseHazardLevel getCaseHazardLevel(@Param("hazardLevelCode") String hazardLevelCode); List selectHazardName(); + + String selectHazardNameByCode(@Param("hazardLevelCode") String hazardLevelCode); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/HikCaseDefineMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/HikCaseDefineMapper.java index 0dc47d1..f162fef 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/HikCaseDefineMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/HikCaseDefineMapper.java @@ -12,5 +12,5 @@ */ @Mapper public interface HikCaseDefineMapper extends BaseMapper { - HikCaseDefine getHikCaseDefine(@Param("caseTypeCode") Long caseTypeCode); + HikCaseDefine getHikCaseDefine(@Param("caseTypeCode") Number caseTypeCode); } 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 f8a674c..fe5afc2 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 @@ -17,11 +17,13 @@ @Mapper public interface StaffInfoMapper extends BaseMapper { - List getStaffInfoListPage(@Param("page") Page page, StaffInfoRequest staffInfoRequest); + List getStaffInfoListPage(@Param("page") Page page, @Param("staffInfoRequest") StaffInfoRequest staffInfoRequest); StaffInfo selectByCode(@Param("staffCode") String staffCode); - List getStaffInfoList(StaffInfoRequest staffInfoRequest); + List getStaffInfoList(@Param("staffInfoRequest") StaffInfoRequest staffInfoRequest); - List selectBatchCodes(List list); + List selectBatchCodes(@Param("list") List list); + + int updateByCodeForCard(@Param("staffCode") String staffCode, @Param("cardNo") String cardNo); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitInfoMapper.java index b1217c5..6c52542 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitInfoMapper.java @@ -16,7 +16,7 @@ */ @Mapper public interface VisitInfoMapper extends BaseMapper { - List getVisitInfoListPage(@Param("page") Page page, VisitorRequest visitorRequest); + List getVisitInfoListPage(@Param("page") Page page, @Param("visitorRequest") VisitorRequest visitorRequest); VisitInfo selectByOrderId(@Param("orderId") String orderId); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/BlackListController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/BlackListController.java index a27f9f8..0c06661 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/BlackListController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/BlackListController.java @@ -1,13 +1,18 @@ package com.casic.missiles.modular.controller; +import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.base.controller.ExportController; import com.casic.missiles.core.page.PageFactory; import com.casic.missiles.model.response.ResponseData; import com.casic.missiles.modular.dto.BlackInfoRequest; +import com.casic.missiles.modular.dto.BlackPictureRequest; +import com.casic.missiles.modular.dto.hik.PersonInfoRequest; +import com.casic.missiles.modular.enums.HikUri; import com.casic.missiles.modular.enums.OperateTypeEnum; import com.casic.missiles.modular.model.BlackInfo; import com.casic.missiles.modular.service.BlackInfoService; +import com.casic.missiles.modular.util.HikUtil; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; @@ -56,4 +61,22 @@ return null; } + /** + * 黑名单人员照片 + */ + @PostMapping("/personPicture") + @ResponseBody + public Object personPicture(@RequestBody BlackPictureRequest blackPictureRequest){ + //获取照片 + String picUri = blackPictureRequest.getPicUri(); + String serverIndexCode = blackPictureRequest.getServerIndexCode(); + PersonInfoRequest picRequest = new PersonInfoRequest(); + picRequest.setPicUri(picUri); + picRequest.setServerIndexCode(serverIndexCode); + String reBody = JSONObject.toJSONString(picRequest); + //重定向地址获取 + String url = HikUtil.hikApiFor302(HikUri.PERSON_PICTURE, reBody); + return ResponseData.success(url); + } + } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/DeviceController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/DeviceController.java index e1c4eba..666bbee 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/DeviceController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/DeviceController.java @@ -107,7 +107,7 @@ } /** - * 设备维修管理查询(分页),需计算MTTR=总维修时间/故障次数 + * 设备状态计算与评判/设备维修管理查询(分页),需计算MTTR=总维修时间/故障次数 */ @PostMapping("/repair/listPage") @ResponseBody @@ -211,7 +211,7 @@ //需根据设备编号获取到对应的门禁点唯一标识 doorControlRequest.setDoorIndexCodes(indexCodes); doorControlRequest.setControlType(Integer.valueOf(gateGroupDTO.getStatus())); - String body = JSONObject.toJSONString(deviceCodes); + String body = JSONObject.toJSONString(doorControlRequest); String resultStr = HikUtil.hikApi(HikUri.DOOR_CONTROL, body); JSONObject resultJson = (JSONObject)JSONObject.parse(resultStr); if (!"0".equals(resultJson.get("code"))) { diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/StaffController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/StaffController.java index b58ccab..704093c 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/StaffController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/StaffController.java @@ -2,15 +2,21 @@ import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.util.StrUtil; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.base.controller.ExportController; import com.casic.missiles.core.page.PageFactory; import com.casic.missiles.model.response.ErrorResponseData; import com.casic.missiles.model.response.ResponseData; import com.casic.missiles.modular.dto.StaffInfoRequest; +import com.casic.missiles.modular.dto.hik.PersonInfoRequest; +import com.casic.missiles.modular.dto.hik.StaffCardRequest; +import com.casic.missiles.modular.enums.HikUri; import com.casic.missiles.modular.enums.OperateTypeEnum; import com.casic.missiles.modular.model.StaffInfo; import com.casic.missiles.modular.service.StaffInfoService; +import com.casic.missiles.modular.util.HikUtil; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; @@ -110,4 +116,60 @@ } return ResponseData.success(); } + + /** + * 批量开卡,添加人员之后调用,若在一个接口中添加人员成功开卡失败则第二次添加时会有问题 + */ + @PostMapping("/cardBinding") + @ResponseBody + public Object cardBinding(@RequestBody StaffCardRequest staffCardRequest) { + String body = JSONObject.toJSONString(staffCardRequest); + String resultStr = HikUtil.hikApi(HikUri.CARD_BINDING, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (!"0".equals(resultJson.get("code"))) { + log.error("请求海康,批量开卡失败,海康response:{}", resultStr); + return ResponseData.error("批量开卡失败"); + } + //保存卡号 + if(staffInfoService.saveCardInfo(staffCardRequest) > 0){ + return ResponseData.success(); + } + return ResponseData.error("批量开卡失败"); + } + + /** + * 获取员工照片,海康存储 + */ + @PostMapping("/personPicture/{staffCode}") + @ResponseBody + public Object personPicture(@PathVariable("staffCode") String staffCode){ + //获取员工详细信息,含图片服务器、uri + PersonInfoRequest request = new PersonInfoRequest(); + List list = new ArrayList<>(); + list.add(staffCode); + request.setParamName("personId"); + request.setParamValue(list); + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi(HikUri.PERSON_INFO, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (!"0".equals(resultJson.get("code"))) { + log.error("请求海康,根据人员唯一字段获取人员详细信息失败,海康response:{}", resultStr); + return ResponseData.error("获取员工照片失败"); + } + //获取照片 + JSONObject data = (JSONObject) resultJson.get("data"); + JSONArray dataArray = (JSONArray) data.get("list"); + JSONObject jsonObject = (JSONObject) dataArray.get(0); + JSONArray personPhoto = (JSONArray) jsonObject.get("personPhoto"); + JSONObject photo = (JSONObject) personPhoto.get(0); + String picUri = photo.getString("picUri"); + String serverIndexCode = photo.getString("serverIndexCode"); + PersonInfoRequest picRequest = new PersonInfoRequest(); + picRequest.setPicUri(picUri); + picRequest.setServerIndexCode(serverIndexCode); + String reBody = JSONObject.toJSONString(picRequest); + //重定向地址获取 + String url = HikUtil.hikApiFor302(HikUri.PERSON_PICTURE, reBody); + return ResponseData.success(url); + } } 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 4a07dd9..7b1dcf6 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 @@ -16,6 +16,7 @@ import com.casic.missiles.modular.redis.key.CacheKeys; import com.casic.missiles.modular.service.CockpitService; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.util.CollectionUtils; import org.springframework.web.bind.annotation.*; @@ -24,10 +25,7 @@ import java.text.NumberFormat; import java.time.LocalDateTime; import java.time.temporal.ChronoUnit; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.util.*; import java.util.stream.Collectors; /** @@ -73,6 +71,9 @@ private StatisticNumberMapper numberMapper; @Autowired + private HazardLevelMapper hazardLevelMapper; + + @Autowired private AccessGroupConfig accessGroupConfig; /** @@ -104,8 +105,24 @@ public Object buildingNumberPerHour(){ //当天按小时分组的人数 List list = numberMapper.selectListByTime(); - Map> collect = list.stream().collect(Collectors.groupingBy(BuildingNumberDTO::getStatisticPosition)); - return ResponseData.success(collect); + Map> collect = list.stream().collect(Collectors.groupingBy(BuildingNumberDTO::getStatisticTime)); + //定时任务中已将每小时三栋楼人数存到数据库 + //将一期主楼和录制楼人数合并,二期单算 + List> resultList = new ArrayList<>(); + collect.keySet().forEach(key -> { + List buildingNumberDTOS = collect.get(key); + BuildingNumberDTO mainBuildingOne = buildingNumberDTOS.get(0); + BuildingNumberDTO mainBuildingTwo = buildingNumberDTOS.get(1); + BuildingNumberDTO recordingBuilding = buildingNumberDTOS.get(2); + HashMap resultMap = new HashMap<>(); + Integer oneQuantity = Integer.valueOf(mainBuildingOne.getStatisticQuantity()); + Integer recordingQuantity = Integer.valueOf(recordingBuilding.getStatisticQuantity()); + resultMap.put("staticTime", mainBuildingOne.getStatisticTime()); + resultMap.put(mainBuildingOne.getStatisticPositionName()+"、"+recordingBuilding.getStatisticPositionName(), String.valueOf(oneQuantity+recordingQuantity)); + resultMap.put(mainBuildingTwo.getStatisticPositionName(), mainBuildingTwo.getStatisticQuantity()); + resultList.add(resultMap); + }); + return ResponseData.success(resultList); } /** @@ -151,12 +168,11 @@ public Object securityNumber() { QueryWrapper wrapper = new QueryWrapper<>(); wrapper.eq("staff_type", 2); + // TODO: 2022/9/2 后续使用产品确定的每天出勤的安保人员的数量 Integer total = staffInfoMapper.selectCount(wrapper); - //当日离岗事件个数 - QueryWrapper wrapper1 = new QueryWrapper<>(); - wrapper1.eq("hik_event_type", SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); - wrapper1.apply("date_format(now(),'%Y-%m-%d') = date_format(happen_time,'%Y-%m-%d')"); - Integer leave = caseInfoMapper.selectCount(wrapper1); + //当日离岗事件按设备去重后的个数 + // TODO: 2022/9/2 目前相当于24小时内的计算,之后看需要可改成自定义小时数计算离岗率,即离岗+6小时内仅一次离岗则恢复为100%,多次则累加离岗次数计算离岗率 + Integer leave = caseInfoMapper.selectDemobilizedCount(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); NumberFormat numberFormat = NumberFormat.getInstance(); // 设置精确到小数点后2位 numberFormat.setMaximumFractionDigits(2); @@ -179,7 +195,6 @@ @ResponseBody public Object visitorApplyDetail() { List reasonGroup = applyMapper.selectByVisitReason(); - HashMap resultMap = new HashMap<>(); NumberFormat numberFormat = NumberFormat.getInstance(); // 设置精确到小数点后2位 numberFormat.setMaximumFractionDigits(2); @@ -187,12 +202,17 @@ if(0 == sum){ return ResponseData.success(); } + List resultList = new ArrayList<>(); reasonGroup.forEach(group -> { String reasonName = dictService.getDictNameByCode(SecurityEventDict.VISIT_REASON, group.getVisitReason()); String result = numberFormat.format((float) group.getQuantity() / (float) sum * 100); - resultMap.put(reasonName, result+"%"); + ApplyReasonGroupDTO applyReasonGroupDTO = new ApplyReasonGroupDTO(); + applyReasonGroupDTO.setQuantity(group.getQuantity()); + applyReasonGroupDTO.setVisitReason(reasonName); + applyReasonGroupDTO.setRatio(result+"%"); + resultList.add(applyReasonGroupDTO); }); - return ResponseData.success(resultMap); + return ResponseData.success(resultList); } /** @@ -247,6 +267,32 @@ } /** + * 机动力量实时在岗率,在岗人数除以总应在岗人数,用离岗+6小时内恢复为100%,6小时外再计算 + */ + @GetMapping("/staff/beOnDutyRatio") + @ResponseBody + public Object beOnDutyRatio() { + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("staff_type", 2); + // TODO: 2022/9/2 后续使用产品确定的每天出勤的安保人员的数量 + Integer total = staffInfoMapper.selectCount(wrapper); + if(0 == total){ + return ResponseData.success(null); + } + //当日离岗事件按设备去重后的个数 + // TODO: 2022/9/2 目前相当于24小时内的计算,之后看需要可改成自定义小时数计算离岗率,即离岗+6小时内仅一次离岗则恢复为100%,多次则累加离岗次数计算离岗率 + List onDutyRatioDTOS = caseInfoMapper.selectDemobilizedCountByHour(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); + onDutyRatioDTOS.forEach(dto -> { + NumberFormat numberFormat = NumberFormat.getInstance(); + // 设置精确到小数点后2位 + numberFormat.setMaximumFractionDigits(2); + String result = numberFormat.format(100 - Float.valueOf(dto.getQuantity()) / (float) total * 100); + dto.setRatio(result+"%"); + }); + return ResponseData.success(onDutyRatioDTOS); + } + + /** * 闸机速通门统计-设备状态分组计算数量,devType传闸机字典key * 视频频监控摄像机统计-设备状态分组计算数量,devType传摄像头字典key */ @@ -262,12 +308,17 @@ if(sum <= 0){ return ResponseData.error("无该类设备信息"); } + List resultList = new ArrayList<>(); gateStatusGroup.forEach(group -> { String devStatus = dictService.getDictNameByCode(SecurityEventDict.DEVICE_STATUS, group.getStatus()); String result = numberFormat.format((float) group.getQuantity() / (float) sum * 100); - resultMap.put(devStatus, result+"%"); + GateStatusGroupResponse gateStatusGroupResponse = new GateStatusGroupResponse(); + gateStatusGroupResponse.setStatus(devStatus); + gateStatusGroupResponse.setRatio(result+"%"); + resultList.add(gateStatusGroupResponse); }); - resultMap.put("总", sum); + resultMap.put("total", sum); + resultMap.put("list", resultList); return ResponseData.success(resultMap); } @@ -282,17 +333,38 @@ String position = securityScoreDTO.getPosition(); List caseInfos = caseInfoMapper.selectByPosition(position); //查询各危险级别权重、各类别权重,放入map,避免循环中多次查数据库 - + HashMap hazardScoreMap = new HashMap<>(); + List caseHazardLevelList = hazardLevelMapper.getCaseHazardLevelList(null); + caseHazardLevelList.forEach(hazardLevel -> { + hazardScoreMap.put(hazardLevel.getCode(), hazardLevel.getWeight()); + }); + HashMap categoryScoreMap = new HashMap<>(); + List categoryLevelList = categoryLevelMapper.getCaseCategoryLevelList(null); + categoryLevelList.forEach(categoryLevel -> { + categoryScoreMap.put(categoryLevel.getCode(), categoryLevel.getWeight()); + }); + //事件按楼层分组,计算 List securityScoreDTOs = new ArrayList<>(); caseInfos.forEach(caseInfo -> { SecurityScoreDTO securityScoreDTO1 = new SecurityScoreDTO(); + securityScoreDTO1.setPosition(caseInfo.getPosition()); securityScoreDTO1.setArea(caseInfo.getArea()); - // TODO: 2022/8/4 楼层评分计算根据产品定义调整 -// caseInfo.get -// securityScoreDTO1.setScore(); + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); + Double score = 100 - Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + securityScoreDTO1.setScore(score); + securityScoreDTOs.add(securityScoreDTO1); }); - - return null; + 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); + }); + return ResponseData.success(securityScoreDTOs); } /** @@ -303,9 +375,13 @@ public Object SecurityFrequency(@RequestBody SecurityFrequencyDTO securityFrequencyDTO) { String year = securityFrequencyDTO.getYear(); String month = securityFrequencyDTO.getMonth(); - Integer quantity = caseInfoMapper.selectCountByMonth(year, month); - securityFrequencyDTO.setQuantity(quantity); - return ResponseData.success(securityFrequencyDTO); + if(!StringUtils.isEmpty(year) && StringUtils.isEmpty(month)){ + Integer quantity = caseInfoMapper.selectCountByMonth(year, month); + securityFrequencyDTO.setQuantity(quantity); + return ResponseData.success(securityFrequencyDTO); + } + List list = caseInfoMapper.selectPreMonthCount(); + return ResponseData.success(list); } } 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 ae4d770..f4f075c 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 @@ -1,20 +1,25 @@ package com.casic.missiles.modular.controller.cockpit; +import cn.hutool.core.date.DateUnit; import cn.hutool.core.date.DateUtil; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.casic.missiles.model.response.ResponseData; -import com.casic.missiles.modular.dao.AttendanceInfoMapper; -import com.casic.missiles.modular.dao.CaseInfoMapper; -import com.casic.missiles.modular.dao.HazardLevelMapper; -import com.casic.missiles.modular.dao.StaffInfoMapper; +import com.casic.missiles.modular.dao.*; +import com.casic.missiles.modular.dto.DeviceRepairLogDTO; +import com.casic.missiles.modular.dto.DeviceRepairRequest; import com.casic.missiles.modular.dto.statistics.*; +import com.casic.missiles.modular.enums.SecurityEventType; +import com.casic.missiles.modular.model.CaseCategoryLevel; import com.casic.missiles.modular.model.CaseHazardLevel; +import com.casic.missiles.modular.model.CaseInfo; import com.casic.missiles.modular.model.StaffInfo; +import com.casic.missiles.modular.service.DeviceInfoService; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.util.CollectionUtils; import org.springframework.web.bind.annotation.*; +import java.math.BigDecimal; import java.text.NumberFormat; import java.util.*; import java.util.stream.Collectors; @@ -40,6 +45,12 @@ @Autowired private HazardLevelMapper hazardLevelMapper; + @Autowired + private CategoryLevelMapper categoryLevelMapper; + + @Autowired + private DeviceInfoService deviceInfoService; + /** * 安防事件时域频次统计,每月的每天安防事件个数(原方案) * 月维度:展示每个月的每天的数据 @@ -89,15 +100,17 @@ List monthList = caseInfoMapper.selectPreMonthCountByYear(year); Map> collect = monthList.stream().collect(Collectors.groupingBy(PreMonthOrWeekCaseDTO::getHazardLevelCode)); HashMap strAvgMap = new HashMap<>(); + List resultList = new ArrayList<>(); for (String key : collect.keySet()) { List preMonthOrWeekCaseDTOS = collect.get(key); int sum = preMonthOrWeekCaseDTOS.stream().mapToInt(PreMonthOrWeekCaseDTO::getQuantity).sum(); //若年份是本年,则使用个安防级别数量/当前月份数 //若不是本年,除数为12 MonthAndWeekDTO monthAndWeekDTO = new MonthAndWeekDTO(); + String hazardName = hazardLevelMapper.selectHazardNameByCode(key); + monthAndWeekDTO.setLevelName(hazardName); if(year.equals(String.valueOf(DateUtil.thisYear()))){ monthAndWeekDTO.setMonthQuantity(sum / DateUtil.thisMonth()); -// monthAndWeekDTO.setLevelName(); strAvgMap.put(key, monthAndWeekDTO); }else{ monthAndWeekDTO.setMonthQuantity(sum / 12); @@ -113,27 +126,37 @@ if(year.equals(String.valueOf(DateUtil.thisYear()))){ if(!Objects.isNull(strAvgMap.get(key))){ MonthAndWeekDTO monthAndWeekDTO = strAvgMap.get(key); + String hazardName = hazardLevelMapper.selectHazardNameByCode(key); + monthAndWeekDTO.setLevelName(hazardName); monthAndWeekDTO.setWeekQuantity(sum / DateUtil.thisWeekOfYear()); strAvgMap.put(key, monthAndWeekDTO); }else{ MonthAndWeekDTO monthAndWeekDTO = new MonthAndWeekDTO(); + String hazardName = hazardLevelMapper.selectHazardNameByCode(key); + monthAndWeekDTO.setLevelName(hazardName); monthAndWeekDTO.setWeekQuantity(sum / DateUtil.thisWeekOfYear()); strAvgMap.put(key, monthAndWeekDTO); } }else{ if(!Objects.isNull(strAvgMap.get(key))){ MonthAndWeekDTO monthAndWeekDTO = strAvgMap.get(key); + String hazardName = hazardLevelMapper.selectHazardNameByCode(key); + monthAndWeekDTO.setLevelName(hazardName); monthAndWeekDTO.setWeekQuantity(sum / 52); strAvgMap.put(key, monthAndWeekDTO); }else{ MonthAndWeekDTO monthAndWeekDTO = new MonthAndWeekDTO(); + String hazardName = hazardLevelMapper.selectHazardNameByCode(key); + monthAndWeekDTO.setLevelName(hazardName); monthAndWeekDTO.setWeekQuantity(sum / 52); strAvgMap.put(key, monthAndWeekDTO); } } } - avgMonthAndWeekGroupDTO.setMap(strAvgMap); - return ResponseData.success(avgMonthAndWeekGroupDTO); + strAvgMap.keySet().forEach(key -> { + resultList.add(strAvgMap.get(key)); + }); + return ResponseData.success(resultList); } /** @@ -181,12 +204,178 @@ } /** - * 员工考勤人数变化,功能待定 + * 员工考勤人数变化,统计当天(横坐标为时)及近7天(横坐标为天)的考勤人数变化,只要发生一次考勤识别,次数的基数就正常增加(没有上班下班区分) */ + @PostMapping("/staff/attendanceNumber/{dimension}") + @ResponseBody + public Object attendanceNumber(@PathVariable("dimension") String dimension) { + List attendanceNumberDTOs = null; + List> resultList = new ArrayList<>(); + if("week".equals(dimension)){ + //近7天数据按天分组统计 + attendanceNumberDTOs = attendanceInfoMapper.getCountForWeek(); + }else if("day".equals(dimension)) { + //今天数据按小时分组统计 + attendanceNumberDTOs = attendanceInfoMapper.getCountForDay(); + } + if(CollectionUtils.isEmpty(attendanceNumberDTOs)){ + return ResponseData.error("该查询条件下,无员工出勤数据!"); + } + Map> collect = attendanceNumberDTOs.stream().collect(Collectors.groupingBy(AttendanceNumberDTO::getDate)); + collect.keySet().forEach(key -> { + List attendanceNumberDTOS = collect.get(key); + AttendanceNumberDTO attendanceNumberDTO = attendanceNumberDTOS.get(0); + AttendanceNumberDTO attendanceNumberDTO2 = attendanceNumberDTOS.get(1); + Map resultMap = new HashMap<>(); + resultMap.put(attendanceNumberDTO.getStaffType(), attendanceNumberDTO.getQuantity()); + resultMap.put(attendanceNumberDTO2.getStaffType(), attendanceNumberDTO2.getQuantity()); + resultMap.put("staticTime", attendanceNumberDTO.getDate()); + resultList.add(resultMap); + }); + return ResponseData.success(resultList); + } /** - * 近30天/近一周安保人员到岗排行 + * 早晚高峰区域安防评估 */ + @PostMapping("/security/assessment/{dimension}") + @ResponseBody + public Object securityAssessment(@PathVariable("dimension") String dimension) { + //查询各危险级别权重、各类别权重,放入map,避免循环中多次查数据库 + HashMap hazardScoreMap = new HashMap<>(); + List caseHazardLevelList = hazardLevelMapper.getCaseHazardLevelList(null); + caseHazardLevelList.forEach(hazardLevel -> { + hazardScoreMap.put(hazardLevel.getCode(), hazardLevel.getWeight()); + }); + HashMap categoryScoreMap = new HashMap<>(); + List categoryLevelList = categoryLevelMapper.getCaseCategoryLevelList(null); + categoryLevelList.forEach(categoryLevel -> { + categoryScoreMap.put(categoryLevel.getCode(), categoryLevel.getWeight()); + }); + HashMap hashMap = new HashMap<>(); + if("week".equals(dimension)){ + //近7天早晚高峰数据 + List caseInfos = caseInfoMapper.selectListBySevenDay(); + //按时间(天)进行分组 + caseInfos.forEach(caseInfo -> { + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); + Double score = Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + String[] array = caseInfo.getHappenTime().split(" "); + String dayTime = array[0]; + BigDecimal preScore; + if(hashMap.containsKey(dayTime)){ + Double aDouble = hashMap.get(dayTime); + preScore = new BigDecimal(aDouble.toString()); + + }else{ + preScore = new BigDecimal("100.0"); + } + BigDecimal nowScore = new BigDecimal(score.toString()); + hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); + }); + return ResponseData.success(hashMap); + }else if("day".equals(dimension)) { + //今天数据按小时分组统计 + List caseInfos = caseInfoMapper.selectListByToday(); + caseInfos.forEach(caseInfo -> { + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); + Double score = Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + String[] array = caseInfo.getHappenTime().split(":"); + String dayTime = array[0]; + BigDecimal preScore; + if(hashMap.containsKey(dayTime)){ + Double aDouble = hashMap.get(dayTime); + preScore = new BigDecimal(aDouble.toString()); + + }else{ + preScore = new BigDecimal("100.0"); + } + BigDecimal nowScore = new BigDecimal(score.toString()); + hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); + }); + return ResponseData.success(hashMap); + } + return null; + } + + /** + * 重点区域安防事态评估,统计重点区域6:00-23:00按小时分组数据 + */ + @GetMapping("/security/keyAreaStatistic") + @ResponseBody + public Object keyAreaStatistic() { + //查询各危险级别权重、各类别权重,放入map,避免循环中多次查数据库 + HashMap hazardScoreMap = new HashMap<>(); + List caseHazardLevelList = hazardLevelMapper.getCaseHazardLevelList(null); + caseHazardLevelList.forEach(hazardLevel -> { + hazardScoreMap.put(hazardLevel.getCode(), hazardLevel.getWeight()); + }); + HashMap categoryScoreMap = new HashMap<>(); + List categoryLevelList = categoryLevelMapper.getCaseCategoryLevelList(null); + categoryLevelList.forEach(categoryLevel -> { + categoryScoreMap.put(categoryLevel.getCode(), categoryLevel.getWeight()); + }); + HashMap hashMap = new HashMap<>(); + //今天数据按小时分组统计 + List caseInfos = caseInfoMapper.selectListByToday2(); + caseInfos.forEach(caseInfo -> { + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); + Double score = Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + String[] array = caseInfo.getHappenTime().split(":"); + String dayTime = array[0]; + BigDecimal preScore; + if(hashMap.containsKey(dayTime)){ + Double aDouble = hashMap.get(dayTime); + preScore = new BigDecimal(aDouble.toString()); + + }else{ + preScore = new BigDecimal("100.0"); + } + BigDecimal nowScore = new BigDecimal(score.toString()); + hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); + }); + return ResponseData.success(hashMap); + } + + /** + * 安防机动支援力量调配响应评估,根据事件已解决状态及已解决时间-发送时间,按时间(小时)分组统计 + */ + @GetMapping("/security/responseAssess") + @ResponseBody + public Object responseAssess() { + //查询各危险级别权重、各类别权重,放入map,避免循环中多次查数据库 + HashMap hazardScoreMap = new HashMap<>(); + List caseHazardLevelList = hazardLevelMapper.getCaseHazardLevelList(null); + caseHazardLevelList.forEach(hazardLevel -> { + hazardScoreMap.put(hazardLevel.getCode(), hazardLevel.getWeight()); + }); + HashMap hashMap = new HashMap<>(); + //今天数据按小时分组统计 + List caseInfos = caseInfoMapper.selectListByToday3(); + caseInfos.forEach(caseInfo -> { + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + //扣分=事件级别权重*未解决小时数 + Date updateTime = DateUtil.parse(caseInfo.getUpdateTime()); + Date happenTime = DateUtil.parse(caseInfo.getHappenTime()); + long between = DateUtil.between(updateTime, happenTime, DateUnit.HOUR); + Double score = Double.valueOf(hazardWeight)*between; + String[] array = caseInfo.getHappenTime().split(":"); + String dayTime = array[0]; + BigDecimal preScore; + if(hashMap.containsKey(dayTime)){ + Double aDouble = hashMap.get(dayTime); + preScore = new BigDecimal(aDouble.toString()); + }else{ + preScore = new BigDecimal("100.0"); + } + BigDecimal nowScore = new BigDecimal(score.toString()); + hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); + }); + return ResponseData.success(hashMap); + } /** * 重点区域威胁事件类型统计,优先级2,统计近7天和近30天 @@ -224,7 +413,34 @@ } /** - * 设备状态计算系数和评判,优先级3,需确认设备恢复时间是否可以获取 + * 近30天/近一周安保人员到岗排行 */ + + /** + * 安保等级评估,发生离岗事件减1分 + */ + @GetMapping("/security/levelAssess") + @ResponseBody + public Object securityLevelAssess() { + //今天数据按小时分组统计 + List resultList = caseInfoMapper.selectListByType(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); + resultList.forEach(result -> { + BigDecimal deScore = new BigDecimal(result.getQuantity()); + BigDecimal preScore = new BigDecimal("100.0"); + result.setScore(preScore.subtract(deScore).doubleValue()); + }); + return ResponseData.success(resultList); + } + + /** + * 设备状态计算系数和评判,即设备维修管理查询(不分页) + */ + @PostMapping("/device/repairList") + @ResponseBody + public Object repairList(@RequestBody DeviceRepairRequest deviceRepairRequest) { + List deviceRepairLogDTOS = deviceInfoService.deviceRepairListPage(deviceRepairRequest); + return ResponseData.success(deviceRepairLogDTOS); + } + } 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 fbf8ab6..c71a15a 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 @@ -1,13 +1,12 @@ package com.casic.missiles.modular.controller.hik; +import cn.hutool.core.date.DateTime; +import cn.hutool.core.date.DateUtil; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.casic.missiles.model.response.ResponseData; import com.casic.missiles.modular.dao.HikFaceGroupInfoMapper; -import com.casic.missiles.modular.dto.hik.EventSubscribeRequest; -import com.casic.missiles.modular.dto.hik.FaceGroupAdditionRequest; -import com.casic.missiles.modular.dto.hik.HikRecvEvent; -import com.casic.missiles.modular.dto.hik.OrgBatchAdd; +import com.casic.missiles.modular.dto.hik.*; import com.casic.missiles.modular.enums.HikUri; import com.casic.missiles.modular.enums.SecurityEventType; import com.casic.missiles.modular.model.CaseInfo; @@ -18,16 +17,20 @@ import com.casic.missiles.modular.util.CaseInfoFactoryUtil; import com.casic.missiles.modular.util.HikUtil; import com.casic.missiles.modular.util.ThreadPoolUtil; +import com.casic.missiles.modular.util.WebSocket; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; -import org.springframework.web.bind.annotation.*; +import org.springframework.util.CollectionUtils; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.RestController; -import java.net.InetAddress; -import java.net.UnknownHostException; import java.util.ArrayList; +import java.util.Iterator; import java.util.List; import java.util.Objects; @@ -38,7 +41,6 @@ */ @Slf4j @RestController -@RequestMapping("/hik") public class HikController { @Autowired @@ -53,28 +55,37 @@ @Autowired private HikService hikService; + @Autowired + private HikFaceGroupInfoMapper hikFaceGroupInfoMapper; + + @Autowired + private WebSocket webSocket; + @Value("${server.port}") private int serverPort; - @Autowired - private HikFaceGroupInfoMapper hikFaceGroupInfoMapper; /** * 海康事件订阅 */ - @PostMapping("/event/subscribe") + @PostMapping("/hik/event/subscribe") @ResponseBody - public Object eventSubscribe() throws UnknownHostException { + public Object eventSubscribe() { EventSubscribeRequest eventSubscribeRequest = new EventSubscribeRequest(); ArrayList list = new ArrayList<>(); list.add(SecurityEventType.DEVICE_OFFLINE); + list.add(SecurityEventType.DEVICE_ONLINE); list.add(SecurityEventType.KEY_PERSONNEL_IDENTIFY_EVENT); list.add(SecurityEventType.MONITORING_POINT_OFFLINE); + list.add(SecurityEventType.MONITORING_POINT_ONLINE); list.add(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); list.add(SecurityEventType.PERSONNEL_GATHER_EVENT); - InetAddress localHost = InetAddress.getLocalHost(); + list.add(SecurityEventType.VISITOR_REGISTER); + list.add(SecurityEventType.VISITOR_CHECKOUT); + list.add(SecurityEventType.HIGH_ALTITUDE_PARABOLIC); +// InetAddress localHost = InetAddress.getLocalHost(); eventSubscribeRequest.setEventTypes(list); - eventSubscribeRequest.setEventDest("https://" + localHost + ":" + serverPort + "/eventRcv"); + eventSubscribeRequest.setEventDest("http://" + "192.168.10.6" + ":" + serverPort + "/eventRcv"); //订阅类型,0-订阅原始事件,1-联动事件,2-原始事件和联动事件,不填使用默认值0 eventSubscribeRequest.setSubType(0); /** @@ -92,19 +103,25 @@ } /** + * 查询事件订阅信息 + */ + @PostMapping("/hik/event/query") + @ResponseBody + public Object eventQuery() { + String result = HikUtil.hikApi(HikUri.EVENT_INFO, ""); + return result; + } + + /** * 海康事件接收 */ @PostMapping("/eventRcv") @ResponseBody public Object eventRcv(@RequestBody HikRecvEvent hikRecvEvent) { //1、接收所需事件类型 - Long eventType = hikRecvEvent.getEventType(); + Number eventType = hikRecvEvent.getEventType(); log.info("接收到安防事件类型为:{}", eventType); CaseInfo caseInfo = caseInfoFactoryUtil.getCaseInfo(eventType); - //接收到不关心事件直接返回 - if(Objects.isNull(caseInfo)){ - return ResponseData.success(); - } //2、不同事件不同处理,caseInfoFactoryUtil已设置好事件基础定义信息 // 再为事件添加状态、设备编码、设备名称、位置、区域、时间 // 异步处理事件 @@ -114,19 +131,23 @@ caseHandle(hikRecvEvent, eventType, caseInfo); } })); +// caseHandle(hikRecvEvent, eventType, caseInfo); - return null; + return ResponseData.success(); } - private void caseHandle(HikRecvEvent hikRecvEvent, Long eventType, CaseInfo caseInfo) { + private void caseHandle(HikRecvEvent hikRecvEvent, Number eventType, CaseInfo caseInfo) { JSONArray eventArray = hikRecvEvent.getEventArray(); List caseInfos = new ArrayList<>(); - while (eventArray.stream().iterator().hasNext()) { + Iterator iterator = eventArray.iterator(); + while (iterator.hasNext()) { CaseInfo caseInfo1 = new CaseInfo(); - BeanUtils.copyProperties(caseInfo, caseInfo1); - JSONObject event = (JSONObject) eventArray.stream().iterator().next(); + if(!Objects.isNull(caseInfo)){ + BeanUtils.copyProperties(caseInfo, caseInfo1); + } + JSONObject event = (JSONObject) iterator.next(); //5种事件进行不同处理 - if(SecurityEventType.KEY_PERSONNEL_IDENTIFY_EVENT == eventType){ + if (SecurityEventType.KEY_PERSONNEL_IDENTIFY_EVENT.equals(eventType)) { //判断所属人脸分组 JSONObject data = (JSONObject) event.get("data"); JSONObject faceRecognitionResult = (JSONObject) data.get("faceRecognitionResult"); @@ -142,52 +163,101 @@ if (faceGroupCode.equals(blackListGroup.getFaceGroupCode())) { //黑名单分组处理 caseInfo1 = hikService.blackListHandle(event, caseInfo1); - }else if(faceGroupCode.equals(propertyPersonnelGroup.getFaceGroupCode())){ + } else if (faceGroupCode.equals(propertyPersonnelGroup.getFaceGroupCode())) { //考勤分组处理-物业人员,添加到考勤表 hikService.propertyAttendanceHandle(event); - }else if(faceGroupCode.equals(securityPersonnelGroup.getFaceGroupCode())){ + } else if (faceGroupCode.equals(securityPersonnelGroup.getFaceGroupCode())) { //考勤分组处理-安保人员,添加到考勤表 hikService.securityPersonnelHandle(event); - }else { + } else { return; } - }else if(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT == eventType){ + } else if (SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT.equals(eventType)) { //离岗事件处理 caseInfo1 = hikService.demobilizedHandle(event, caseInfo1); - }else if(SecurityEventType.PERSONNEL_GATHER_EVENT == eventType){ + } else if (SecurityEventType.PERSONNEL_GATHER_EVENT.equals(eventType)) { //人员聚集事件处理 caseInfo1 = hikService.personGatherHandle(event, caseInfo1); - }else if(SecurityEventType.MONITORING_POINT_OFFLINE == eventType){ + } else if (SecurityEventType.MONITORING_POINT_OFFLINE.equals(eventType)) { //监控点离线事件处理 caseInfo1 = hikService.monitorPointOfflineHandle(event, caseInfo1); - }else if(SecurityEventType.DEVICE_OFFLINE == eventType){ + } else if (SecurityEventType.MONITORING_POINT_ONLINE.equals(eventType)) { + //监控点上线事件处理 + hikService.monitorPointOnlineHandle(event); + } else if (SecurityEventType.DEVICE_OFFLINE.equals(eventType)) { //装置离线事件处理 caseInfo1 = hikService.deviceOfflineHandle(event, caseInfo1); - }else if(SecurityEventType.VISITOR_REGISTER == eventType){ + } else if (SecurityEventType.DEVICE_ONLINE.equals(eventType)) { + //装置上线处理 + hikService.deviceOnlineHandle(event); + } else if (SecurityEventType.VISITOR_REGISTER.equals(eventType)) { //记录访客登记记录,添加到访客记录表 hikService.visitorRegisterHandler(event); - }else if(SecurityEventType.VISITOR_CHECKOUT == eventType){ + } else if (SecurityEventType.VISITOR_CHECKOUT.equals(eventType)) { //记录访客签离记录 hikService.visitorCheckOutHandler(event); } - if(!Objects.isNull(caseInfo1) && !StringUtils.isEmpty(caseInfo1.getHappenTime())){ + if (!Objects.isNull(caseInfo1) && !StringUtils.isEmpty(caseInfo1.getHappenTime())) { caseInfos.add(caseInfo1); } } //3、安防事件入库 - if(!caseInfoService.insertCaseInfoBatch(caseInfos)){ - log.error("安防事件批量入库异常"); + if (!CollectionUtils.isEmpty(caseInfos) && !caseInfoService.insertCaseInfoBatch(caseInfos)) { + log.error("安防事件批量入库异常!"); } // TODO: 2022/8/15 webSocket推送 + if (CollectionUtils.isEmpty(caseInfos)) { + log.info("webSocket事件推送"); + webSocket.sendAllMessage(JSONObject.toJSONString(caseInfos)); + } return; } /** + * 以图搜图,前端用于轨迹追踪 + */ + @PostMapping("/hik/search/picture") + @ResponseBody + public Object searchPictures(@RequestBody SearchPicturesRequest searchPicturesRequest) { + DateTime startDateTime = DateUtil.parse(searchPicturesRequest.getStartTime()); + DateTime endDateTime = DateUtil.parse(searchPicturesRequest.getEndTime()); + String startTime = DateUtil.format(startDateTime, "yyyy-MM-dd'T'HH:mm:ss.SSSXXX"); + String endTime = DateUtil.format(endDateTime, "yyyy-MM-dd'T'HH:mm:ss.SSSXXX"); + searchPicturesRequest.setStartTime(startTime); + searchPicturesRequest.setEndTime(endTime); + String body = JSONObject.toJSONString(searchPicturesRequest); + String resultStr = HikUtil.hikApi(HikUri.SEARCH_PICTURES, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (!"0".equals(resultJson.get("code"))) { + log.error("请求海康,以图搜图失败,海康response:{}", resultStr); + return ResponseData.error("以图搜图失败"); + } + return ResponseData.success(resultJson); + } + + + /** + * 海康事件取消订阅 + */ + @PostMapping("/hik/event/cancel") + @ResponseBody + public Object eventCancelSubscribe(@RequestBody CancelSubscribeRequest cancelSubscribeRequest) { + String body = JSONObject.toJSONString(cancelSubscribeRequest); + String resultStr = HikUtil.hikApi(HikUri.EVENT_CANCEL, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (!"0".equals(resultJson.get("code"))) { + log.error("请求海康,取消订阅失败,海康response:{}", resultStr); + return ResponseData.error("取消订阅失败"); + } + return ResponseData.success(resultJson); + } + + /** * 单个添加海康人脸分组 * api->hik单个添加人脸分组api->response->mysql */ - @PostMapping("/faceGroup/single/add") + @PostMapping("/hik/faceGroup/single/add") @ResponseBody public Object faceGroupAddition(@RequestBody FaceGroupAdditionRequest faceGroupAdditionRequest) { String body = JSONObject.toJSONString(faceGroupAdditionRequest); @@ -212,7 +282,7 @@ * 批量添加海康组织 * api->hik批量添加组织api->response */ - @PostMapping("/org/batch/add") + @PostMapping("/hik/org/batch/add") @ResponseBody public Object orgBatchAdd(@RequestBody List orgBatchAddRequest) { String body = JSONObject.toJSONString(orgBatchAddRequest); @@ -232,4 +302,62 @@ return ResponseData.error("批量添加组织失败"); } + /** + * 获取人员列表 + */ + @PostMapping("/hik/person/personList") + @ResponseBody + public Object personList() { + PersonListRequest request = new PersonListRequest(); + request.setPageNo(1); + request.setPageSize(100); + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi("/api/resource/v2/person/personList", body); + return resultStr; + } + + /** + * 获取组织列表 + */ + @PostMapping("/hik/org/orgList") + @ResponseBody + public Object orgList() { + PersonListRequest request = new PersonListRequest(); + request.setPageNo(1); + request.setPageSize(100); + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi("/api/resource/v1/org/orgList", body); + return resultStr; + } + + /** + * 查询访客权限下载记录 + */ + @PostMapping("/hik/auth/result") + @ResponseBody + public Object authResult() { + PersonListRequest request = new PersonListRequest(); + request.setPageNo(1); + request.setPageSize(100); + request.setOrderId("ba101db6246711edaea66f7939a13638"); + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi("/api/visitor/v1/auth/result", body); + return resultStr; + } + + /** + * 人脸图片获取 + */ + @PostMapping("/hik/face/picture") + @ResponseBody + public Object facePicture() { + FaceRequest request = new FaceRequest(); +// List list = new ArrayList<>(); +// list.add(""); + request.setCertificateNum("wanggong"); + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi("/api/frs/v1/face", body); + return resultStr; + } + } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/AssetInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/AssetInfoMapper.java index 4f64e83..c0684ee 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/AssetInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/AssetInfoMapper.java @@ -17,6 +17,6 @@ @Mapper public interface AssetInfoMapper extends BaseMapper { - List getAssetInfoListPage(@Param("page") Page page, AssetInfoRequest assetInfoRequest); + List getAssetInfoListPage(@Param("page") Page page, @Param("assetInfoRequest") AssetInfoRequest assetInfoRequest); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/AttendanceInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/AttendanceInfoMapper.java index f9e793e..ec87e46 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/AttendanceInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/AttendanceInfoMapper.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.statistics.AttendanceNumberDTO; import com.casic.missiles.modular.dto.statistics.AttendanceRatioDTO; import com.casic.missiles.modular.model.AttendanceInfo; import org.apache.ibatis.annotations.Mapper; @@ -17,7 +18,7 @@ */ @Mapper public interface AttendanceInfoMapper extends BaseMapper { - List getAttendanceInfoListPage(@Param("page") Page page, StaffInfoRequest attendanceInfoRequest); + List getAttendanceInfoListPage(@Param("page") Page page, @Param("attendanceInfoRequest") StaffInfoRequest attendanceInfoRequest); AttendanceInfo selectByCodeAndDate(@Param("staffCode") String staffCode); @@ -26,4 +27,8 @@ List getCountByTypeAndDateForMonth(@Param("staffType")String staffType); List getCountByTypeAndDateForYear(@Param("staffType")String staffType); + + List getCountForWeek(); + + List getCountForDay(); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java index ce94b8f..6137a7d 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java @@ -17,5 +17,5 @@ @Mapper public interface BlackInfoMapper extends BaseMapper { - List getBlackInfoListPage(@Param("page") Page page, BlackInfoRequest blackInfoRequest); + List getBlackInfoListPage(@Param("page") Page page, @Param("blackInfoRequest") BlackInfoRequest blackInfoRequest); } 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 efda6b3..50aaa6f 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 @@ -20,7 +20,7 @@ List getCaseInfoListPage(@Param("page") Page page, @Param("caseInfoRequest") CaseInfoRequest caseInfoRequest); - int updateStatusById(CaseInfoRequest caseInfoRequest); + int updateStatusById(@Param("caseInfoRequest") CaseInfoRequest caseInfoRequest); List selectByLevelAndMonth(@Param("year") String year); @@ -47,4 +47,20 @@ List selectPreWeekCountByThirtyDay(); List selectPreDayCountBySevenDay(); + + Integer selectDemobilizedCount(@Param("eventType") Number personnelDemobilizedEvent); + + List selectPreMonthCount(); + + List selectListBySevenDay(); + + List selectListByToday(); + + List selectListByToday2(); + + List selectListByToday3(); + + List selectListByType(@Param("eventType") Number eventType); + + List selectDemobilizedCountByHour(@Param("eventType") Number eventType); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/CategoryLevelMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/CategoryLevelMapper.java index 52fc714..afe1650 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/CategoryLevelMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/CategoryLevelMapper.java @@ -17,9 +17,9 @@ @Mapper public interface CategoryLevelMapper extends BaseMapper { - List getCaseCategoryLevelListPage(@Param("page") Page page, CategoryLevelRequest categoryLevelRequest); + List getCaseCategoryLevelListPage(@Param("page") Page page, @Param("categoryLevelRequest") CategoryLevelRequest categoryLevelRequest); - List getCaseCategoryLevelList(CategoryLevelRequest categoryLevelRequest); + List getCaseCategoryLevelList(@Param("categoryLevelRequest") CategoryLevelRequest categoryLevelRequest); CaseCategoryLevel getCaseCategoryLevel(@Param("categoryLevelCode") String categoryLevelCode); 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 66353b1..2555a09 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 @@ -19,7 +19,7 @@ @Mapper public interface DeviceInfoMapper extends BaseMapper { - List getDeviceInfoListPage(@Param("page") Page page, DeviceInfoRequest deviceInfoRequest); + List getDeviceInfoListPage(@Param("page") Page page, @Param("deviceInfoRequest") DeviceInfoRequest deviceInfoRequest); List getDeviceInfoList(@Param("deviceInfoRequest") DeviceInfoRequest deviceInfoRequest); @@ -27,6 +27,8 @@ DeviceInfo getByIndexCode(@Param("srcIndex") String srcIndex); + DeviceInfo getByIp(@Param("ip") String ip); + List selectIndexCodesByCodes(@Param("deviceCodes") List deviceCodes); List selectByType(@Param("devType") String devType); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java index 41dd0af..5bfaf63 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java @@ -5,6 +5,7 @@ import com.casic.missiles.modular.dto.DeviceRepairRequest; import com.casic.missiles.modular.model.DeviceRepairLog; import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; import java.util.List; @@ -16,7 +17,7 @@ @Mapper public interface DeviceRepairLogMapper extends BaseMapper { - List getDeviceRepairListPage(Page page, DeviceRepairRequest deviceRepairRequest); + List getDeviceRepairListPage(@Param("page") Page page, @Param("deviceRepairRequest")DeviceRepairRequest deviceRepairRequest); - List getDeviceRepairList(DeviceRepairRequest deviceRepairRequest); + List getDeviceRepairList(@Param("deviceRepairRequest") DeviceRepairRequest deviceRepairRequest); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java index 9035c47..4823ac1 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java @@ -18,7 +18,7 @@ @Mapper public interface FireEquipInfoMapper extends BaseMapper { - List getFireEquipInfoListPage(@Param("page") Page page, FireEquipRequest fireEquipRequest); + List getFireEquipInfoListPage(@Param("page") Page page, @Param("fireEquipRequest") FireEquipRequest fireEquipRequest); FireEquipInfo getFireEquipInfo(@Param("equipCode") String equipCode); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/GateGroupMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/GateGroupMapper.java index d8c330d..977a427 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/GateGroupMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/GateGroupMapper.java @@ -17,7 +17,7 @@ */ @Mapper public interface GateGroupMapper extends BaseMapper { - List getGateGroupListPage(@Param("page") Page page, GateGroupRequest gateGroupRequest); + List getGateGroupListPage(@Param("page") Page page, @Param("gateGroupRequest") GateGroupRequest gateGroupRequest); GateGroup getGateGroupByName(@Param("groupName") String groupName); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/HazardLevelMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/HazardLevelMapper.java index 8957780..dcf47bb 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/HazardLevelMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/HazardLevelMapper.java @@ -17,11 +17,13 @@ @Mapper public interface HazardLevelMapper extends BaseMapper { - List getCaseHazardLevelListPage(@Param("page") Page page, HazardLevelRequest hazardLevelRequest); + List getCaseHazardLevelListPage(@Param("page") Page page, @Param("hazardLevelRequest") HazardLevelRequest hazardLevelRequest); - List getCaseHazardLevelList(HazardLevelRequest hazardLevelRequest); + List getCaseHazardLevelList(@Param("hazardLevelRequest") HazardLevelRequest hazardLevelRequest); CaseHazardLevel getCaseHazardLevel(@Param("hazardLevelCode") String hazardLevelCode); List selectHazardName(); + + String selectHazardNameByCode(@Param("hazardLevelCode") String hazardLevelCode); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/HikCaseDefineMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/HikCaseDefineMapper.java index 0dc47d1..f162fef 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/HikCaseDefineMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/HikCaseDefineMapper.java @@ -12,5 +12,5 @@ */ @Mapper public interface HikCaseDefineMapper extends BaseMapper { - HikCaseDefine getHikCaseDefine(@Param("caseTypeCode") Long caseTypeCode); + HikCaseDefine getHikCaseDefine(@Param("caseTypeCode") Number caseTypeCode); } 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 f8a674c..fe5afc2 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 @@ -17,11 +17,13 @@ @Mapper public interface StaffInfoMapper extends BaseMapper { - List getStaffInfoListPage(@Param("page") Page page, StaffInfoRequest staffInfoRequest); + List getStaffInfoListPage(@Param("page") Page page, @Param("staffInfoRequest") StaffInfoRequest staffInfoRequest); StaffInfo selectByCode(@Param("staffCode") String staffCode); - List getStaffInfoList(StaffInfoRequest staffInfoRequest); + List getStaffInfoList(@Param("staffInfoRequest") StaffInfoRequest staffInfoRequest); - List selectBatchCodes(List list); + List selectBatchCodes(@Param("list") List list); + + int updateByCodeForCard(@Param("staffCode") String staffCode, @Param("cardNo") String cardNo); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitInfoMapper.java index b1217c5..6c52542 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitInfoMapper.java @@ -16,7 +16,7 @@ */ @Mapper public interface VisitInfoMapper extends BaseMapper { - List getVisitInfoListPage(@Param("page") Page page, VisitorRequest visitorRequest); + List getVisitInfoListPage(@Param("page") Page page, @Param("visitorRequest") VisitorRequest visitorRequest); VisitInfo selectByOrderId(@Param("orderId") String orderId); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitorApplyMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitorApplyMapper.java index c09f3c0..6ea55bd 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitorApplyMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitorApplyMapper.java @@ -18,7 +18,7 @@ @Mapper public interface VisitorApplyMapper extends BaseMapper { - List getVisitorApplyListPage(@Param("page") Page page, VisitorApplyRequest visitorApplyRequest); + List getVisitorApplyListPage(@Param("page") Page page, @Param("visitorApplyRequest") VisitorApplyRequest visitorApplyRequest); List selectByVisitReason(); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/BlackListController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/BlackListController.java index a27f9f8..0c06661 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/BlackListController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/BlackListController.java @@ -1,13 +1,18 @@ package com.casic.missiles.modular.controller; +import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.base.controller.ExportController; import com.casic.missiles.core.page.PageFactory; import com.casic.missiles.model.response.ResponseData; import com.casic.missiles.modular.dto.BlackInfoRequest; +import com.casic.missiles.modular.dto.BlackPictureRequest; +import com.casic.missiles.modular.dto.hik.PersonInfoRequest; +import com.casic.missiles.modular.enums.HikUri; import com.casic.missiles.modular.enums.OperateTypeEnum; import com.casic.missiles.modular.model.BlackInfo; import com.casic.missiles.modular.service.BlackInfoService; +import com.casic.missiles.modular.util.HikUtil; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; @@ -56,4 +61,22 @@ return null; } + /** + * 黑名单人员照片 + */ + @PostMapping("/personPicture") + @ResponseBody + public Object personPicture(@RequestBody BlackPictureRequest blackPictureRequest){ + //获取照片 + String picUri = blackPictureRequest.getPicUri(); + String serverIndexCode = blackPictureRequest.getServerIndexCode(); + PersonInfoRequest picRequest = new PersonInfoRequest(); + picRequest.setPicUri(picUri); + picRequest.setServerIndexCode(serverIndexCode); + String reBody = JSONObject.toJSONString(picRequest); + //重定向地址获取 + String url = HikUtil.hikApiFor302(HikUri.PERSON_PICTURE, reBody); + return ResponseData.success(url); + } + } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/DeviceController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/DeviceController.java index e1c4eba..666bbee 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/DeviceController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/DeviceController.java @@ -107,7 +107,7 @@ } /** - * 设备维修管理查询(分页),需计算MTTR=总维修时间/故障次数 + * 设备状态计算与评判/设备维修管理查询(分页),需计算MTTR=总维修时间/故障次数 */ @PostMapping("/repair/listPage") @ResponseBody @@ -211,7 +211,7 @@ //需根据设备编号获取到对应的门禁点唯一标识 doorControlRequest.setDoorIndexCodes(indexCodes); doorControlRequest.setControlType(Integer.valueOf(gateGroupDTO.getStatus())); - String body = JSONObject.toJSONString(deviceCodes); + String body = JSONObject.toJSONString(doorControlRequest); String resultStr = HikUtil.hikApi(HikUri.DOOR_CONTROL, body); JSONObject resultJson = (JSONObject)JSONObject.parse(resultStr); if (!"0".equals(resultJson.get("code"))) { diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/StaffController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/StaffController.java index b58ccab..704093c 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/StaffController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/StaffController.java @@ -2,15 +2,21 @@ import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.util.StrUtil; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.base.controller.ExportController; import com.casic.missiles.core.page.PageFactory; import com.casic.missiles.model.response.ErrorResponseData; import com.casic.missiles.model.response.ResponseData; import com.casic.missiles.modular.dto.StaffInfoRequest; +import com.casic.missiles.modular.dto.hik.PersonInfoRequest; +import com.casic.missiles.modular.dto.hik.StaffCardRequest; +import com.casic.missiles.modular.enums.HikUri; import com.casic.missiles.modular.enums.OperateTypeEnum; import com.casic.missiles.modular.model.StaffInfo; import com.casic.missiles.modular.service.StaffInfoService; +import com.casic.missiles.modular.util.HikUtil; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; @@ -110,4 +116,60 @@ } return ResponseData.success(); } + + /** + * 批量开卡,添加人员之后调用,若在一个接口中添加人员成功开卡失败则第二次添加时会有问题 + */ + @PostMapping("/cardBinding") + @ResponseBody + public Object cardBinding(@RequestBody StaffCardRequest staffCardRequest) { + String body = JSONObject.toJSONString(staffCardRequest); + String resultStr = HikUtil.hikApi(HikUri.CARD_BINDING, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (!"0".equals(resultJson.get("code"))) { + log.error("请求海康,批量开卡失败,海康response:{}", resultStr); + return ResponseData.error("批量开卡失败"); + } + //保存卡号 + if(staffInfoService.saveCardInfo(staffCardRequest) > 0){ + return ResponseData.success(); + } + return ResponseData.error("批量开卡失败"); + } + + /** + * 获取员工照片,海康存储 + */ + @PostMapping("/personPicture/{staffCode}") + @ResponseBody + public Object personPicture(@PathVariable("staffCode") String staffCode){ + //获取员工详细信息,含图片服务器、uri + PersonInfoRequest request = new PersonInfoRequest(); + List list = new ArrayList<>(); + list.add(staffCode); + request.setParamName("personId"); + request.setParamValue(list); + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi(HikUri.PERSON_INFO, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (!"0".equals(resultJson.get("code"))) { + log.error("请求海康,根据人员唯一字段获取人员详细信息失败,海康response:{}", resultStr); + return ResponseData.error("获取员工照片失败"); + } + //获取照片 + JSONObject data = (JSONObject) resultJson.get("data"); + JSONArray dataArray = (JSONArray) data.get("list"); + JSONObject jsonObject = (JSONObject) dataArray.get(0); + JSONArray personPhoto = (JSONArray) jsonObject.get("personPhoto"); + JSONObject photo = (JSONObject) personPhoto.get(0); + String picUri = photo.getString("picUri"); + String serverIndexCode = photo.getString("serverIndexCode"); + PersonInfoRequest picRequest = new PersonInfoRequest(); + picRequest.setPicUri(picUri); + picRequest.setServerIndexCode(serverIndexCode); + String reBody = JSONObject.toJSONString(picRequest); + //重定向地址获取 + String url = HikUtil.hikApiFor302(HikUri.PERSON_PICTURE, reBody); + return ResponseData.success(url); + } } 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 4a07dd9..7b1dcf6 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 @@ -16,6 +16,7 @@ import com.casic.missiles.modular.redis.key.CacheKeys; import com.casic.missiles.modular.service.CockpitService; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.util.CollectionUtils; import org.springframework.web.bind.annotation.*; @@ -24,10 +25,7 @@ import java.text.NumberFormat; import java.time.LocalDateTime; import java.time.temporal.ChronoUnit; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.util.*; import java.util.stream.Collectors; /** @@ -73,6 +71,9 @@ private StatisticNumberMapper numberMapper; @Autowired + private HazardLevelMapper hazardLevelMapper; + + @Autowired private AccessGroupConfig accessGroupConfig; /** @@ -104,8 +105,24 @@ public Object buildingNumberPerHour(){ //当天按小时分组的人数 List list = numberMapper.selectListByTime(); - Map> collect = list.stream().collect(Collectors.groupingBy(BuildingNumberDTO::getStatisticPosition)); - return ResponseData.success(collect); + Map> collect = list.stream().collect(Collectors.groupingBy(BuildingNumberDTO::getStatisticTime)); + //定时任务中已将每小时三栋楼人数存到数据库 + //将一期主楼和录制楼人数合并,二期单算 + List> resultList = new ArrayList<>(); + collect.keySet().forEach(key -> { + List buildingNumberDTOS = collect.get(key); + BuildingNumberDTO mainBuildingOne = buildingNumberDTOS.get(0); + BuildingNumberDTO mainBuildingTwo = buildingNumberDTOS.get(1); + BuildingNumberDTO recordingBuilding = buildingNumberDTOS.get(2); + HashMap resultMap = new HashMap<>(); + Integer oneQuantity = Integer.valueOf(mainBuildingOne.getStatisticQuantity()); + Integer recordingQuantity = Integer.valueOf(recordingBuilding.getStatisticQuantity()); + resultMap.put("staticTime", mainBuildingOne.getStatisticTime()); + resultMap.put(mainBuildingOne.getStatisticPositionName()+"、"+recordingBuilding.getStatisticPositionName(), String.valueOf(oneQuantity+recordingQuantity)); + resultMap.put(mainBuildingTwo.getStatisticPositionName(), mainBuildingTwo.getStatisticQuantity()); + resultList.add(resultMap); + }); + return ResponseData.success(resultList); } /** @@ -151,12 +168,11 @@ public Object securityNumber() { QueryWrapper wrapper = new QueryWrapper<>(); wrapper.eq("staff_type", 2); + // TODO: 2022/9/2 后续使用产品确定的每天出勤的安保人员的数量 Integer total = staffInfoMapper.selectCount(wrapper); - //当日离岗事件个数 - QueryWrapper wrapper1 = new QueryWrapper<>(); - wrapper1.eq("hik_event_type", SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); - wrapper1.apply("date_format(now(),'%Y-%m-%d') = date_format(happen_time,'%Y-%m-%d')"); - Integer leave = caseInfoMapper.selectCount(wrapper1); + //当日离岗事件按设备去重后的个数 + // TODO: 2022/9/2 目前相当于24小时内的计算,之后看需要可改成自定义小时数计算离岗率,即离岗+6小时内仅一次离岗则恢复为100%,多次则累加离岗次数计算离岗率 + Integer leave = caseInfoMapper.selectDemobilizedCount(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); NumberFormat numberFormat = NumberFormat.getInstance(); // 设置精确到小数点后2位 numberFormat.setMaximumFractionDigits(2); @@ -179,7 +195,6 @@ @ResponseBody public Object visitorApplyDetail() { List reasonGroup = applyMapper.selectByVisitReason(); - HashMap resultMap = new HashMap<>(); NumberFormat numberFormat = NumberFormat.getInstance(); // 设置精确到小数点后2位 numberFormat.setMaximumFractionDigits(2); @@ -187,12 +202,17 @@ if(0 == sum){ return ResponseData.success(); } + List resultList = new ArrayList<>(); reasonGroup.forEach(group -> { String reasonName = dictService.getDictNameByCode(SecurityEventDict.VISIT_REASON, group.getVisitReason()); String result = numberFormat.format((float) group.getQuantity() / (float) sum * 100); - resultMap.put(reasonName, result+"%"); + ApplyReasonGroupDTO applyReasonGroupDTO = new ApplyReasonGroupDTO(); + applyReasonGroupDTO.setQuantity(group.getQuantity()); + applyReasonGroupDTO.setVisitReason(reasonName); + applyReasonGroupDTO.setRatio(result+"%"); + resultList.add(applyReasonGroupDTO); }); - return ResponseData.success(resultMap); + return ResponseData.success(resultList); } /** @@ -247,6 +267,32 @@ } /** + * 机动力量实时在岗率,在岗人数除以总应在岗人数,用离岗+6小时内恢复为100%,6小时外再计算 + */ + @GetMapping("/staff/beOnDutyRatio") + @ResponseBody + public Object beOnDutyRatio() { + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("staff_type", 2); + // TODO: 2022/9/2 后续使用产品确定的每天出勤的安保人员的数量 + Integer total = staffInfoMapper.selectCount(wrapper); + if(0 == total){ + return ResponseData.success(null); + } + //当日离岗事件按设备去重后的个数 + // TODO: 2022/9/2 目前相当于24小时内的计算,之后看需要可改成自定义小时数计算离岗率,即离岗+6小时内仅一次离岗则恢复为100%,多次则累加离岗次数计算离岗率 + List onDutyRatioDTOS = caseInfoMapper.selectDemobilizedCountByHour(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); + onDutyRatioDTOS.forEach(dto -> { + NumberFormat numberFormat = NumberFormat.getInstance(); + // 设置精确到小数点后2位 + numberFormat.setMaximumFractionDigits(2); + String result = numberFormat.format(100 - Float.valueOf(dto.getQuantity()) / (float) total * 100); + dto.setRatio(result+"%"); + }); + return ResponseData.success(onDutyRatioDTOS); + } + + /** * 闸机速通门统计-设备状态分组计算数量,devType传闸机字典key * 视频频监控摄像机统计-设备状态分组计算数量,devType传摄像头字典key */ @@ -262,12 +308,17 @@ if(sum <= 0){ return ResponseData.error("无该类设备信息"); } + List resultList = new ArrayList<>(); gateStatusGroup.forEach(group -> { String devStatus = dictService.getDictNameByCode(SecurityEventDict.DEVICE_STATUS, group.getStatus()); String result = numberFormat.format((float) group.getQuantity() / (float) sum * 100); - resultMap.put(devStatus, result+"%"); + GateStatusGroupResponse gateStatusGroupResponse = new GateStatusGroupResponse(); + gateStatusGroupResponse.setStatus(devStatus); + gateStatusGroupResponse.setRatio(result+"%"); + resultList.add(gateStatusGroupResponse); }); - resultMap.put("总", sum); + resultMap.put("total", sum); + resultMap.put("list", resultList); return ResponseData.success(resultMap); } @@ -282,17 +333,38 @@ String position = securityScoreDTO.getPosition(); List caseInfos = caseInfoMapper.selectByPosition(position); //查询各危险级别权重、各类别权重,放入map,避免循环中多次查数据库 - + HashMap hazardScoreMap = new HashMap<>(); + List caseHazardLevelList = hazardLevelMapper.getCaseHazardLevelList(null); + caseHazardLevelList.forEach(hazardLevel -> { + hazardScoreMap.put(hazardLevel.getCode(), hazardLevel.getWeight()); + }); + HashMap categoryScoreMap = new HashMap<>(); + List categoryLevelList = categoryLevelMapper.getCaseCategoryLevelList(null); + categoryLevelList.forEach(categoryLevel -> { + categoryScoreMap.put(categoryLevel.getCode(), categoryLevel.getWeight()); + }); + //事件按楼层分组,计算 List securityScoreDTOs = new ArrayList<>(); caseInfos.forEach(caseInfo -> { SecurityScoreDTO securityScoreDTO1 = new SecurityScoreDTO(); + securityScoreDTO1.setPosition(caseInfo.getPosition()); securityScoreDTO1.setArea(caseInfo.getArea()); - // TODO: 2022/8/4 楼层评分计算根据产品定义调整 -// caseInfo.get -// securityScoreDTO1.setScore(); + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); + Double score = 100 - Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + securityScoreDTO1.setScore(score); + securityScoreDTOs.add(securityScoreDTO1); }); - - return null; + 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); + }); + return ResponseData.success(securityScoreDTOs); } /** @@ -303,9 +375,13 @@ public Object SecurityFrequency(@RequestBody SecurityFrequencyDTO securityFrequencyDTO) { String year = securityFrequencyDTO.getYear(); String month = securityFrequencyDTO.getMonth(); - Integer quantity = caseInfoMapper.selectCountByMonth(year, month); - securityFrequencyDTO.setQuantity(quantity); - return ResponseData.success(securityFrequencyDTO); + if(!StringUtils.isEmpty(year) && StringUtils.isEmpty(month)){ + Integer quantity = caseInfoMapper.selectCountByMonth(year, month); + securityFrequencyDTO.setQuantity(quantity); + return ResponseData.success(securityFrequencyDTO); + } + List list = caseInfoMapper.selectPreMonthCount(); + return ResponseData.success(list); } } 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 ae4d770..f4f075c 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 @@ -1,20 +1,25 @@ package com.casic.missiles.modular.controller.cockpit; +import cn.hutool.core.date.DateUnit; import cn.hutool.core.date.DateUtil; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.casic.missiles.model.response.ResponseData; -import com.casic.missiles.modular.dao.AttendanceInfoMapper; -import com.casic.missiles.modular.dao.CaseInfoMapper; -import com.casic.missiles.modular.dao.HazardLevelMapper; -import com.casic.missiles.modular.dao.StaffInfoMapper; +import com.casic.missiles.modular.dao.*; +import com.casic.missiles.modular.dto.DeviceRepairLogDTO; +import com.casic.missiles.modular.dto.DeviceRepairRequest; import com.casic.missiles.modular.dto.statistics.*; +import com.casic.missiles.modular.enums.SecurityEventType; +import com.casic.missiles.modular.model.CaseCategoryLevel; import com.casic.missiles.modular.model.CaseHazardLevel; +import com.casic.missiles.modular.model.CaseInfo; import com.casic.missiles.modular.model.StaffInfo; +import com.casic.missiles.modular.service.DeviceInfoService; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.util.CollectionUtils; import org.springframework.web.bind.annotation.*; +import java.math.BigDecimal; import java.text.NumberFormat; import java.util.*; import java.util.stream.Collectors; @@ -40,6 +45,12 @@ @Autowired private HazardLevelMapper hazardLevelMapper; + @Autowired + private CategoryLevelMapper categoryLevelMapper; + + @Autowired + private DeviceInfoService deviceInfoService; + /** * 安防事件时域频次统计,每月的每天安防事件个数(原方案) * 月维度:展示每个月的每天的数据 @@ -89,15 +100,17 @@ List monthList = caseInfoMapper.selectPreMonthCountByYear(year); Map> collect = monthList.stream().collect(Collectors.groupingBy(PreMonthOrWeekCaseDTO::getHazardLevelCode)); HashMap strAvgMap = new HashMap<>(); + List resultList = new ArrayList<>(); for (String key : collect.keySet()) { List preMonthOrWeekCaseDTOS = collect.get(key); int sum = preMonthOrWeekCaseDTOS.stream().mapToInt(PreMonthOrWeekCaseDTO::getQuantity).sum(); //若年份是本年,则使用个安防级别数量/当前月份数 //若不是本年,除数为12 MonthAndWeekDTO monthAndWeekDTO = new MonthAndWeekDTO(); + String hazardName = hazardLevelMapper.selectHazardNameByCode(key); + monthAndWeekDTO.setLevelName(hazardName); if(year.equals(String.valueOf(DateUtil.thisYear()))){ monthAndWeekDTO.setMonthQuantity(sum / DateUtil.thisMonth()); -// monthAndWeekDTO.setLevelName(); strAvgMap.put(key, monthAndWeekDTO); }else{ monthAndWeekDTO.setMonthQuantity(sum / 12); @@ -113,27 +126,37 @@ if(year.equals(String.valueOf(DateUtil.thisYear()))){ if(!Objects.isNull(strAvgMap.get(key))){ MonthAndWeekDTO monthAndWeekDTO = strAvgMap.get(key); + String hazardName = hazardLevelMapper.selectHazardNameByCode(key); + monthAndWeekDTO.setLevelName(hazardName); monthAndWeekDTO.setWeekQuantity(sum / DateUtil.thisWeekOfYear()); strAvgMap.put(key, monthAndWeekDTO); }else{ MonthAndWeekDTO monthAndWeekDTO = new MonthAndWeekDTO(); + String hazardName = hazardLevelMapper.selectHazardNameByCode(key); + monthAndWeekDTO.setLevelName(hazardName); monthAndWeekDTO.setWeekQuantity(sum / DateUtil.thisWeekOfYear()); strAvgMap.put(key, monthAndWeekDTO); } }else{ if(!Objects.isNull(strAvgMap.get(key))){ MonthAndWeekDTO monthAndWeekDTO = strAvgMap.get(key); + String hazardName = hazardLevelMapper.selectHazardNameByCode(key); + monthAndWeekDTO.setLevelName(hazardName); monthAndWeekDTO.setWeekQuantity(sum / 52); strAvgMap.put(key, monthAndWeekDTO); }else{ MonthAndWeekDTO monthAndWeekDTO = new MonthAndWeekDTO(); + String hazardName = hazardLevelMapper.selectHazardNameByCode(key); + monthAndWeekDTO.setLevelName(hazardName); monthAndWeekDTO.setWeekQuantity(sum / 52); strAvgMap.put(key, monthAndWeekDTO); } } } - avgMonthAndWeekGroupDTO.setMap(strAvgMap); - return ResponseData.success(avgMonthAndWeekGroupDTO); + strAvgMap.keySet().forEach(key -> { + resultList.add(strAvgMap.get(key)); + }); + return ResponseData.success(resultList); } /** @@ -181,12 +204,178 @@ } /** - * 员工考勤人数变化,功能待定 + * 员工考勤人数变化,统计当天(横坐标为时)及近7天(横坐标为天)的考勤人数变化,只要发生一次考勤识别,次数的基数就正常增加(没有上班下班区分) */ + @PostMapping("/staff/attendanceNumber/{dimension}") + @ResponseBody + public Object attendanceNumber(@PathVariable("dimension") String dimension) { + List attendanceNumberDTOs = null; + List> resultList = new ArrayList<>(); + if("week".equals(dimension)){ + //近7天数据按天分组统计 + attendanceNumberDTOs = attendanceInfoMapper.getCountForWeek(); + }else if("day".equals(dimension)) { + //今天数据按小时分组统计 + attendanceNumberDTOs = attendanceInfoMapper.getCountForDay(); + } + if(CollectionUtils.isEmpty(attendanceNumberDTOs)){ + return ResponseData.error("该查询条件下,无员工出勤数据!"); + } + Map> collect = attendanceNumberDTOs.stream().collect(Collectors.groupingBy(AttendanceNumberDTO::getDate)); + collect.keySet().forEach(key -> { + List attendanceNumberDTOS = collect.get(key); + AttendanceNumberDTO attendanceNumberDTO = attendanceNumberDTOS.get(0); + AttendanceNumberDTO attendanceNumberDTO2 = attendanceNumberDTOS.get(1); + Map resultMap = new HashMap<>(); + resultMap.put(attendanceNumberDTO.getStaffType(), attendanceNumberDTO.getQuantity()); + resultMap.put(attendanceNumberDTO2.getStaffType(), attendanceNumberDTO2.getQuantity()); + resultMap.put("staticTime", attendanceNumberDTO.getDate()); + resultList.add(resultMap); + }); + return ResponseData.success(resultList); + } /** - * 近30天/近一周安保人员到岗排行 + * 早晚高峰区域安防评估 */ + @PostMapping("/security/assessment/{dimension}") + @ResponseBody + public Object securityAssessment(@PathVariable("dimension") String dimension) { + //查询各危险级别权重、各类别权重,放入map,避免循环中多次查数据库 + HashMap hazardScoreMap = new HashMap<>(); + List caseHazardLevelList = hazardLevelMapper.getCaseHazardLevelList(null); + caseHazardLevelList.forEach(hazardLevel -> { + hazardScoreMap.put(hazardLevel.getCode(), hazardLevel.getWeight()); + }); + HashMap categoryScoreMap = new HashMap<>(); + List categoryLevelList = categoryLevelMapper.getCaseCategoryLevelList(null); + categoryLevelList.forEach(categoryLevel -> { + categoryScoreMap.put(categoryLevel.getCode(), categoryLevel.getWeight()); + }); + HashMap hashMap = new HashMap<>(); + if("week".equals(dimension)){ + //近7天早晚高峰数据 + List caseInfos = caseInfoMapper.selectListBySevenDay(); + //按时间(天)进行分组 + caseInfos.forEach(caseInfo -> { + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); + Double score = Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + String[] array = caseInfo.getHappenTime().split(" "); + String dayTime = array[0]; + BigDecimal preScore; + if(hashMap.containsKey(dayTime)){ + Double aDouble = hashMap.get(dayTime); + preScore = new BigDecimal(aDouble.toString()); + + }else{ + preScore = new BigDecimal("100.0"); + } + BigDecimal nowScore = new BigDecimal(score.toString()); + hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); + }); + return ResponseData.success(hashMap); + }else if("day".equals(dimension)) { + //今天数据按小时分组统计 + List caseInfos = caseInfoMapper.selectListByToday(); + caseInfos.forEach(caseInfo -> { + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); + Double score = Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + String[] array = caseInfo.getHappenTime().split(":"); + String dayTime = array[0]; + BigDecimal preScore; + if(hashMap.containsKey(dayTime)){ + Double aDouble = hashMap.get(dayTime); + preScore = new BigDecimal(aDouble.toString()); + + }else{ + preScore = new BigDecimal("100.0"); + } + BigDecimal nowScore = new BigDecimal(score.toString()); + hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); + }); + return ResponseData.success(hashMap); + } + return null; + } + + /** + * 重点区域安防事态评估,统计重点区域6:00-23:00按小时分组数据 + */ + @GetMapping("/security/keyAreaStatistic") + @ResponseBody + public Object keyAreaStatistic() { + //查询各危险级别权重、各类别权重,放入map,避免循环中多次查数据库 + HashMap hazardScoreMap = new HashMap<>(); + List caseHazardLevelList = hazardLevelMapper.getCaseHazardLevelList(null); + caseHazardLevelList.forEach(hazardLevel -> { + hazardScoreMap.put(hazardLevel.getCode(), hazardLevel.getWeight()); + }); + HashMap categoryScoreMap = new HashMap<>(); + List categoryLevelList = categoryLevelMapper.getCaseCategoryLevelList(null); + categoryLevelList.forEach(categoryLevel -> { + categoryScoreMap.put(categoryLevel.getCode(), categoryLevel.getWeight()); + }); + HashMap hashMap = new HashMap<>(); + //今天数据按小时分组统计 + List caseInfos = caseInfoMapper.selectListByToday2(); + caseInfos.forEach(caseInfo -> { + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); + Double score = Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + String[] array = caseInfo.getHappenTime().split(":"); + String dayTime = array[0]; + BigDecimal preScore; + if(hashMap.containsKey(dayTime)){ + Double aDouble = hashMap.get(dayTime); + preScore = new BigDecimal(aDouble.toString()); + + }else{ + preScore = new BigDecimal("100.0"); + } + BigDecimal nowScore = new BigDecimal(score.toString()); + hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); + }); + return ResponseData.success(hashMap); + } + + /** + * 安防机动支援力量调配响应评估,根据事件已解决状态及已解决时间-发送时间,按时间(小时)分组统计 + */ + @GetMapping("/security/responseAssess") + @ResponseBody + public Object responseAssess() { + //查询各危险级别权重、各类别权重,放入map,避免循环中多次查数据库 + HashMap hazardScoreMap = new HashMap<>(); + List caseHazardLevelList = hazardLevelMapper.getCaseHazardLevelList(null); + caseHazardLevelList.forEach(hazardLevel -> { + hazardScoreMap.put(hazardLevel.getCode(), hazardLevel.getWeight()); + }); + HashMap hashMap = new HashMap<>(); + //今天数据按小时分组统计 + List caseInfos = caseInfoMapper.selectListByToday3(); + caseInfos.forEach(caseInfo -> { + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + //扣分=事件级别权重*未解决小时数 + Date updateTime = DateUtil.parse(caseInfo.getUpdateTime()); + Date happenTime = DateUtil.parse(caseInfo.getHappenTime()); + long between = DateUtil.between(updateTime, happenTime, DateUnit.HOUR); + Double score = Double.valueOf(hazardWeight)*between; + String[] array = caseInfo.getHappenTime().split(":"); + String dayTime = array[0]; + BigDecimal preScore; + if(hashMap.containsKey(dayTime)){ + Double aDouble = hashMap.get(dayTime); + preScore = new BigDecimal(aDouble.toString()); + }else{ + preScore = new BigDecimal("100.0"); + } + BigDecimal nowScore = new BigDecimal(score.toString()); + hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); + }); + return ResponseData.success(hashMap); + } /** * 重点区域威胁事件类型统计,优先级2,统计近7天和近30天 @@ -224,7 +413,34 @@ } /** - * 设备状态计算系数和评判,优先级3,需确认设备恢复时间是否可以获取 + * 近30天/近一周安保人员到岗排行 */ + + /** + * 安保等级评估,发生离岗事件减1分 + */ + @GetMapping("/security/levelAssess") + @ResponseBody + public Object securityLevelAssess() { + //今天数据按小时分组统计 + List resultList = caseInfoMapper.selectListByType(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); + resultList.forEach(result -> { + BigDecimal deScore = new BigDecimal(result.getQuantity()); + BigDecimal preScore = new BigDecimal("100.0"); + result.setScore(preScore.subtract(deScore).doubleValue()); + }); + return ResponseData.success(resultList); + } + + /** + * 设备状态计算系数和评判,即设备维修管理查询(不分页) + */ + @PostMapping("/device/repairList") + @ResponseBody + public Object repairList(@RequestBody DeviceRepairRequest deviceRepairRequest) { + List deviceRepairLogDTOS = deviceInfoService.deviceRepairListPage(deviceRepairRequest); + return ResponseData.success(deviceRepairLogDTOS); + } + } 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 fbf8ab6..c71a15a 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 @@ -1,13 +1,12 @@ package com.casic.missiles.modular.controller.hik; +import cn.hutool.core.date.DateTime; +import cn.hutool.core.date.DateUtil; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.casic.missiles.model.response.ResponseData; import com.casic.missiles.modular.dao.HikFaceGroupInfoMapper; -import com.casic.missiles.modular.dto.hik.EventSubscribeRequest; -import com.casic.missiles.modular.dto.hik.FaceGroupAdditionRequest; -import com.casic.missiles.modular.dto.hik.HikRecvEvent; -import com.casic.missiles.modular.dto.hik.OrgBatchAdd; +import com.casic.missiles.modular.dto.hik.*; import com.casic.missiles.modular.enums.HikUri; import com.casic.missiles.modular.enums.SecurityEventType; import com.casic.missiles.modular.model.CaseInfo; @@ -18,16 +17,20 @@ import com.casic.missiles.modular.util.CaseInfoFactoryUtil; import com.casic.missiles.modular.util.HikUtil; import com.casic.missiles.modular.util.ThreadPoolUtil; +import com.casic.missiles.modular.util.WebSocket; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; -import org.springframework.web.bind.annotation.*; +import org.springframework.util.CollectionUtils; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.RestController; -import java.net.InetAddress; -import java.net.UnknownHostException; import java.util.ArrayList; +import java.util.Iterator; import java.util.List; import java.util.Objects; @@ -38,7 +41,6 @@ */ @Slf4j @RestController -@RequestMapping("/hik") public class HikController { @Autowired @@ -53,28 +55,37 @@ @Autowired private HikService hikService; + @Autowired + private HikFaceGroupInfoMapper hikFaceGroupInfoMapper; + + @Autowired + private WebSocket webSocket; + @Value("${server.port}") private int serverPort; - @Autowired - private HikFaceGroupInfoMapper hikFaceGroupInfoMapper; /** * 海康事件订阅 */ - @PostMapping("/event/subscribe") + @PostMapping("/hik/event/subscribe") @ResponseBody - public Object eventSubscribe() throws UnknownHostException { + public Object eventSubscribe() { EventSubscribeRequest eventSubscribeRequest = new EventSubscribeRequest(); ArrayList list = new ArrayList<>(); list.add(SecurityEventType.DEVICE_OFFLINE); + list.add(SecurityEventType.DEVICE_ONLINE); list.add(SecurityEventType.KEY_PERSONNEL_IDENTIFY_EVENT); list.add(SecurityEventType.MONITORING_POINT_OFFLINE); + list.add(SecurityEventType.MONITORING_POINT_ONLINE); list.add(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); list.add(SecurityEventType.PERSONNEL_GATHER_EVENT); - InetAddress localHost = InetAddress.getLocalHost(); + list.add(SecurityEventType.VISITOR_REGISTER); + list.add(SecurityEventType.VISITOR_CHECKOUT); + list.add(SecurityEventType.HIGH_ALTITUDE_PARABOLIC); +// InetAddress localHost = InetAddress.getLocalHost(); eventSubscribeRequest.setEventTypes(list); - eventSubscribeRequest.setEventDest("https://" + localHost + ":" + serverPort + "/eventRcv"); + eventSubscribeRequest.setEventDest("http://" + "192.168.10.6" + ":" + serverPort + "/eventRcv"); //订阅类型,0-订阅原始事件,1-联动事件,2-原始事件和联动事件,不填使用默认值0 eventSubscribeRequest.setSubType(0); /** @@ -92,19 +103,25 @@ } /** + * 查询事件订阅信息 + */ + @PostMapping("/hik/event/query") + @ResponseBody + public Object eventQuery() { + String result = HikUtil.hikApi(HikUri.EVENT_INFO, ""); + return result; + } + + /** * 海康事件接收 */ @PostMapping("/eventRcv") @ResponseBody public Object eventRcv(@RequestBody HikRecvEvent hikRecvEvent) { //1、接收所需事件类型 - Long eventType = hikRecvEvent.getEventType(); + Number eventType = hikRecvEvent.getEventType(); log.info("接收到安防事件类型为:{}", eventType); CaseInfo caseInfo = caseInfoFactoryUtil.getCaseInfo(eventType); - //接收到不关心事件直接返回 - if(Objects.isNull(caseInfo)){ - return ResponseData.success(); - } //2、不同事件不同处理,caseInfoFactoryUtil已设置好事件基础定义信息 // 再为事件添加状态、设备编码、设备名称、位置、区域、时间 // 异步处理事件 @@ -114,19 +131,23 @@ caseHandle(hikRecvEvent, eventType, caseInfo); } })); +// caseHandle(hikRecvEvent, eventType, caseInfo); - return null; + return ResponseData.success(); } - private void caseHandle(HikRecvEvent hikRecvEvent, Long eventType, CaseInfo caseInfo) { + private void caseHandle(HikRecvEvent hikRecvEvent, Number eventType, CaseInfo caseInfo) { JSONArray eventArray = hikRecvEvent.getEventArray(); List caseInfos = new ArrayList<>(); - while (eventArray.stream().iterator().hasNext()) { + Iterator iterator = eventArray.iterator(); + while (iterator.hasNext()) { CaseInfo caseInfo1 = new CaseInfo(); - BeanUtils.copyProperties(caseInfo, caseInfo1); - JSONObject event = (JSONObject) eventArray.stream().iterator().next(); + if(!Objects.isNull(caseInfo)){ + BeanUtils.copyProperties(caseInfo, caseInfo1); + } + JSONObject event = (JSONObject) iterator.next(); //5种事件进行不同处理 - if(SecurityEventType.KEY_PERSONNEL_IDENTIFY_EVENT == eventType){ + if (SecurityEventType.KEY_PERSONNEL_IDENTIFY_EVENT.equals(eventType)) { //判断所属人脸分组 JSONObject data = (JSONObject) event.get("data"); JSONObject faceRecognitionResult = (JSONObject) data.get("faceRecognitionResult"); @@ -142,52 +163,101 @@ if (faceGroupCode.equals(blackListGroup.getFaceGroupCode())) { //黑名单分组处理 caseInfo1 = hikService.blackListHandle(event, caseInfo1); - }else if(faceGroupCode.equals(propertyPersonnelGroup.getFaceGroupCode())){ + } else if (faceGroupCode.equals(propertyPersonnelGroup.getFaceGroupCode())) { //考勤分组处理-物业人员,添加到考勤表 hikService.propertyAttendanceHandle(event); - }else if(faceGroupCode.equals(securityPersonnelGroup.getFaceGroupCode())){ + } else if (faceGroupCode.equals(securityPersonnelGroup.getFaceGroupCode())) { //考勤分组处理-安保人员,添加到考勤表 hikService.securityPersonnelHandle(event); - }else { + } else { return; } - }else if(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT == eventType){ + } else if (SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT.equals(eventType)) { //离岗事件处理 caseInfo1 = hikService.demobilizedHandle(event, caseInfo1); - }else if(SecurityEventType.PERSONNEL_GATHER_EVENT == eventType){ + } else if (SecurityEventType.PERSONNEL_GATHER_EVENT.equals(eventType)) { //人员聚集事件处理 caseInfo1 = hikService.personGatherHandle(event, caseInfo1); - }else if(SecurityEventType.MONITORING_POINT_OFFLINE == eventType){ + } else if (SecurityEventType.MONITORING_POINT_OFFLINE.equals(eventType)) { //监控点离线事件处理 caseInfo1 = hikService.monitorPointOfflineHandle(event, caseInfo1); - }else if(SecurityEventType.DEVICE_OFFLINE == eventType){ + } else if (SecurityEventType.MONITORING_POINT_ONLINE.equals(eventType)) { + //监控点上线事件处理 + hikService.monitorPointOnlineHandle(event); + } else if (SecurityEventType.DEVICE_OFFLINE.equals(eventType)) { //装置离线事件处理 caseInfo1 = hikService.deviceOfflineHandle(event, caseInfo1); - }else if(SecurityEventType.VISITOR_REGISTER == eventType){ + } else if (SecurityEventType.DEVICE_ONLINE.equals(eventType)) { + //装置上线处理 + hikService.deviceOnlineHandle(event); + } else if (SecurityEventType.VISITOR_REGISTER.equals(eventType)) { //记录访客登记记录,添加到访客记录表 hikService.visitorRegisterHandler(event); - }else if(SecurityEventType.VISITOR_CHECKOUT == eventType){ + } else if (SecurityEventType.VISITOR_CHECKOUT.equals(eventType)) { //记录访客签离记录 hikService.visitorCheckOutHandler(event); } - if(!Objects.isNull(caseInfo1) && !StringUtils.isEmpty(caseInfo1.getHappenTime())){ + if (!Objects.isNull(caseInfo1) && !StringUtils.isEmpty(caseInfo1.getHappenTime())) { caseInfos.add(caseInfo1); } } //3、安防事件入库 - if(!caseInfoService.insertCaseInfoBatch(caseInfos)){ - log.error("安防事件批量入库异常"); + if (!CollectionUtils.isEmpty(caseInfos) && !caseInfoService.insertCaseInfoBatch(caseInfos)) { + log.error("安防事件批量入库异常!"); } // TODO: 2022/8/15 webSocket推送 + if (CollectionUtils.isEmpty(caseInfos)) { + log.info("webSocket事件推送"); + webSocket.sendAllMessage(JSONObject.toJSONString(caseInfos)); + } return; } /** + * 以图搜图,前端用于轨迹追踪 + */ + @PostMapping("/hik/search/picture") + @ResponseBody + public Object searchPictures(@RequestBody SearchPicturesRequest searchPicturesRequest) { + DateTime startDateTime = DateUtil.parse(searchPicturesRequest.getStartTime()); + DateTime endDateTime = DateUtil.parse(searchPicturesRequest.getEndTime()); + String startTime = DateUtil.format(startDateTime, "yyyy-MM-dd'T'HH:mm:ss.SSSXXX"); + String endTime = DateUtil.format(endDateTime, "yyyy-MM-dd'T'HH:mm:ss.SSSXXX"); + searchPicturesRequest.setStartTime(startTime); + searchPicturesRequest.setEndTime(endTime); + String body = JSONObject.toJSONString(searchPicturesRequest); + String resultStr = HikUtil.hikApi(HikUri.SEARCH_PICTURES, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (!"0".equals(resultJson.get("code"))) { + log.error("请求海康,以图搜图失败,海康response:{}", resultStr); + return ResponseData.error("以图搜图失败"); + } + return ResponseData.success(resultJson); + } + + + /** + * 海康事件取消订阅 + */ + @PostMapping("/hik/event/cancel") + @ResponseBody + public Object eventCancelSubscribe(@RequestBody CancelSubscribeRequest cancelSubscribeRequest) { + String body = JSONObject.toJSONString(cancelSubscribeRequest); + String resultStr = HikUtil.hikApi(HikUri.EVENT_CANCEL, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (!"0".equals(resultJson.get("code"))) { + log.error("请求海康,取消订阅失败,海康response:{}", resultStr); + return ResponseData.error("取消订阅失败"); + } + return ResponseData.success(resultJson); + } + + /** * 单个添加海康人脸分组 * api->hik单个添加人脸分组api->response->mysql */ - @PostMapping("/faceGroup/single/add") + @PostMapping("/hik/faceGroup/single/add") @ResponseBody public Object faceGroupAddition(@RequestBody FaceGroupAdditionRequest faceGroupAdditionRequest) { String body = JSONObject.toJSONString(faceGroupAdditionRequest); @@ -212,7 +282,7 @@ * 批量添加海康组织 * api->hik批量添加组织api->response */ - @PostMapping("/org/batch/add") + @PostMapping("/hik/org/batch/add") @ResponseBody public Object orgBatchAdd(@RequestBody List orgBatchAddRequest) { String body = JSONObject.toJSONString(orgBatchAddRequest); @@ -232,4 +302,62 @@ return ResponseData.error("批量添加组织失败"); } + /** + * 获取人员列表 + */ + @PostMapping("/hik/person/personList") + @ResponseBody + public Object personList() { + PersonListRequest request = new PersonListRequest(); + request.setPageNo(1); + request.setPageSize(100); + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi("/api/resource/v2/person/personList", body); + return resultStr; + } + + /** + * 获取组织列表 + */ + @PostMapping("/hik/org/orgList") + @ResponseBody + public Object orgList() { + PersonListRequest request = new PersonListRequest(); + request.setPageNo(1); + request.setPageSize(100); + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi("/api/resource/v1/org/orgList", body); + return resultStr; + } + + /** + * 查询访客权限下载记录 + */ + @PostMapping("/hik/auth/result") + @ResponseBody + public Object authResult() { + PersonListRequest request = new PersonListRequest(); + request.setPageNo(1); + request.setPageSize(100); + request.setOrderId("ba101db6246711edaea66f7939a13638"); + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi("/api/visitor/v1/auth/result", body); + return resultStr; + } + + /** + * 人脸图片获取 + */ + @PostMapping("/hik/face/picture") + @ResponseBody + public Object facePicture() { + FaceRequest request = new FaceRequest(); +// List list = new ArrayList<>(); +// list.add(""); + request.setCertificateNum("wanggong"); + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi("/api/frs/v1/face", body); + return resultStr; + } + } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/AssetInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/AssetInfoMapper.java index 4f64e83..c0684ee 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/AssetInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/AssetInfoMapper.java @@ -17,6 +17,6 @@ @Mapper public interface AssetInfoMapper extends BaseMapper { - List getAssetInfoListPage(@Param("page") Page page, AssetInfoRequest assetInfoRequest); + List getAssetInfoListPage(@Param("page") Page page, @Param("assetInfoRequest") AssetInfoRequest assetInfoRequest); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/AttendanceInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/AttendanceInfoMapper.java index f9e793e..ec87e46 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/AttendanceInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/AttendanceInfoMapper.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.statistics.AttendanceNumberDTO; import com.casic.missiles.modular.dto.statistics.AttendanceRatioDTO; import com.casic.missiles.modular.model.AttendanceInfo; import org.apache.ibatis.annotations.Mapper; @@ -17,7 +18,7 @@ */ @Mapper public interface AttendanceInfoMapper extends BaseMapper { - List getAttendanceInfoListPage(@Param("page") Page page, StaffInfoRequest attendanceInfoRequest); + List getAttendanceInfoListPage(@Param("page") Page page, @Param("attendanceInfoRequest") StaffInfoRequest attendanceInfoRequest); AttendanceInfo selectByCodeAndDate(@Param("staffCode") String staffCode); @@ -26,4 +27,8 @@ List getCountByTypeAndDateForMonth(@Param("staffType")String staffType); List getCountByTypeAndDateForYear(@Param("staffType")String staffType); + + List getCountForWeek(); + + List getCountForDay(); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java index ce94b8f..6137a7d 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java @@ -17,5 +17,5 @@ @Mapper public interface BlackInfoMapper extends BaseMapper { - List getBlackInfoListPage(@Param("page") Page page, BlackInfoRequest blackInfoRequest); + List getBlackInfoListPage(@Param("page") Page page, @Param("blackInfoRequest") BlackInfoRequest blackInfoRequest); } 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 efda6b3..50aaa6f 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 @@ -20,7 +20,7 @@ List getCaseInfoListPage(@Param("page") Page page, @Param("caseInfoRequest") CaseInfoRequest caseInfoRequest); - int updateStatusById(CaseInfoRequest caseInfoRequest); + int updateStatusById(@Param("caseInfoRequest") CaseInfoRequest caseInfoRequest); List selectByLevelAndMonth(@Param("year") String year); @@ -47,4 +47,20 @@ List selectPreWeekCountByThirtyDay(); List selectPreDayCountBySevenDay(); + + Integer selectDemobilizedCount(@Param("eventType") Number personnelDemobilizedEvent); + + List selectPreMonthCount(); + + List selectListBySevenDay(); + + List selectListByToday(); + + List selectListByToday2(); + + List selectListByToday3(); + + List selectListByType(@Param("eventType") Number eventType); + + List selectDemobilizedCountByHour(@Param("eventType") Number eventType); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/CategoryLevelMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/CategoryLevelMapper.java index 52fc714..afe1650 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/CategoryLevelMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/CategoryLevelMapper.java @@ -17,9 +17,9 @@ @Mapper public interface CategoryLevelMapper extends BaseMapper { - List getCaseCategoryLevelListPage(@Param("page") Page page, CategoryLevelRequest categoryLevelRequest); + List getCaseCategoryLevelListPage(@Param("page") Page page, @Param("categoryLevelRequest") CategoryLevelRequest categoryLevelRequest); - List getCaseCategoryLevelList(CategoryLevelRequest categoryLevelRequest); + List getCaseCategoryLevelList(@Param("categoryLevelRequest") CategoryLevelRequest categoryLevelRequest); CaseCategoryLevel getCaseCategoryLevel(@Param("categoryLevelCode") String categoryLevelCode); 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 66353b1..2555a09 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 @@ -19,7 +19,7 @@ @Mapper public interface DeviceInfoMapper extends BaseMapper { - List getDeviceInfoListPage(@Param("page") Page page, DeviceInfoRequest deviceInfoRequest); + List getDeviceInfoListPage(@Param("page") Page page, @Param("deviceInfoRequest") DeviceInfoRequest deviceInfoRequest); List getDeviceInfoList(@Param("deviceInfoRequest") DeviceInfoRequest deviceInfoRequest); @@ -27,6 +27,8 @@ DeviceInfo getByIndexCode(@Param("srcIndex") String srcIndex); + DeviceInfo getByIp(@Param("ip") String ip); + List selectIndexCodesByCodes(@Param("deviceCodes") List deviceCodes); List selectByType(@Param("devType") String devType); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java index 41dd0af..5bfaf63 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java @@ -5,6 +5,7 @@ import com.casic.missiles.modular.dto.DeviceRepairRequest; import com.casic.missiles.modular.model.DeviceRepairLog; import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; import java.util.List; @@ -16,7 +17,7 @@ @Mapper public interface DeviceRepairLogMapper extends BaseMapper { - List getDeviceRepairListPage(Page page, DeviceRepairRequest deviceRepairRequest); + List getDeviceRepairListPage(@Param("page") Page page, @Param("deviceRepairRequest")DeviceRepairRequest deviceRepairRequest); - List getDeviceRepairList(DeviceRepairRequest deviceRepairRequest); + List getDeviceRepairList(@Param("deviceRepairRequest") DeviceRepairRequest deviceRepairRequest); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java index 9035c47..4823ac1 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java @@ -18,7 +18,7 @@ @Mapper public interface FireEquipInfoMapper extends BaseMapper { - List getFireEquipInfoListPage(@Param("page") Page page, FireEquipRequest fireEquipRequest); + List getFireEquipInfoListPage(@Param("page") Page page, @Param("fireEquipRequest") FireEquipRequest fireEquipRequest); FireEquipInfo getFireEquipInfo(@Param("equipCode") String equipCode); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/GateGroupMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/GateGroupMapper.java index d8c330d..977a427 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/GateGroupMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/GateGroupMapper.java @@ -17,7 +17,7 @@ */ @Mapper public interface GateGroupMapper extends BaseMapper { - List getGateGroupListPage(@Param("page") Page page, GateGroupRequest gateGroupRequest); + List getGateGroupListPage(@Param("page") Page page, @Param("gateGroupRequest") GateGroupRequest gateGroupRequest); GateGroup getGateGroupByName(@Param("groupName") String groupName); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/HazardLevelMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/HazardLevelMapper.java index 8957780..dcf47bb 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/HazardLevelMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/HazardLevelMapper.java @@ -17,11 +17,13 @@ @Mapper public interface HazardLevelMapper extends BaseMapper { - List getCaseHazardLevelListPage(@Param("page") Page page, HazardLevelRequest hazardLevelRequest); + List getCaseHazardLevelListPage(@Param("page") Page page, @Param("hazardLevelRequest") HazardLevelRequest hazardLevelRequest); - List getCaseHazardLevelList(HazardLevelRequest hazardLevelRequest); + List getCaseHazardLevelList(@Param("hazardLevelRequest") HazardLevelRequest hazardLevelRequest); CaseHazardLevel getCaseHazardLevel(@Param("hazardLevelCode") String hazardLevelCode); List selectHazardName(); + + String selectHazardNameByCode(@Param("hazardLevelCode") String hazardLevelCode); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/HikCaseDefineMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/HikCaseDefineMapper.java index 0dc47d1..f162fef 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/HikCaseDefineMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/HikCaseDefineMapper.java @@ -12,5 +12,5 @@ */ @Mapper public interface HikCaseDefineMapper extends BaseMapper { - HikCaseDefine getHikCaseDefine(@Param("caseTypeCode") Long caseTypeCode); + HikCaseDefine getHikCaseDefine(@Param("caseTypeCode") Number caseTypeCode); } 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 f8a674c..fe5afc2 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 @@ -17,11 +17,13 @@ @Mapper public interface StaffInfoMapper extends BaseMapper { - List getStaffInfoListPage(@Param("page") Page page, StaffInfoRequest staffInfoRequest); + List getStaffInfoListPage(@Param("page") Page page, @Param("staffInfoRequest") StaffInfoRequest staffInfoRequest); StaffInfo selectByCode(@Param("staffCode") String staffCode); - List getStaffInfoList(StaffInfoRequest staffInfoRequest); + List getStaffInfoList(@Param("staffInfoRequest") StaffInfoRequest staffInfoRequest); - List selectBatchCodes(List list); + List selectBatchCodes(@Param("list") List list); + + int updateByCodeForCard(@Param("staffCode") String staffCode, @Param("cardNo") String cardNo); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitInfoMapper.java index b1217c5..6c52542 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitInfoMapper.java @@ -16,7 +16,7 @@ */ @Mapper public interface VisitInfoMapper extends BaseMapper { - List getVisitInfoListPage(@Param("page") Page page, VisitorRequest visitorRequest); + List getVisitInfoListPage(@Param("page") Page page, @Param("visitorRequest") VisitorRequest visitorRequest); VisitInfo selectByOrderId(@Param("orderId") String orderId); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitorApplyMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitorApplyMapper.java index c09f3c0..6ea55bd 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitorApplyMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitorApplyMapper.java @@ -18,7 +18,7 @@ @Mapper public interface VisitorApplyMapper extends BaseMapper { - List getVisitorApplyListPage(@Param("page") Page page, VisitorApplyRequest visitorApplyRequest); + List getVisitorApplyListPage(@Param("page") Page page, @Param("visitorApplyRequest") VisitorApplyRequest visitorApplyRequest); List selectByVisitReason(); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/AttendanceInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/AttendanceInfoMapper.xml index b2ece71..f8bdd6e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/AttendanceInfoMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/AttendanceInfoMapper.xml @@ -43,7 +43,8 @@ and staff_type = #{staffType} - and YEARWEEK(date_format(atte_date, '%Y-%m-%d'), 1) = YEARWEEK(now(),1); + AND DATE_SUB(CURDATE(), INTERVAL 7 DAY) <= DATE(atte_date) + GROUP BY DATE_FORMAT(atte_date, '%Y-%m-%d') @@ -69,4 +70,20 @@ GROUP BY DATE_FORMAT(atte_date, '%Y-%m') + + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/BlackListController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/BlackListController.java index a27f9f8..0c06661 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/BlackListController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/BlackListController.java @@ -1,13 +1,18 @@ package com.casic.missiles.modular.controller; +import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.base.controller.ExportController; import com.casic.missiles.core.page.PageFactory; import com.casic.missiles.model.response.ResponseData; import com.casic.missiles.modular.dto.BlackInfoRequest; +import com.casic.missiles.modular.dto.BlackPictureRequest; +import com.casic.missiles.modular.dto.hik.PersonInfoRequest; +import com.casic.missiles.modular.enums.HikUri; import com.casic.missiles.modular.enums.OperateTypeEnum; import com.casic.missiles.modular.model.BlackInfo; import com.casic.missiles.modular.service.BlackInfoService; +import com.casic.missiles.modular.util.HikUtil; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; @@ -56,4 +61,22 @@ return null; } + /** + * 黑名单人员照片 + */ + @PostMapping("/personPicture") + @ResponseBody + public Object personPicture(@RequestBody BlackPictureRequest blackPictureRequest){ + //获取照片 + String picUri = blackPictureRequest.getPicUri(); + String serverIndexCode = blackPictureRequest.getServerIndexCode(); + PersonInfoRequest picRequest = new PersonInfoRequest(); + picRequest.setPicUri(picUri); + picRequest.setServerIndexCode(serverIndexCode); + String reBody = JSONObject.toJSONString(picRequest); + //重定向地址获取 + String url = HikUtil.hikApiFor302(HikUri.PERSON_PICTURE, reBody); + return ResponseData.success(url); + } + } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/DeviceController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/DeviceController.java index e1c4eba..666bbee 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/DeviceController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/DeviceController.java @@ -107,7 +107,7 @@ } /** - * 设备维修管理查询(分页),需计算MTTR=总维修时间/故障次数 + * 设备状态计算与评判/设备维修管理查询(分页),需计算MTTR=总维修时间/故障次数 */ @PostMapping("/repair/listPage") @ResponseBody @@ -211,7 +211,7 @@ //需根据设备编号获取到对应的门禁点唯一标识 doorControlRequest.setDoorIndexCodes(indexCodes); doorControlRequest.setControlType(Integer.valueOf(gateGroupDTO.getStatus())); - String body = JSONObject.toJSONString(deviceCodes); + String body = JSONObject.toJSONString(doorControlRequest); String resultStr = HikUtil.hikApi(HikUri.DOOR_CONTROL, body); JSONObject resultJson = (JSONObject)JSONObject.parse(resultStr); if (!"0".equals(resultJson.get("code"))) { diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/StaffController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/StaffController.java index b58ccab..704093c 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/StaffController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/StaffController.java @@ -2,15 +2,21 @@ import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.util.StrUtil; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.base.controller.ExportController; import com.casic.missiles.core.page.PageFactory; import com.casic.missiles.model.response.ErrorResponseData; import com.casic.missiles.model.response.ResponseData; import com.casic.missiles.modular.dto.StaffInfoRequest; +import com.casic.missiles.modular.dto.hik.PersonInfoRequest; +import com.casic.missiles.modular.dto.hik.StaffCardRequest; +import com.casic.missiles.modular.enums.HikUri; import com.casic.missiles.modular.enums.OperateTypeEnum; import com.casic.missiles.modular.model.StaffInfo; import com.casic.missiles.modular.service.StaffInfoService; +import com.casic.missiles.modular.util.HikUtil; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; @@ -110,4 +116,60 @@ } return ResponseData.success(); } + + /** + * 批量开卡,添加人员之后调用,若在一个接口中添加人员成功开卡失败则第二次添加时会有问题 + */ + @PostMapping("/cardBinding") + @ResponseBody + public Object cardBinding(@RequestBody StaffCardRequest staffCardRequest) { + String body = JSONObject.toJSONString(staffCardRequest); + String resultStr = HikUtil.hikApi(HikUri.CARD_BINDING, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (!"0".equals(resultJson.get("code"))) { + log.error("请求海康,批量开卡失败,海康response:{}", resultStr); + return ResponseData.error("批量开卡失败"); + } + //保存卡号 + if(staffInfoService.saveCardInfo(staffCardRequest) > 0){ + return ResponseData.success(); + } + return ResponseData.error("批量开卡失败"); + } + + /** + * 获取员工照片,海康存储 + */ + @PostMapping("/personPicture/{staffCode}") + @ResponseBody + public Object personPicture(@PathVariable("staffCode") String staffCode){ + //获取员工详细信息,含图片服务器、uri + PersonInfoRequest request = new PersonInfoRequest(); + List list = new ArrayList<>(); + list.add(staffCode); + request.setParamName("personId"); + request.setParamValue(list); + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi(HikUri.PERSON_INFO, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (!"0".equals(resultJson.get("code"))) { + log.error("请求海康,根据人员唯一字段获取人员详细信息失败,海康response:{}", resultStr); + return ResponseData.error("获取员工照片失败"); + } + //获取照片 + JSONObject data = (JSONObject) resultJson.get("data"); + JSONArray dataArray = (JSONArray) data.get("list"); + JSONObject jsonObject = (JSONObject) dataArray.get(0); + JSONArray personPhoto = (JSONArray) jsonObject.get("personPhoto"); + JSONObject photo = (JSONObject) personPhoto.get(0); + String picUri = photo.getString("picUri"); + String serverIndexCode = photo.getString("serverIndexCode"); + PersonInfoRequest picRequest = new PersonInfoRequest(); + picRequest.setPicUri(picUri); + picRequest.setServerIndexCode(serverIndexCode); + String reBody = JSONObject.toJSONString(picRequest); + //重定向地址获取 + String url = HikUtil.hikApiFor302(HikUri.PERSON_PICTURE, reBody); + return ResponseData.success(url); + } } 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 4a07dd9..7b1dcf6 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 @@ -16,6 +16,7 @@ import com.casic.missiles.modular.redis.key.CacheKeys; import com.casic.missiles.modular.service.CockpitService; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.util.CollectionUtils; import org.springframework.web.bind.annotation.*; @@ -24,10 +25,7 @@ import java.text.NumberFormat; import java.time.LocalDateTime; import java.time.temporal.ChronoUnit; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.util.*; import java.util.stream.Collectors; /** @@ -73,6 +71,9 @@ private StatisticNumberMapper numberMapper; @Autowired + private HazardLevelMapper hazardLevelMapper; + + @Autowired private AccessGroupConfig accessGroupConfig; /** @@ -104,8 +105,24 @@ public Object buildingNumberPerHour(){ //当天按小时分组的人数 List list = numberMapper.selectListByTime(); - Map> collect = list.stream().collect(Collectors.groupingBy(BuildingNumberDTO::getStatisticPosition)); - return ResponseData.success(collect); + Map> collect = list.stream().collect(Collectors.groupingBy(BuildingNumberDTO::getStatisticTime)); + //定时任务中已将每小时三栋楼人数存到数据库 + //将一期主楼和录制楼人数合并,二期单算 + List> resultList = new ArrayList<>(); + collect.keySet().forEach(key -> { + List buildingNumberDTOS = collect.get(key); + BuildingNumberDTO mainBuildingOne = buildingNumberDTOS.get(0); + BuildingNumberDTO mainBuildingTwo = buildingNumberDTOS.get(1); + BuildingNumberDTO recordingBuilding = buildingNumberDTOS.get(2); + HashMap resultMap = new HashMap<>(); + Integer oneQuantity = Integer.valueOf(mainBuildingOne.getStatisticQuantity()); + Integer recordingQuantity = Integer.valueOf(recordingBuilding.getStatisticQuantity()); + resultMap.put("staticTime", mainBuildingOne.getStatisticTime()); + resultMap.put(mainBuildingOne.getStatisticPositionName()+"、"+recordingBuilding.getStatisticPositionName(), String.valueOf(oneQuantity+recordingQuantity)); + resultMap.put(mainBuildingTwo.getStatisticPositionName(), mainBuildingTwo.getStatisticQuantity()); + resultList.add(resultMap); + }); + return ResponseData.success(resultList); } /** @@ -151,12 +168,11 @@ public Object securityNumber() { QueryWrapper wrapper = new QueryWrapper<>(); wrapper.eq("staff_type", 2); + // TODO: 2022/9/2 后续使用产品确定的每天出勤的安保人员的数量 Integer total = staffInfoMapper.selectCount(wrapper); - //当日离岗事件个数 - QueryWrapper wrapper1 = new QueryWrapper<>(); - wrapper1.eq("hik_event_type", SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); - wrapper1.apply("date_format(now(),'%Y-%m-%d') = date_format(happen_time,'%Y-%m-%d')"); - Integer leave = caseInfoMapper.selectCount(wrapper1); + //当日离岗事件按设备去重后的个数 + // TODO: 2022/9/2 目前相当于24小时内的计算,之后看需要可改成自定义小时数计算离岗率,即离岗+6小时内仅一次离岗则恢复为100%,多次则累加离岗次数计算离岗率 + Integer leave = caseInfoMapper.selectDemobilizedCount(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); NumberFormat numberFormat = NumberFormat.getInstance(); // 设置精确到小数点后2位 numberFormat.setMaximumFractionDigits(2); @@ -179,7 +195,6 @@ @ResponseBody public Object visitorApplyDetail() { List reasonGroup = applyMapper.selectByVisitReason(); - HashMap resultMap = new HashMap<>(); NumberFormat numberFormat = NumberFormat.getInstance(); // 设置精确到小数点后2位 numberFormat.setMaximumFractionDigits(2); @@ -187,12 +202,17 @@ if(0 == sum){ return ResponseData.success(); } + List resultList = new ArrayList<>(); reasonGroup.forEach(group -> { String reasonName = dictService.getDictNameByCode(SecurityEventDict.VISIT_REASON, group.getVisitReason()); String result = numberFormat.format((float) group.getQuantity() / (float) sum * 100); - resultMap.put(reasonName, result+"%"); + ApplyReasonGroupDTO applyReasonGroupDTO = new ApplyReasonGroupDTO(); + applyReasonGroupDTO.setQuantity(group.getQuantity()); + applyReasonGroupDTO.setVisitReason(reasonName); + applyReasonGroupDTO.setRatio(result+"%"); + resultList.add(applyReasonGroupDTO); }); - return ResponseData.success(resultMap); + return ResponseData.success(resultList); } /** @@ -247,6 +267,32 @@ } /** + * 机动力量实时在岗率,在岗人数除以总应在岗人数,用离岗+6小时内恢复为100%,6小时外再计算 + */ + @GetMapping("/staff/beOnDutyRatio") + @ResponseBody + public Object beOnDutyRatio() { + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("staff_type", 2); + // TODO: 2022/9/2 后续使用产品确定的每天出勤的安保人员的数量 + Integer total = staffInfoMapper.selectCount(wrapper); + if(0 == total){ + return ResponseData.success(null); + } + //当日离岗事件按设备去重后的个数 + // TODO: 2022/9/2 目前相当于24小时内的计算,之后看需要可改成自定义小时数计算离岗率,即离岗+6小时内仅一次离岗则恢复为100%,多次则累加离岗次数计算离岗率 + List onDutyRatioDTOS = caseInfoMapper.selectDemobilizedCountByHour(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); + onDutyRatioDTOS.forEach(dto -> { + NumberFormat numberFormat = NumberFormat.getInstance(); + // 设置精确到小数点后2位 + numberFormat.setMaximumFractionDigits(2); + String result = numberFormat.format(100 - Float.valueOf(dto.getQuantity()) / (float) total * 100); + dto.setRatio(result+"%"); + }); + return ResponseData.success(onDutyRatioDTOS); + } + + /** * 闸机速通门统计-设备状态分组计算数量,devType传闸机字典key * 视频频监控摄像机统计-设备状态分组计算数量,devType传摄像头字典key */ @@ -262,12 +308,17 @@ if(sum <= 0){ return ResponseData.error("无该类设备信息"); } + List resultList = new ArrayList<>(); gateStatusGroup.forEach(group -> { String devStatus = dictService.getDictNameByCode(SecurityEventDict.DEVICE_STATUS, group.getStatus()); String result = numberFormat.format((float) group.getQuantity() / (float) sum * 100); - resultMap.put(devStatus, result+"%"); + GateStatusGroupResponse gateStatusGroupResponse = new GateStatusGroupResponse(); + gateStatusGroupResponse.setStatus(devStatus); + gateStatusGroupResponse.setRatio(result+"%"); + resultList.add(gateStatusGroupResponse); }); - resultMap.put("总", sum); + resultMap.put("total", sum); + resultMap.put("list", resultList); return ResponseData.success(resultMap); } @@ -282,17 +333,38 @@ String position = securityScoreDTO.getPosition(); List caseInfos = caseInfoMapper.selectByPosition(position); //查询各危险级别权重、各类别权重,放入map,避免循环中多次查数据库 - + HashMap hazardScoreMap = new HashMap<>(); + List caseHazardLevelList = hazardLevelMapper.getCaseHazardLevelList(null); + caseHazardLevelList.forEach(hazardLevel -> { + hazardScoreMap.put(hazardLevel.getCode(), hazardLevel.getWeight()); + }); + HashMap categoryScoreMap = new HashMap<>(); + List categoryLevelList = categoryLevelMapper.getCaseCategoryLevelList(null); + categoryLevelList.forEach(categoryLevel -> { + categoryScoreMap.put(categoryLevel.getCode(), categoryLevel.getWeight()); + }); + //事件按楼层分组,计算 List securityScoreDTOs = new ArrayList<>(); caseInfos.forEach(caseInfo -> { SecurityScoreDTO securityScoreDTO1 = new SecurityScoreDTO(); + securityScoreDTO1.setPosition(caseInfo.getPosition()); securityScoreDTO1.setArea(caseInfo.getArea()); - // TODO: 2022/8/4 楼层评分计算根据产品定义调整 -// caseInfo.get -// securityScoreDTO1.setScore(); + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); + Double score = 100 - Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + securityScoreDTO1.setScore(score); + securityScoreDTOs.add(securityScoreDTO1); }); - - return null; + 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); + }); + return ResponseData.success(securityScoreDTOs); } /** @@ -303,9 +375,13 @@ public Object SecurityFrequency(@RequestBody SecurityFrequencyDTO securityFrequencyDTO) { String year = securityFrequencyDTO.getYear(); String month = securityFrequencyDTO.getMonth(); - Integer quantity = caseInfoMapper.selectCountByMonth(year, month); - securityFrequencyDTO.setQuantity(quantity); - return ResponseData.success(securityFrequencyDTO); + if(!StringUtils.isEmpty(year) && StringUtils.isEmpty(month)){ + Integer quantity = caseInfoMapper.selectCountByMonth(year, month); + securityFrequencyDTO.setQuantity(quantity); + return ResponseData.success(securityFrequencyDTO); + } + List list = caseInfoMapper.selectPreMonthCount(); + return ResponseData.success(list); } } 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 ae4d770..f4f075c 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 @@ -1,20 +1,25 @@ package com.casic.missiles.modular.controller.cockpit; +import cn.hutool.core.date.DateUnit; import cn.hutool.core.date.DateUtil; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.casic.missiles.model.response.ResponseData; -import com.casic.missiles.modular.dao.AttendanceInfoMapper; -import com.casic.missiles.modular.dao.CaseInfoMapper; -import com.casic.missiles.modular.dao.HazardLevelMapper; -import com.casic.missiles.modular.dao.StaffInfoMapper; +import com.casic.missiles.modular.dao.*; +import com.casic.missiles.modular.dto.DeviceRepairLogDTO; +import com.casic.missiles.modular.dto.DeviceRepairRequest; import com.casic.missiles.modular.dto.statistics.*; +import com.casic.missiles.modular.enums.SecurityEventType; +import com.casic.missiles.modular.model.CaseCategoryLevel; import com.casic.missiles.modular.model.CaseHazardLevel; +import com.casic.missiles.modular.model.CaseInfo; import com.casic.missiles.modular.model.StaffInfo; +import com.casic.missiles.modular.service.DeviceInfoService; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.util.CollectionUtils; import org.springframework.web.bind.annotation.*; +import java.math.BigDecimal; import java.text.NumberFormat; import java.util.*; import java.util.stream.Collectors; @@ -40,6 +45,12 @@ @Autowired private HazardLevelMapper hazardLevelMapper; + @Autowired + private CategoryLevelMapper categoryLevelMapper; + + @Autowired + private DeviceInfoService deviceInfoService; + /** * 安防事件时域频次统计,每月的每天安防事件个数(原方案) * 月维度:展示每个月的每天的数据 @@ -89,15 +100,17 @@ List monthList = caseInfoMapper.selectPreMonthCountByYear(year); Map> collect = monthList.stream().collect(Collectors.groupingBy(PreMonthOrWeekCaseDTO::getHazardLevelCode)); HashMap strAvgMap = new HashMap<>(); + List resultList = new ArrayList<>(); for (String key : collect.keySet()) { List preMonthOrWeekCaseDTOS = collect.get(key); int sum = preMonthOrWeekCaseDTOS.stream().mapToInt(PreMonthOrWeekCaseDTO::getQuantity).sum(); //若年份是本年,则使用个安防级别数量/当前月份数 //若不是本年,除数为12 MonthAndWeekDTO monthAndWeekDTO = new MonthAndWeekDTO(); + String hazardName = hazardLevelMapper.selectHazardNameByCode(key); + monthAndWeekDTO.setLevelName(hazardName); if(year.equals(String.valueOf(DateUtil.thisYear()))){ monthAndWeekDTO.setMonthQuantity(sum / DateUtil.thisMonth()); -// monthAndWeekDTO.setLevelName(); strAvgMap.put(key, monthAndWeekDTO); }else{ monthAndWeekDTO.setMonthQuantity(sum / 12); @@ -113,27 +126,37 @@ if(year.equals(String.valueOf(DateUtil.thisYear()))){ if(!Objects.isNull(strAvgMap.get(key))){ MonthAndWeekDTO monthAndWeekDTO = strAvgMap.get(key); + String hazardName = hazardLevelMapper.selectHazardNameByCode(key); + monthAndWeekDTO.setLevelName(hazardName); monthAndWeekDTO.setWeekQuantity(sum / DateUtil.thisWeekOfYear()); strAvgMap.put(key, monthAndWeekDTO); }else{ MonthAndWeekDTO monthAndWeekDTO = new MonthAndWeekDTO(); + String hazardName = hazardLevelMapper.selectHazardNameByCode(key); + monthAndWeekDTO.setLevelName(hazardName); monthAndWeekDTO.setWeekQuantity(sum / DateUtil.thisWeekOfYear()); strAvgMap.put(key, monthAndWeekDTO); } }else{ if(!Objects.isNull(strAvgMap.get(key))){ MonthAndWeekDTO monthAndWeekDTO = strAvgMap.get(key); + String hazardName = hazardLevelMapper.selectHazardNameByCode(key); + monthAndWeekDTO.setLevelName(hazardName); monthAndWeekDTO.setWeekQuantity(sum / 52); strAvgMap.put(key, monthAndWeekDTO); }else{ MonthAndWeekDTO monthAndWeekDTO = new MonthAndWeekDTO(); + String hazardName = hazardLevelMapper.selectHazardNameByCode(key); + monthAndWeekDTO.setLevelName(hazardName); monthAndWeekDTO.setWeekQuantity(sum / 52); strAvgMap.put(key, monthAndWeekDTO); } } } - avgMonthAndWeekGroupDTO.setMap(strAvgMap); - return ResponseData.success(avgMonthAndWeekGroupDTO); + strAvgMap.keySet().forEach(key -> { + resultList.add(strAvgMap.get(key)); + }); + return ResponseData.success(resultList); } /** @@ -181,12 +204,178 @@ } /** - * 员工考勤人数变化,功能待定 + * 员工考勤人数变化,统计当天(横坐标为时)及近7天(横坐标为天)的考勤人数变化,只要发生一次考勤识别,次数的基数就正常增加(没有上班下班区分) */ + @PostMapping("/staff/attendanceNumber/{dimension}") + @ResponseBody + public Object attendanceNumber(@PathVariable("dimension") String dimension) { + List attendanceNumberDTOs = null; + List> resultList = new ArrayList<>(); + if("week".equals(dimension)){ + //近7天数据按天分组统计 + attendanceNumberDTOs = attendanceInfoMapper.getCountForWeek(); + }else if("day".equals(dimension)) { + //今天数据按小时分组统计 + attendanceNumberDTOs = attendanceInfoMapper.getCountForDay(); + } + if(CollectionUtils.isEmpty(attendanceNumberDTOs)){ + return ResponseData.error("该查询条件下,无员工出勤数据!"); + } + Map> collect = attendanceNumberDTOs.stream().collect(Collectors.groupingBy(AttendanceNumberDTO::getDate)); + collect.keySet().forEach(key -> { + List attendanceNumberDTOS = collect.get(key); + AttendanceNumberDTO attendanceNumberDTO = attendanceNumberDTOS.get(0); + AttendanceNumberDTO attendanceNumberDTO2 = attendanceNumberDTOS.get(1); + Map resultMap = new HashMap<>(); + resultMap.put(attendanceNumberDTO.getStaffType(), attendanceNumberDTO.getQuantity()); + resultMap.put(attendanceNumberDTO2.getStaffType(), attendanceNumberDTO2.getQuantity()); + resultMap.put("staticTime", attendanceNumberDTO.getDate()); + resultList.add(resultMap); + }); + return ResponseData.success(resultList); + } /** - * 近30天/近一周安保人员到岗排行 + * 早晚高峰区域安防评估 */ + @PostMapping("/security/assessment/{dimension}") + @ResponseBody + public Object securityAssessment(@PathVariable("dimension") String dimension) { + //查询各危险级别权重、各类别权重,放入map,避免循环中多次查数据库 + HashMap hazardScoreMap = new HashMap<>(); + List caseHazardLevelList = hazardLevelMapper.getCaseHazardLevelList(null); + caseHazardLevelList.forEach(hazardLevel -> { + hazardScoreMap.put(hazardLevel.getCode(), hazardLevel.getWeight()); + }); + HashMap categoryScoreMap = new HashMap<>(); + List categoryLevelList = categoryLevelMapper.getCaseCategoryLevelList(null); + categoryLevelList.forEach(categoryLevel -> { + categoryScoreMap.put(categoryLevel.getCode(), categoryLevel.getWeight()); + }); + HashMap hashMap = new HashMap<>(); + if("week".equals(dimension)){ + //近7天早晚高峰数据 + List caseInfos = caseInfoMapper.selectListBySevenDay(); + //按时间(天)进行分组 + caseInfos.forEach(caseInfo -> { + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); + Double score = Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + String[] array = caseInfo.getHappenTime().split(" "); + String dayTime = array[0]; + BigDecimal preScore; + if(hashMap.containsKey(dayTime)){ + Double aDouble = hashMap.get(dayTime); + preScore = new BigDecimal(aDouble.toString()); + + }else{ + preScore = new BigDecimal("100.0"); + } + BigDecimal nowScore = new BigDecimal(score.toString()); + hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); + }); + return ResponseData.success(hashMap); + }else if("day".equals(dimension)) { + //今天数据按小时分组统计 + List caseInfos = caseInfoMapper.selectListByToday(); + caseInfos.forEach(caseInfo -> { + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); + Double score = Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + String[] array = caseInfo.getHappenTime().split(":"); + String dayTime = array[0]; + BigDecimal preScore; + if(hashMap.containsKey(dayTime)){ + Double aDouble = hashMap.get(dayTime); + preScore = new BigDecimal(aDouble.toString()); + + }else{ + preScore = new BigDecimal("100.0"); + } + BigDecimal nowScore = new BigDecimal(score.toString()); + hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); + }); + return ResponseData.success(hashMap); + } + return null; + } + + /** + * 重点区域安防事态评估,统计重点区域6:00-23:00按小时分组数据 + */ + @GetMapping("/security/keyAreaStatistic") + @ResponseBody + public Object keyAreaStatistic() { + //查询各危险级别权重、各类别权重,放入map,避免循环中多次查数据库 + HashMap hazardScoreMap = new HashMap<>(); + List caseHazardLevelList = hazardLevelMapper.getCaseHazardLevelList(null); + caseHazardLevelList.forEach(hazardLevel -> { + hazardScoreMap.put(hazardLevel.getCode(), hazardLevel.getWeight()); + }); + HashMap categoryScoreMap = new HashMap<>(); + List categoryLevelList = categoryLevelMapper.getCaseCategoryLevelList(null); + categoryLevelList.forEach(categoryLevel -> { + categoryScoreMap.put(categoryLevel.getCode(), categoryLevel.getWeight()); + }); + HashMap hashMap = new HashMap<>(); + //今天数据按小时分组统计 + List caseInfos = caseInfoMapper.selectListByToday2(); + caseInfos.forEach(caseInfo -> { + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); + Double score = Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + String[] array = caseInfo.getHappenTime().split(":"); + String dayTime = array[0]; + BigDecimal preScore; + if(hashMap.containsKey(dayTime)){ + Double aDouble = hashMap.get(dayTime); + preScore = new BigDecimal(aDouble.toString()); + + }else{ + preScore = new BigDecimal("100.0"); + } + BigDecimal nowScore = new BigDecimal(score.toString()); + hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); + }); + return ResponseData.success(hashMap); + } + + /** + * 安防机动支援力量调配响应评估,根据事件已解决状态及已解决时间-发送时间,按时间(小时)分组统计 + */ + @GetMapping("/security/responseAssess") + @ResponseBody + public Object responseAssess() { + //查询各危险级别权重、各类别权重,放入map,避免循环中多次查数据库 + HashMap hazardScoreMap = new HashMap<>(); + List caseHazardLevelList = hazardLevelMapper.getCaseHazardLevelList(null); + caseHazardLevelList.forEach(hazardLevel -> { + hazardScoreMap.put(hazardLevel.getCode(), hazardLevel.getWeight()); + }); + HashMap hashMap = new HashMap<>(); + //今天数据按小时分组统计 + List caseInfos = caseInfoMapper.selectListByToday3(); + caseInfos.forEach(caseInfo -> { + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + //扣分=事件级别权重*未解决小时数 + Date updateTime = DateUtil.parse(caseInfo.getUpdateTime()); + Date happenTime = DateUtil.parse(caseInfo.getHappenTime()); + long between = DateUtil.between(updateTime, happenTime, DateUnit.HOUR); + Double score = Double.valueOf(hazardWeight)*between; + String[] array = caseInfo.getHappenTime().split(":"); + String dayTime = array[0]; + BigDecimal preScore; + if(hashMap.containsKey(dayTime)){ + Double aDouble = hashMap.get(dayTime); + preScore = new BigDecimal(aDouble.toString()); + }else{ + preScore = new BigDecimal("100.0"); + } + BigDecimal nowScore = new BigDecimal(score.toString()); + hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); + }); + return ResponseData.success(hashMap); + } /** * 重点区域威胁事件类型统计,优先级2,统计近7天和近30天 @@ -224,7 +413,34 @@ } /** - * 设备状态计算系数和评判,优先级3,需确认设备恢复时间是否可以获取 + * 近30天/近一周安保人员到岗排行 */ + + /** + * 安保等级评估,发生离岗事件减1分 + */ + @GetMapping("/security/levelAssess") + @ResponseBody + public Object securityLevelAssess() { + //今天数据按小时分组统计 + List resultList = caseInfoMapper.selectListByType(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); + resultList.forEach(result -> { + BigDecimal deScore = new BigDecimal(result.getQuantity()); + BigDecimal preScore = new BigDecimal("100.0"); + result.setScore(preScore.subtract(deScore).doubleValue()); + }); + return ResponseData.success(resultList); + } + + /** + * 设备状态计算系数和评判,即设备维修管理查询(不分页) + */ + @PostMapping("/device/repairList") + @ResponseBody + public Object repairList(@RequestBody DeviceRepairRequest deviceRepairRequest) { + List deviceRepairLogDTOS = deviceInfoService.deviceRepairListPage(deviceRepairRequest); + return ResponseData.success(deviceRepairLogDTOS); + } + } 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 fbf8ab6..c71a15a 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 @@ -1,13 +1,12 @@ package com.casic.missiles.modular.controller.hik; +import cn.hutool.core.date.DateTime; +import cn.hutool.core.date.DateUtil; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.casic.missiles.model.response.ResponseData; import com.casic.missiles.modular.dao.HikFaceGroupInfoMapper; -import com.casic.missiles.modular.dto.hik.EventSubscribeRequest; -import com.casic.missiles.modular.dto.hik.FaceGroupAdditionRequest; -import com.casic.missiles.modular.dto.hik.HikRecvEvent; -import com.casic.missiles.modular.dto.hik.OrgBatchAdd; +import com.casic.missiles.modular.dto.hik.*; import com.casic.missiles.modular.enums.HikUri; import com.casic.missiles.modular.enums.SecurityEventType; import com.casic.missiles.modular.model.CaseInfo; @@ -18,16 +17,20 @@ import com.casic.missiles.modular.util.CaseInfoFactoryUtil; import com.casic.missiles.modular.util.HikUtil; import com.casic.missiles.modular.util.ThreadPoolUtil; +import com.casic.missiles.modular.util.WebSocket; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; -import org.springframework.web.bind.annotation.*; +import org.springframework.util.CollectionUtils; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.RestController; -import java.net.InetAddress; -import java.net.UnknownHostException; import java.util.ArrayList; +import java.util.Iterator; import java.util.List; import java.util.Objects; @@ -38,7 +41,6 @@ */ @Slf4j @RestController -@RequestMapping("/hik") public class HikController { @Autowired @@ -53,28 +55,37 @@ @Autowired private HikService hikService; + @Autowired + private HikFaceGroupInfoMapper hikFaceGroupInfoMapper; + + @Autowired + private WebSocket webSocket; + @Value("${server.port}") private int serverPort; - @Autowired - private HikFaceGroupInfoMapper hikFaceGroupInfoMapper; /** * 海康事件订阅 */ - @PostMapping("/event/subscribe") + @PostMapping("/hik/event/subscribe") @ResponseBody - public Object eventSubscribe() throws UnknownHostException { + public Object eventSubscribe() { EventSubscribeRequest eventSubscribeRequest = new EventSubscribeRequest(); ArrayList list = new ArrayList<>(); list.add(SecurityEventType.DEVICE_OFFLINE); + list.add(SecurityEventType.DEVICE_ONLINE); list.add(SecurityEventType.KEY_PERSONNEL_IDENTIFY_EVENT); list.add(SecurityEventType.MONITORING_POINT_OFFLINE); + list.add(SecurityEventType.MONITORING_POINT_ONLINE); list.add(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); list.add(SecurityEventType.PERSONNEL_GATHER_EVENT); - InetAddress localHost = InetAddress.getLocalHost(); + list.add(SecurityEventType.VISITOR_REGISTER); + list.add(SecurityEventType.VISITOR_CHECKOUT); + list.add(SecurityEventType.HIGH_ALTITUDE_PARABOLIC); +// InetAddress localHost = InetAddress.getLocalHost(); eventSubscribeRequest.setEventTypes(list); - eventSubscribeRequest.setEventDest("https://" + localHost + ":" + serverPort + "/eventRcv"); + eventSubscribeRequest.setEventDest("http://" + "192.168.10.6" + ":" + serverPort + "/eventRcv"); //订阅类型,0-订阅原始事件,1-联动事件,2-原始事件和联动事件,不填使用默认值0 eventSubscribeRequest.setSubType(0); /** @@ -92,19 +103,25 @@ } /** + * 查询事件订阅信息 + */ + @PostMapping("/hik/event/query") + @ResponseBody + public Object eventQuery() { + String result = HikUtil.hikApi(HikUri.EVENT_INFO, ""); + return result; + } + + /** * 海康事件接收 */ @PostMapping("/eventRcv") @ResponseBody public Object eventRcv(@RequestBody HikRecvEvent hikRecvEvent) { //1、接收所需事件类型 - Long eventType = hikRecvEvent.getEventType(); + Number eventType = hikRecvEvent.getEventType(); log.info("接收到安防事件类型为:{}", eventType); CaseInfo caseInfo = caseInfoFactoryUtil.getCaseInfo(eventType); - //接收到不关心事件直接返回 - if(Objects.isNull(caseInfo)){ - return ResponseData.success(); - } //2、不同事件不同处理,caseInfoFactoryUtil已设置好事件基础定义信息 // 再为事件添加状态、设备编码、设备名称、位置、区域、时间 // 异步处理事件 @@ -114,19 +131,23 @@ caseHandle(hikRecvEvent, eventType, caseInfo); } })); +// caseHandle(hikRecvEvent, eventType, caseInfo); - return null; + return ResponseData.success(); } - private void caseHandle(HikRecvEvent hikRecvEvent, Long eventType, CaseInfo caseInfo) { + private void caseHandle(HikRecvEvent hikRecvEvent, Number eventType, CaseInfo caseInfo) { JSONArray eventArray = hikRecvEvent.getEventArray(); List caseInfos = new ArrayList<>(); - while (eventArray.stream().iterator().hasNext()) { + Iterator iterator = eventArray.iterator(); + while (iterator.hasNext()) { CaseInfo caseInfo1 = new CaseInfo(); - BeanUtils.copyProperties(caseInfo, caseInfo1); - JSONObject event = (JSONObject) eventArray.stream().iterator().next(); + if(!Objects.isNull(caseInfo)){ + BeanUtils.copyProperties(caseInfo, caseInfo1); + } + JSONObject event = (JSONObject) iterator.next(); //5种事件进行不同处理 - if(SecurityEventType.KEY_PERSONNEL_IDENTIFY_EVENT == eventType){ + if (SecurityEventType.KEY_PERSONNEL_IDENTIFY_EVENT.equals(eventType)) { //判断所属人脸分组 JSONObject data = (JSONObject) event.get("data"); JSONObject faceRecognitionResult = (JSONObject) data.get("faceRecognitionResult"); @@ -142,52 +163,101 @@ if (faceGroupCode.equals(blackListGroup.getFaceGroupCode())) { //黑名单分组处理 caseInfo1 = hikService.blackListHandle(event, caseInfo1); - }else if(faceGroupCode.equals(propertyPersonnelGroup.getFaceGroupCode())){ + } else if (faceGroupCode.equals(propertyPersonnelGroup.getFaceGroupCode())) { //考勤分组处理-物业人员,添加到考勤表 hikService.propertyAttendanceHandle(event); - }else if(faceGroupCode.equals(securityPersonnelGroup.getFaceGroupCode())){ + } else if (faceGroupCode.equals(securityPersonnelGroup.getFaceGroupCode())) { //考勤分组处理-安保人员,添加到考勤表 hikService.securityPersonnelHandle(event); - }else { + } else { return; } - }else if(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT == eventType){ + } else if (SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT.equals(eventType)) { //离岗事件处理 caseInfo1 = hikService.demobilizedHandle(event, caseInfo1); - }else if(SecurityEventType.PERSONNEL_GATHER_EVENT == eventType){ + } else if (SecurityEventType.PERSONNEL_GATHER_EVENT.equals(eventType)) { //人员聚集事件处理 caseInfo1 = hikService.personGatherHandle(event, caseInfo1); - }else if(SecurityEventType.MONITORING_POINT_OFFLINE == eventType){ + } else if (SecurityEventType.MONITORING_POINT_OFFLINE.equals(eventType)) { //监控点离线事件处理 caseInfo1 = hikService.monitorPointOfflineHandle(event, caseInfo1); - }else if(SecurityEventType.DEVICE_OFFLINE == eventType){ + } else if (SecurityEventType.MONITORING_POINT_ONLINE.equals(eventType)) { + //监控点上线事件处理 + hikService.monitorPointOnlineHandle(event); + } else if (SecurityEventType.DEVICE_OFFLINE.equals(eventType)) { //装置离线事件处理 caseInfo1 = hikService.deviceOfflineHandle(event, caseInfo1); - }else if(SecurityEventType.VISITOR_REGISTER == eventType){ + } else if (SecurityEventType.DEVICE_ONLINE.equals(eventType)) { + //装置上线处理 + hikService.deviceOnlineHandle(event); + } else if (SecurityEventType.VISITOR_REGISTER.equals(eventType)) { //记录访客登记记录,添加到访客记录表 hikService.visitorRegisterHandler(event); - }else if(SecurityEventType.VISITOR_CHECKOUT == eventType){ + } else if (SecurityEventType.VISITOR_CHECKOUT.equals(eventType)) { //记录访客签离记录 hikService.visitorCheckOutHandler(event); } - if(!Objects.isNull(caseInfo1) && !StringUtils.isEmpty(caseInfo1.getHappenTime())){ + if (!Objects.isNull(caseInfo1) && !StringUtils.isEmpty(caseInfo1.getHappenTime())) { caseInfos.add(caseInfo1); } } //3、安防事件入库 - if(!caseInfoService.insertCaseInfoBatch(caseInfos)){ - log.error("安防事件批量入库异常"); + if (!CollectionUtils.isEmpty(caseInfos) && !caseInfoService.insertCaseInfoBatch(caseInfos)) { + log.error("安防事件批量入库异常!"); } // TODO: 2022/8/15 webSocket推送 + if (CollectionUtils.isEmpty(caseInfos)) { + log.info("webSocket事件推送"); + webSocket.sendAllMessage(JSONObject.toJSONString(caseInfos)); + } return; } /** + * 以图搜图,前端用于轨迹追踪 + */ + @PostMapping("/hik/search/picture") + @ResponseBody + public Object searchPictures(@RequestBody SearchPicturesRequest searchPicturesRequest) { + DateTime startDateTime = DateUtil.parse(searchPicturesRequest.getStartTime()); + DateTime endDateTime = DateUtil.parse(searchPicturesRequest.getEndTime()); + String startTime = DateUtil.format(startDateTime, "yyyy-MM-dd'T'HH:mm:ss.SSSXXX"); + String endTime = DateUtil.format(endDateTime, "yyyy-MM-dd'T'HH:mm:ss.SSSXXX"); + searchPicturesRequest.setStartTime(startTime); + searchPicturesRequest.setEndTime(endTime); + String body = JSONObject.toJSONString(searchPicturesRequest); + String resultStr = HikUtil.hikApi(HikUri.SEARCH_PICTURES, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (!"0".equals(resultJson.get("code"))) { + log.error("请求海康,以图搜图失败,海康response:{}", resultStr); + return ResponseData.error("以图搜图失败"); + } + return ResponseData.success(resultJson); + } + + + /** + * 海康事件取消订阅 + */ + @PostMapping("/hik/event/cancel") + @ResponseBody + public Object eventCancelSubscribe(@RequestBody CancelSubscribeRequest cancelSubscribeRequest) { + String body = JSONObject.toJSONString(cancelSubscribeRequest); + String resultStr = HikUtil.hikApi(HikUri.EVENT_CANCEL, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (!"0".equals(resultJson.get("code"))) { + log.error("请求海康,取消订阅失败,海康response:{}", resultStr); + return ResponseData.error("取消订阅失败"); + } + return ResponseData.success(resultJson); + } + + /** * 单个添加海康人脸分组 * api->hik单个添加人脸分组api->response->mysql */ - @PostMapping("/faceGroup/single/add") + @PostMapping("/hik/faceGroup/single/add") @ResponseBody public Object faceGroupAddition(@RequestBody FaceGroupAdditionRequest faceGroupAdditionRequest) { String body = JSONObject.toJSONString(faceGroupAdditionRequest); @@ -212,7 +282,7 @@ * 批量添加海康组织 * api->hik批量添加组织api->response */ - @PostMapping("/org/batch/add") + @PostMapping("/hik/org/batch/add") @ResponseBody public Object orgBatchAdd(@RequestBody List orgBatchAddRequest) { String body = JSONObject.toJSONString(orgBatchAddRequest); @@ -232,4 +302,62 @@ return ResponseData.error("批量添加组织失败"); } + /** + * 获取人员列表 + */ + @PostMapping("/hik/person/personList") + @ResponseBody + public Object personList() { + PersonListRequest request = new PersonListRequest(); + request.setPageNo(1); + request.setPageSize(100); + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi("/api/resource/v2/person/personList", body); + return resultStr; + } + + /** + * 获取组织列表 + */ + @PostMapping("/hik/org/orgList") + @ResponseBody + public Object orgList() { + PersonListRequest request = new PersonListRequest(); + request.setPageNo(1); + request.setPageSize(100); + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi("/api/resource/v1/org/orgList", body); + return resultStr; + } + + /** + * 查询访客权限下载记录 + */ + @PostMapping("/hik/auth/result") + @ResponseBody + public Object authResult() { + PersonListRequest request = new PersonListRequest(); + request.setPageNo(1); + request.setPageSize(100); + request.setOrderId("ba101db6246711edaea66f7939a13638"); + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi("/api/visitor/v1/auth/result", body); + return resultStr; + } + + /** + * 人脸图片获取 + */ + @PostMapping("/hik/face/picture") + @ResponseBody + public Object facePicture() { + FaceRequest request = new FaceRequest(); +// List list = new ArrayList<>(); +// list.add(""); + request.setCertificateNum("wanggong"); + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi("/api/frs/v1/face", body); + return resultStr; + } + } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/AssetInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/AssetInfoMapper.java index 4f64e83..c0684ee 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/AssetInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/AssetInfoMapper.java @@ -17,6 +17,6 @@ @Mapper public interface AssetInfoMapper extends BaseMapper { - List getAssetInfoListPage(@Param("page") Page page, AssetInfoRequest assetInfoRequest); + List getAssetInfoListPage(@Param("page") Page page, @Param("assetInfoRequest") AssetInfoRequest assetInfoRequest); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/AttendanceInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/AttendanceInfoMapper.java index f9e793e..ec87e46 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/AttendanceInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/AttendanceInfoMapper.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.statistics.AttendanceNumberDTO; import com.casic.missiles.modular.dto.statistics.AttendanceRatioDTO; import com.casic.missiles.modular.model.AttendanceInfo; import org.apache.ibatis.annotations.Mapper; @@ -17,7 +18,7 @@ */ @Mapper public interface AttendanceInfoMapper extends BaseMapper { - List getAttendanceInfoListPage(@Param("page") Page page, StaffInfoRequest attendanceInfoRequest); + List getAttendanceInfoListPage(@Param("page") Page page, @Param("attendanceInfoRequest") StaffInfoRequest attendanceInfoRequest); AttendanceInfo selectByCodeAndDate(@Param("staffCode") String staffCode); @@ -26,4 +27,8 @@ List getCountByTypeAndDateForMonth(@Param("staffType")String staffType); List getCountByTypeAndDateForYear(@Param("staffType")String staffType); + + List getCountForWeek(); + + List getCountForDay(); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java index ce94b8f..6137a7d 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java @@ -17,5 +17,5 @@ @Mapper public interface BlackInfoMapper extends BaseMapper { - List getBlackInfoListPage(@Param("page") Page page, BlackInfoRequest blackInfoRequest); + List getBlackInfoListPage(@Param("page") Page page, @Param("blackInfoRequest") BlackInfoRequest blackInfoRequest); } 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 efda6b3..50aaa6f 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 @@ -20,7 +20,7 @@ List getCaseInfoListPage(@Param("page") Page page, @Param("caseInfoRequest") CaseInfoRequest caseInfoRequest); - int updateStatusById(CaseInfoRequest caseInfoRequest); + int updateStatusById(@Param("caseInfoRequest") CaseInfoRequest caseInfoRequest); List selectByLevelAndMonth(@Param("year") String year); @@ -47,4 +47,20 @@ List selectPreWeekCountByThirtyDay(); List selectPreDayCountBySevenDay(); + + Integer selectDemobilizedCount(@Param("eventType") Number personnelDemobilizedEvent); + + List selectPreMonthCount(); + + List selectListBySevenDay(); + + List selectListByToday(); + + List selectListByToday2(); + + List selectListByToday3(); + + List selectListByType(@Param("eventType") Number eventType); + + List selectDemobilizedCountByHour(@Param("eventType") Number eventType); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/CategoryLevelMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/CategoryLevelMapper.java index 52fc714..afe1650 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/CategoryLevelMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/CategoryLevelMapper.java @@ -17,9 +17,9 @@ @Mapper public interface CategoryLevelMapper extends BaseMapper { - List getCaseCategoryLevelListPage(@Param("page") Page page, CategoryLevelRequest categoryLevelRequest); + List getCaseCategoryLevelListPage(@Param("page") Page page, @Param("categoryLevelRequest") CategoryLevelRequest categoryLevelRequest); - List getCaseCategoryLevelList(CategoryLevelRequest categoryLevelRequest); + List getCaseCategoryLevelList(@Param("categoryLevelRequest") CategoryLevelRequest categoryLevelRequest); CaseCategoryLevel getCaseCategoryLevel(@Param("categoryLevelCode") String categoryLevelCode); 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 66353b1..2555a09 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 @@ -19,7 +19,7 @@ @Mapper public interface DeviceInfoMapper extends BaseMapper { - List getDeviceInfoListPage(@Param("page") Page page, DeviceInfoRequest deviceInfoRequest); + List getDeviceInfoListPage(@Param("page") Page page, @Param("deviceInfoRequest") DeviceInfoRequest deviceInfoRequest); List getDeviceInfoList(@Param("deviceInfoRequest") DeviceInfoRequest deviceInfoRequest); @@ -27,6 +27,8 @@ DeviceInfo getByIndexCode(@Param("srcIndex") String srcIndex); + DeviceInfo getByIp(@Param("ip") String ip); + List selectIndexCodesByCodes(@Param("deviceCodes") List deviceCodes); List selectByType(@Param("devType") String devType); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java index 41dd0af..5bfaf63 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java @@ -5,6 +5,7 @@ import com.casic.missiles.modular.dto.DeviceRepairRequest; import com.casic.missiles.modular.model.DeviceRepairLog; import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; import java.util.List; @@ -16,7 +17,7 @@ @Mapper public interface DeviceRepairLogMapper extends BaseMapper { - List getDeviceRepairListPage(Page page, DeviceRepairRequest deviceRepairRequest); + List getDeviceRepairListPage(@Param("page") Page page, @Param("deviceRepairRequest")DeviceRepairRequest deviceRepairRequest); - List getDeviceRepairList(DeviceRepairRequest deviceRepairRequest); + List getDeviceRepairList(@Param("deviceRepairRequest") DeviceRepairRequest deviceRepairRequest); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java index 9035c47..4823ac1 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java @@ -18,7 +18,7 @@ @Mapper public interface FireEquipInfoMapper extends BaseMapper { - List getFireEquipInfoListPage(@Param("page") Page page, FireEquipRequest fireEquipRequest); + List getFireEquipInfoListPage(@Param("page") Page page, @Param("fireEquipRequest") FireEquipRequest fireEquipRequest); FireEquipInfo getFireEquipInfo(@Param("equipCode") String equipCode); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/GateGroupMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/GateGroupMapper.java index d8c330d..977a427 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/GateGroupMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/GateGroupMapper.java @@ -17,7 +17,7 @@ */ @Mapper public interface GateGroupMapper extends BaseMapper { - List getGateGroupListPage(@Param("page") Page page, GateGroupRequest gateGroupRequest); + List getGateGroupListPage(@Param("page") Page page, @Param("gateGroupRequest") GateGroupRequest gateGroupRequest); GateGroup getGateGroupByName(@Param("groupName") String groupName); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/HazardLevelMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/HazardLevelMapper.java index 8957780..dcf47bb 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/HazardLevelMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/HazardLevelMapper.java @@ -17,11 +17,13 @@ @Mapper public interface HazardLevelMapper extends BaseMapper { - List getCaseHazardLevelListPage(@Param("page") Page page, HazardLevelRequest hazardLevelRequest); + List getCaseHazardLevelListPage(@Param("page") Page page, @Param("hazardLevelRequest") HazardLevelRequest hazardLevelRequest); - List getCaseHazardLevelList(HazardLevelRequest hazardLevelRequest); + List getCaseHazardLevelList(@Param("hazardLevelRequest") HazardLevelRequest hazardLevelRequest); CaseHazardLevel getCaseHazardLevel(@Param("hazardLevelCode") String hazardLevelCode); List selectHazardName(); + + String selectHazardNameByCode(@Param("hazardLevelCode") String hazardLevelCode); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/HikCaseDefineMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/HikCaseDefineMapper.java index 0dc47d1..f162fef 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/HikCaseDefineMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/HikCaseDefineMapper.java @@ -12,5 +12,5 @@ */ @Mapper public interface HikCaseDefineMapper extends BaseMapper { - HikCaseDefine getHikCaseDefine(@Param("caseTypeCode") Long caseTypeCode); + HikCaseDefine getHikCaseDefine(@Param("caseTypeCode") Number caseTypeCode); } 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 f8a674c..fe5afc2 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 @@ -17,11 +17,13 @@ @Mapper public interface StaffInfoMapper extends BaseMapper { - List getStaffInfoListPage(@Param("page") Page page, StaffInfoRequest staffInfoRequest); + List getStaffInfoListPage(@Param("page") Page page, @Param("staffInfoRequest") StaffInfoRequest staffInfoRequest); StaffInfo selectByCode(@Param("staffCode") String staffCode); - List getStaffInfoList(StaffInfoRequest staffInfoRequest); + List getStaffInfoList(@Param("staffInfoRequest") StaffInfoRequest staffInfoRequest); - List selectBatchCodes(List list); + List selectBatchCodes(@Param("list") List list); + + int updateByCodeForCard(@Param("staffCode") String staffCode, @Param("cardNo") String cardNo); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitInfoMapper.java index b1217c5..6c52542 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitInfoMapper.java @@ -16,7 +16,7 @@ */ @Mapper public interface VisitInfoMapper extends BaseMapper { - List getVisitInfoListPage(@Param("page") Page page, VisitorRequest visitorRequest); + List getVisitInfoListPage(@Param("page") Page page, @Param("visitorRequest") VisitorRequest visitorRequest); VisitInfo selectByOrderId(@Param("orderId") String orderId); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitorApplyMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitorApplyMapper.java index c09f3c0..6ea55bd 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitorApplyMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitorApplyMapper.java @@ -18,7 +18,7 @@ @Mapper public interface VisitorApplyMapper extends BaseMapper { - List getVisitorApplyListPage(@Param("page") Page page, VisitorApplyRequest visitorApplyRequest); + List getVisitorApplyListPage(@Param("page") Page page, @Param("visitorApplyRequest") VisitorApplyRequest visitorApplyRequest); List selectByVisitReason(); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/AttendanceInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/AttendanceInfoMapper.xml index b2ece71..f8bdd6e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/AttendanceInfoMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/AttendanceInfoMapper.xml @@ -43,7 +43,8 @@ and staff_type = #{staffType} - and YEARWEEK(date_format(atte_date, '%Y-%m-%d'), 1) = YEARWEEK(now(),1); + AND DATE_SUB(CURDATE(), INTERVAL 7 DAY) <= DATE(atte_date) + GROUP BY DATE_FORMAT(atte_date, '%Y-%m-%d') @@ -69,4 +70,20 @@ GROUP BY DATE_FORMAT(atte_date, '%Y-%m') + + + \ No newline at end of file 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 2b6953f..06ec0a8 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 @@ -28,7 +28,9 @@ @@ -87,7 +89,8 @@ SELECT hazard_level_code as levelCode, count(id) as quantity FROM bus_case_info WHERE hazard_level_code is not null - AND DATE_SUB(CURDATE(), INTERVAL 7 DAY) <= date(happen_time); + AND is_key_area = 1 + AND DATE_SUB(CURDATE(), INTERVAL 7 DAY) <= date(happen_time) GROUP BY hazard_level_code @@ -95,7 +98,8 @@ SELECT hazard_level_code as levelCode, count(id) as quantity FROM bus_case_info WHERE hazard_level_code is not null - AND DATE_SUB(CURDATE(), INTERVAL 30 DAY) <= date(happen_time); + AND is_key_area = 1 + AND DATE_SUB(CURDATE(), INTERVAL 30 DAY) <= date(happen_time) GROUP BY hazard_level_code @@ -122,4 +126,71 @@ AND hazard_level_code is not null GROUP BY DATE_FORMAT(happen_time,'%Y-%m-%d') + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/BlackListController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/BlackListController.java index a27f9f8..0c06661 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/BlackListController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/BlackListController.java @@ -1,13 +1,18 @@ package com.casic.missiles.modular.controller; +import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.base.controller.ExportController; import com.casic.missiles.core.page.PageFactory; import com.casic.missiles.model.response.ResponseData; import com.casic.missiles.modular.dto.BlackInfoRequest; +import com.casic.missiles.modular.dto.BlackPictureRequest; +import com.casic.missiles.modular.dto.hik.PersonInfoRequest; +import com.casic.missiles.modular.enums.HikUri; import com.casic.missiles.modular.enums.OperateTypeEnum; import com.casic.missiles.modular.model.BlackInfo; import com.casic.missiles.modular.service.BlackInfoService; +import com.casic.missiles.modular.util.HikUtil; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; @@ -56,4 +61,22 @@ return null; } + /** + * 黑名单人员照片 + */ + @PostMapping("/personPicture") + @ResponseBody + public Object personPicture(@RequestBody BlackPictureRequest blackPictureRequest){ + //获取照片 + String picUri = blackPictureRequest.getPicUri(); + String serverIndexCode = blackPictureRequest.getServerIndexCode(); + PersonInfoRequest picRequest = new PersonInfoRequest(); + picRequest.setPicUri(picUri); + picRequest.setServerIndexCode(serverIndexCode); + String reBody = JSONObject.toJSONString(picRequest); + //重定向地址获取 + String url = HikUtil.hikApiFor302(HikUri.PERSON_PICTURE, reBody); + return ResponseData.success(url); + } + } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/DeviceController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/DeviceController.java index e1c4eba..666bbee 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/DeviceController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/DeviceController.java @@ -107,7 +107,7 @@ } /** - * 设备维修管理查询(分页),需计算MTTR=总维修时间/故障次数 + * 设备状态计算与评判/设备维修管理查询(分页),需计算MTTR=总维修时间/故障次数 */ @PostMapping("/repair/listPage") @ResponseBody @@ -211,7 +211,7 @@ //需根据设备编号获取到对应的门禁点唯一标识 doorControlRequest.setDoorIndexCodes(indexCodes); doorControlRequest.setControlType(Integer.valueOf(gateGroupDTO.getStatus())); - String body = JSONObject.toJSONString(deviceCodes); + String body = JSONObject.toJSONString(doorControlRequest); String resultStr = HikUtil.hikApi(HikUri.DOOR_CONTROL, body); JSONObject resultJson = (JSONObject)JSONObject.parse(resultStr); if (!"0".equals(resultJson.get("code"))) { diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/StaffController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/StaffController.java index b58ccab..704093c 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/StaffController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/StaffController.java @@ -2,15 +2,21 @@ import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.util.StrUtil; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.base.controller.ExportController; import com.casic.missiles.core.page.PageFactory; import com.casic.missiles.model.response.ErrorResponseData; import com.casic.missiles.model.response.ResponseData; import com.casic.missiles.modular.dto.StaffInfoRequest; +import com.casic.missiles.modular.dto.hik.PersonInfoRequest; +import com.casic.missiles.modular.dto.hik.StaffCardRequest; +import com.casic.missiles.modular.enums.HikUri; import com.casic.missiles.modular.enums.OperateTypeEnum; import com.casic.missiles.modular.model.StaffInfo; import com.casic.missiles.modular.service.StaffInfoService; +import com.casic.missiles.modular.util.HikUtil; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; @@ -110,4 +116,60 @@ } return ResponseData.success(); } + + /** + * 批量开卡,添加人员之后调用,若在一个接口中添加人员成功开卡失败则第二次添加时会有问题 + */ + @PostMapping("/cardBinding") + @ResponseBody + public Object cardBinding(@RequestBody StaffCardRequest staffCardRequest) { + String body = JSONObject.toJSONString(staffCardRequest); + String resultStr = HikUtil.hikApi(HikUri.CARD_BINDING, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (!"0".equals(resultJson.get("code"))) { + log.error("请求海康,批量开卡失败,海康response:{}", resultStr); + return ResponseData.error("批量开卡失败"); + } + //保存卡号 + if(staffInfoService.saveCardInfo(staffCardRequest) > 0){ + return ResponseData.success(); + } + return ResponseData.error("批量开卡失败"); + } + + /** + * 获取员工照片,海康存储 + */ + @PostMapping("/personPicture/{staffCode}") + @ResponseBody + public Object personPicture(@PathVariable("staffCode") String staffCode){ + //获取员工详细信息,含图片服务器、uri + PersonInfoRequest request = new PersonInfoRequest(); + List list = new ArrayList<>(); + list.add(staffCode); + request.setParamName("personId"); + request.setParamValue(list); + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi(HikUri.PERSON_INFO, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (!"0".equals(resultJson.get("code"))) { + log.error("请求海康,根据人员唯一字段获取人员详细信息失败,海康response:{}", resultStr); + return ResponseData.error("获取员工照片失败"); + } + //获取照片 + JSONObject data = (JSONObject) resultJson.get("data"); + JSONArray dataArray = (JSONArray) data.get("list"); + JSONObject jsonObject = (JSONObject) dataArray.get(0); + JSONArray personPhoto = (JSONArray) jsonObject.get("personPhoto"); + JSONObject photo = (JSONObject) personPhoto.get(0); + String picUri = photo.getString("picUri"); + String serverIndexCode = photo.getString("serverIndexCode"); + PersonInfoRequest picRequest = new PersonInfoRequest(); + picRequest.setPicUri(picUri); + picRequest.setServerIndexCode(serverIndexCode); + String reBody = JSONObject.toJSONString(picRequest); + //重定向地址获取 + String url = HikUtil.hikApiFor302(HikUri.PERSON_PICTURE, reBody); + return ResponseData.success(url); + } } 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 4a07dd9..7b1dcf6 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 @@ -16,6 +16,7 @@ import com.casic.missiles.modular.redis.key.CacheKeys; import com.casic.missiles.modular.service.CockpitService; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.util.CollectionUtils; import org.springframework.web.bind.annotation.*; @@ -24,10 +25,7 @@ import java.text.NumberFormat; import java.time.LocalDateTime; import java.time.temporal.ChronoUnit; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.util.*; import java.util.stream.Collectors; /** @@ -73,6 +71,9 @@ private StatisticNumberMapper numberMapper; @Autowired + private HazardLevelMapper hazardLevelMapper; + + @Autowired private AccessGroupConfig accessGroupConfig; /** @@ -104,8 +105,24 @@ public Object buildingNumberPerHour(){ //当天按小时分组的人数 List list = numberMapper.selectListByTime(); - Map> collect = list.stream().collect(Collectors.groupingBy(BuildingNumberDTO::getStatisticPosition)); - return ResponseData.success(collect); + Map> collect = list.stream().collect(Collectors.groupingBy(BuildingNumberDTO::getStatisticTime)); + //定时任务中已将每小时三栋楼人数存到数据库 + //将一期主楼和录制楼人数合并,二期单算 + List> resultList = new ArrayList<>(); + collect.keySet().forEach(key -> { + List buildingNumberDTOS = collect.get(key); + BuildingNumberDTO mainBuildingOne = buildingNumberDTOS.get(0); + BuildingNumberDTO mainBuildingTwo = buildingNumberDTOS.get(1); + BuildingNumberDTO recordingBuilding = buildingNumberDTOS.get(2); + HashMap resultMap = new HashMap<>(); + Integer oneQuantity = Integer.valueOf(mainBuildingOne.getStatisticQuantity()); + Integer recordingQuantity = Integer.valueOf(recordingBuilding.getStatisticQuantity()); + resultMap.put("staticTime", mainBuildingOne.getStatisticTime()); + resultMap.put(mainBuildingOne.getStatisticPositionName()+"、"+recordingBuilding.getStatisticPositionName(), String.valueOf(oneQuantity+recordingQuantity)); + resultMap.put(mainBuildingTwo.getStatisticPositionName(), mainBuildingTwo.getStatisticQuantity()); + resultList.add(resultMap); + }); + return ResponseData.success(resultList); } /** @@ -151,12 +168,11 @@ public Object securityNumber() { QueryWrapper wrapper = new QueryWrapper<>(); wrapper.eq("staff_type", 2); + // TODO: 2022/9/2 后续使用产品确定的每天出勤的安保人员的数量 Integer total = staffInfoMapper.selectCount(wrapper); - //当日离岗事件个数 - QueryWrapper wrapper1 = new QueryWrapper<>(); - wrapper1.eq("hik_event_type", SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); - wrapper1.apply("date_format(now(),'%Y-%m-%d') = date_format(happen_time,'%Y-%m-%d')"); - Integer leave = caseInfoMapper.selectCount(wrapper1); + //当日离岗事件按设备去重后的个数 + // TODO: 2022/9/2 目前相当于24小时内的计算,之后看需要可改成自定义小时数计算离岗率,即离岗+6小时内仅一次离岗则恢复为100%,多次则累加离岗次数计算离岗率 + Integer leave = caseInfoMapper.selectDemobilizedCount(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); NumberFormat numberFormat = NumberFormat.getInstance(); // 设置精确到小数点后2位 numberFormat.setMaximumFractionDigits(2); @@ -179,7 +195,6 @@ @ResponseBody public Object visitorApplyDetail() { List reasonGroup = applyMapper.selectByVisitReason(); - HashMap resultMap = new HashMap<>(); NumberFormat numberFormat = NumberFormat.getInstance(); // 设置精确到小数点后2位 numberFormat.setMaximumFractionDigits(2); @@ -187,12 +202,17 @@ if(0 == sum){ return ResponseData.success(); } + List resultList = new ArrayList<>(); reasonGroup.forEach(group -> { String reasonName = dictService.getDictNameByCode(SecurityEventDict.VISIT_REASON, group.getVisitReason()); String result = numberFormat.format((float) group.getQuantity() / (float) sum * 100); - resultMap.put(reasonName, result+"%"); + ApplyReasonGroupDTO applyReasonGroupDTO = new ApplyReasonGroupDTO(); + applyReasonGroupDTO.setQuantity(group.getQuantity()); + applyReasonGroupDTO.setVisitReason(reasonName); + applyReasonGroupDTO.setRatio(result+"%"); + resultList.add(applyReasonGroupDTO); }); - return ResponseData.success(resultMap); + return ResponseData.success(resultList); } /** @@ -247,6 +267,32 @@ } /** + * 机动力量实时在岗率,在岗人数除以总应在岗人数,用离岗+6小时内恢复为100%,6小时外再计算 + */ + @GetMapping("/staff/beOnDutyRatio") + @ResponseBody + public Object beOnDutyRatio() { + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("staff_type", 2); + // TODO: 2022/9/2 后续使用产品确定的每天出勤的安保人员的数量 + Integer total = staffInfoMapper.selectCount(wrapper); + if(0 == total){ + return ResponseData.success(null); + } + //当日离岗事件按设备去重后的个数 + // TODO: 2022/9/2 目前相当于24小时内的计算,之后看需要可改成自定义小时数计算离岗率,即离岗+6小时内仅一次离岗则恢复为100%,多次则累加离岗次数计算离岗率 + List onDutyRatioDTOS = caseInfoMapper.selectDemobilizedCountByHour(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); + onDutyRatioDTOS.forEach(dto -> { + NumberFormat numberFormat = NumberFormat.getInstance(); + // 设置精确到小数点后2位 + numberFormat.setMaximumFractionDigits(2); + String result = numberFormat.format(100 - Float.valueOf(dto.getQuantity()) / (float) total * 100); + dto.setRatio(result+"%"); + }); + return ResponseData.success(onDutyRatioDTOS); + } + + /** * 闸机速通门统计-设备状态分组计算数量,devType传闸机字典key * 视频频监控摄像机统计-设备状态分组计算数量,devType传摄像头字典key */ @@ -262,12 +308,17 @@ if(sum <= 0){ return ResponseData.error("无该类设备信息"); } + List resultList = new ArrayList<>(); gateStatusGroup.forEach(group -> { String devStatus = dictService.getDictNameByCode(SecurityEventDict.DEVICE_STATUS, group.getStatus()); String result = numberFormat.format((float) group.getQuantity() / (float) sum * 100); - resultMap.put(devStatus, result+"%"); + GateStatusGroupResponse gateStatusGroupResponse = new GateStatusGroupResponse(); + gateStatusGroupResponse.setStatus(devStatus); + gateStatusGroupResponse.setRatio(result+"%"); + resultList.add(gateStatusGroupResponse); }); - resultMap.put("总", sum); + resultMap.put("total", sum); + resultMap.put("list", resultList); return ResponseData.success(resultMap); } @@ -282,17 +333,38 @@ String position = securityScoreDTO.getPosition(); List caseInfos = caseInfoMapper.selectByPosition(position); //查询各危险级别权重、各类别权重,放入map,避免循环中多次查数据库 - + HashMap hazardScoreMap = new HashMap<>(); + List caseHazardLevelList = hazardLevelMapper.getCaseHazardLevelList(null); + caseHazardLevelList.forEach(hazardLevel -> { + hazardScoreMap.put(hazardLevel.getCode(), hazardLevel.getWeight()); + }); + HashMap categoryScoreMap = new HashMap<>(); + List categoryLevelList = categoryLevelMapper.getCaseCategoryLevelList(null); + categoryLevelList.forEach(categoryLevel -> { + categoryScoreMap.put(categoryLevel.getCode(), categoryLevel.getWeight()); + }); + //事件按楼层分组,计算 List securityScoreDTOs = new ArrayList<>(); caseInfos.forEach(caseInfo -> { SecurityScoreDTO securityScoreDTO1 = new SecurityScoreDTO(); + securityScoreDTO1.setPosition(caseInfo.getPosition()); securityScoreDTO1.setArea(caseInfo.getArea()); - // TODO: 2022/8/4 楼层评分计算根据产品定义调整 -// caseInfo.get -// securityScoreDTO1.setScore(); + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); + Double score = 100 - Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + securityScoreDTO1.setScore(score); + securityScoreDTOs.add(securityScoreDTO1); }); - - return null; + 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); + }); + return ResponseData.success(securityScoreDTOs); } /** @@ -303,9 +375,13 @@ public Object SecurityFrequency(@RequestBody SecurityFrequencyDTO securityFrequencyDTO) { String year = securityFrequencyDTO.getYear(); String month = securityFrequencyDTO.getMonth(); - Integer quantity = caseInfoMapper.selectCountByMonth(year, month); - securityFrequencyDTO.setQuantity(quantity); - return ResponseData.success(securityFrequencyDTO); + if(!StringUtils.isEmpty(year) && StringUtils.isEmpty(month)){ + Integer quantity = caseInfoMapper.selectCountByMonth(year, month); + securityFrequencyDTO.setQuantity(quantity); + return ResponseData.success(securityFrequencyDTO); + } + List list = caseInfoMapper.selectPreMonthCount(); + return ResponseData.success(list); } } 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 ae4d770..f4f075c 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 @@ -1,20 +1,25 @@ package com.casic.missiles.modular.controller.cockpit; +import cn.hutool.core.date.DateUnit; import cn.hutool.core.date.DateUtil; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.casic.missiles.model.response.ResponseData; -import com.casic.missiles.modular.dao.AttendanceInfoMapper; -import com.casic.missiles.modular.dao.CaseInfoMapper; -import com.casic.missiles.modular.dao.HazardLevelMapper; -import com.casic.missiles.modular.dao.StaffInfoMapper; +import com.casic.missiles.modular.dao.*; +import com.casic.missiles.modular.dto.DeviceRepairLogDTO; +import com.casic.missiles.modular.dto.DeviceRepairRequest; import com.casic.missiles.modular.dto.statistics.*; +import com.casic.missiles.modular.enums.SecurityEventType; +import com.casic.missiles.modular.model.CaseCategoryLevel; import com.casic.missiles.modular.model.CaseHazardLevel; +import com.casic.missiles.modular.model.CaseInfo; import com.casic.missiles.modular.model.StaffInfo; +import com.casic.missiles.modular.service.DeviceInfoService; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.util.CollectionUtils; import org.springframework.web.bind.annotation.*; +import java.math.BigDecimal; import java.text.NumberFormat; import java.util.*; import java.util.stream.Collectors; @@ -40,6 +45,12 @@ @Autowired private HazardLevelMapper hazardLevelMapper; + @Autowired + private CategoryLevelMapper categoryLevelMapper; + + @Autowired + private DeviceInfoService deviceInfoService; + /** * 安防事件时域频次统计,每月的每天安防事件个数(原方案) * 月维度:展示每个月的每天的数据 @@ -89,15 +100,17 @@ List monthList = caseInfoMapper.selectPreMonthCountByYear(year); Map> collect = monthList.stream().collect(Collectors.groupingBy(PreMonthOrWeekCaseDTO::getHazardLevelCode)); HashMap strAvgMap = new HashMap<>(); + List resultList = new ArrayList<>(); for (String key : collect.keySet()) { List preMonthOrWeekCaseDTOS = collect.get(key); int sum = preMonthOrWeekCaseDTOS.stream().mapToInt(PreMonthOrWeekCaseDTO::getQuantity).sum(); //若年份是本年,则使用个安防级别数量/当前月份数 //若不是本年,除数为12 MonthAndWeekDTO monthAndWeekDTO = new MonthAndWeekDTO(); + String hazardName = hazardLevelMapper.selectHazardNameByCode(key); + monthAndWeekDTO.setLevelName(hazardName); if(year.equals(String.valueOf(DateUtil.thisYear()))){ monthAndWeekDTO.setMonthQuantity(sum / DateUtil.thisMonth()); -// monthAndWeekDTO.setLevelName(); strAvgMap.put(key, monthAndWeekDTO); }else{ monthAndWeekDTO.setMonthQuantity(sum / 12); @@ -113,27 +126,37 @@ if(year.equals(String.valueOf(DateUtil.thisYear()))){ if(!Objects.isNull(strAvgMap.get(key))){ MonthAndWeekDTO monthAndWeekDTO = strAvgMap.get(key); + String hazardName = hazardLevelMapper.selectHazardNameByCode(key); + monthAndWeekDTO.setLevelName(hazardName); monthAndWeekDTO.setWeekQuantity(sum / DateUtil.thisWeekOfYear()); strAvgMap.put(key, monthAndWeekDTO); }else{ MonthAndWeekDTO monthAndWeekDTO = new MonthAndWeekDTO(); + String hazardName = hazardLevelMapper.selectHazardNameByCode(key); + monthAndWeekDTO.setLevelName(hazardName); monthAndWeekDTO.setWeekQuantity(sum / DateUtil.thisWeekOfYear()); strAvgMap.put(key, monthAndWeekDTO); } }else{ if(!Objects.isNull(strAvgMap.get(key))){ MonthAndWeekDTO monthAndWeekDTO = strAvgMap.get(key); + String hazardName = hazardLevelMapper.selectHazardNameByCode(key); + monthAndWeekDTO.setLevelName(hazardName); monthAndWeekDTO.setWeekQuantity(sum / 52); strAvgMap.put(key, monthAndWeekDTO); }else{ MonthAndWeekDTO monthAndWeekDTO = new MonthAndWeekDTO(); + String hazardName = hazardLevelMapper.selectHazardNameByCode(key); + monthAndWeekDTO.setLevelName(hazardName); monthAndWeekDTO.setWeekQuantity(sum / 52); strAvgMap.put(key, monthAndWeekDTO); } } } - avgMonthAndWeekGroupDTO.setMap(strAvgMap); - return ResponseData.success(avgMonthAndWeekGroupDTO); + strAvgMap.keySet().forEach(key -> { + resultList.add(strAvgMap.get(key)); + }); + return ResponseData.success(resultList); } /** @@ -181,12 +204,178 @@ } /** - * 员工考勤人数变化,功能待定 + * 员工考勤人数变化,统计当天(横坐标为时)及近7天(横坐标为天)的考勤人数变化,只要发生一次考勤识别,次数的基数就正常增加(没有上班下班区分) */ + @PostMapping("/staff/attendanceNumber/{dimension}") + @ResponseBody + public Object attendanceNumber(@PathVariable("dimension") String dimension) { + List attendanceNumberDTOs = null; + List> resultList = new ArrayList<>(); + if("week".equals(dimension)){ + //近7天数据按天分组统计 + attendanceNumberDTOs = attendanceInfoMapper.getCountForWeek(); + }else if("day".equals(dimension)) { + //今天数据按小时分组统计 + attendanceNumberDTOs = attendanceInfoMapper.getCountForDay(); + } + if(CollectionUtils.isEmpty(attendanceNumberDTOs)){ + return ResponseData.error("该查询条件下,无员工出勤数据!"); + } + Map> collect = attendanceNumberDTOs.stream().collect(Collectors.groupingBy(AttendanceNumberDTO::getDate)); + collect.keySet().forEach(key -> { + List attendanceNumberDTOS = collect.get(key); + AttendanceNumberDTO attendanceNumberDTO = attendanceNumberDTOS.get(0); + AttendanceNumberDTO attendanceNumberDTO2 = attendanceNumberDTOS.get(1); + Map resultMap = new HashMap<>(); + resultMap.put(attendanceNumberDTO.getStaffType(), attendanceNumberDTO.getQuantity()); + resultMap.put(attendanceNumberDTO2.getStaffType(), attendanceNumberDTO2.getQuantity()); + resultMap.put("staticTime", attendanceNumberDTO.getDate()); + resultList.add(resultMap); + }); + return ResponseData.success(resultList); + } /** - * 近30天/近一周安保人员到岗排行 + * 早晚高峰区域安防评估 */ + @PostMapping("/security/assessment/{dimension}") + @ResponseBody + public Object securityAssessment(@PathVariable("dimension") String dimension) { + //查询各危险级别权重、各类别权重,放入map,避免循环中多次查数据库 + HashMap hazardScoreMap = new HashMap<>(); + List caseHazardLevelList = hazardLevelMapper.getCaseHazardLevelList(null); + caseHazardLevelList.forEach(hazardLevel -> { + hazardScoreMap.put(hazardLevel.getCode(), hazardLevel.getWeight()); + }); + HashMap categoryScoreMap = new HashMap<>(); + List categoryLevelList = categoryLevelMapper.getCaseCategoryLevelList(null); + categoryLevelList.forEach(categoryLevel -> { + categoryScoreMap.put(categoryLevel.getCode(), categoryLevel.getWeight()); + }); + HashMap hashMap = new HashMap<>(); + if("week".equals(dimension)){ + //近7天早晚高峰数据 + List caseInfos = caseInfoMapper.selectListBySevenDay(); + //按时间(天)进行分组 + caseInfos.forEach(caseInfo -> { + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); + Double score = Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + String[] array = caseInfo.getHappenTime().split(" "); + String dayTime = array[0]; + BigDecimal preScore; + if(hashMap.containsKey(dayTime)){ + Double aDouble = hashMap.get(dayTime); + preScore = new BigDecimal(aDouble.toString()); + + }else{ + preScore = new BigDecimal("100.0"); + } + BigDecimal nowScore = new BigDecimal(score.toString()); + hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); + }); + return ResponseData.success(hashMap); + }else if("day".equals(dimension)) { + //今天数据按小时分组统计 + List caseInfos = caseInfoMapper.selectListByToday(); + caseInfos.forEach(caseInfo -> { + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); + Double score = Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + String[] array = caseInfo.getHappenTime().split(":"); + String dayTime = array[0]; + BigDecimal preScore; + if(hashMap.containsKey(dayTime)){ + Double aDouble = hashMap.get(dayTime); + preScore = new BigDecimal(aDouble.toString()); + + }else{ + preScore = new BigDecimal("100.0"); + } + BigDecimal nowScore = new BigDecimal(score.toString()); + hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); + }); + return ResponseData.success(hashMap); + } + return null; + } + + /** + * 重点区域安防事态评估,统计重点区域6:00-23:00按小时分组数据 + */ + @GetMapping("/security/keyAreaStatistic") + @ResponseBody + public Object keyAreaStatistic() { + //查询各危险级别权重、各类别权重,放入map,避免循环中多次查数据库 + HashMap hazardScoreMap = new HashMap<>(); + List caseHazardLevelList = hazardLevelMapper.getCaseHazardLevelList(null); + caseHazardLevelList.forEach(hazardLevel -> { + hazardScoreMap.put(hazardLevel.getCode(), hazardLevel.getWeight()); + }); + HashMap categoryScoreMap = new HashMap<>(); + List categoryLevelList = categoryLevelMapper.getCaseCategoryLevelList(null); + categoryLevelList.forEach(categoryLevel -> { + categoryScoreMap.put(categoryLevel.getCode(), categoryLevel.getWeight()); + }); + HashMap hashMap = new HashMap<>(); + //今天数据按小时分组统计 + List caseInfos = caseInfoMapper.selectListByToday2(); + caseInfos.forEach(caseInfo -> { + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); + Double score = Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + String[] array = caseInfo.getHappenTime().split(":"); + String dayTime = array[0]; + BigDecimal preScore; + if(hashMap.containsKey(dayTime)){ + Double aDouble = hashMap.get(dayTime); + preScore = new BigDecimal(aDouble.toString()); + + }else{ + preScore = new BigDecimal("100.0"); + } + BigDecimal nowScore = new BigDecimal(score.toString()); + hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); + }); + return ResponseData.success(hashMap); + } + + /** + * 安防机动支援力量调配响应评估,根据事件已解决状态及已解决时间-发送时间,按时间(小时)分组统计 + */ + @GetMapping("/security/responseAssess") + @ResponseBody + public Object responseAssess() { + //查询各危险级别权重、各类别权重,放入map,避免循环中多次查数据库 + HashMap hazardScoreMap = new HashMap<>(); + List caseHazardLevelList = hazardLevelMapper.getCaseHazardLevelList(null); + caseHazardLevelList.forEach(hazardLevel -> { + hazardScoreMap.put(hazardLevel.getCode(), hazardLevel.getWeight()); + }); + HashMap hashMap = new HashMap<>(); + //今天数据按小时分组统计 + List caseInfos = caseInfoMapper.selectListByToday3(); + caseInfos.forEach(caseInfo -> { + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + //扣分=事件级别权重*未解决小时数 + Date updateTime = DateUtil.parse(caseInfo.getUpdateTime()); + Date happenTime = DateUtil.parse(caseInfo.getHappenTime()); + long between = DateUtil.between(updateTime, happenTime, DateUnit.HOUR); + Double score = Double.valueOf(hazardWeight)*between; + String[] array = caseInfo.getHappenTime().split(":"); + String dayTime = array[0]; + BigDecimal preScore; + if(hashMap.containsKey(dayTime)){ + Double aDouble = hashMap.get(dayTime); + preScore = new BigDecimal(aDouble.toString()); + }else{ + preScore = new BigDecimal("100.0"); + } + BigDecimal nowScore = new BigDecimal(score.toString()); + hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); + }); + return ResponseData.success(hashMap); + } /** * 重点区域威胁事件类型统计,优先级2,统计近7天和近30天 @@ -224,7 +413,34 @@ } /** - * 设备状态计算系数和评判,优先级3,需确认设备恢复时间是否可以获取 + * 近30天/近一周安保人员到岗排行 */ + + /** + * 安保等级评估,发生离岗事件减1分 + */ + @GetMapping("/security/levelAssess") + @ResponseBody + public Object securityLevelAssess() { + //今天数据按小时分组统计 + List resultList = caseInfoMapper.selectListByType(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); + resultList.forEach(result -> { + BigDecimal deScore = new BigDecimal(result.getQuantity()); + BigDecimal preScore = new BigDecimal("100.0"); + result.setScore(preScore.subtract(deScore).doubleValue()); + }); + return ResponseData.success(resultList); + } + + /** + * 设备状态计算系数和评判,即设备维修管理查询(不分页) + */ + @PostMapping("/device/repairList") + @ResponseBody + public Object repairList(@RequestBody DeviceRepairRequest deviceRepairRequest) { + List deviceRepairLogDTOS = deviceInfoService.deviceRepairListPage(deviceRepairRequest); + return ResponseData.success(deviceRepairLogDTOS); + } + } 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 fbf8ab6..c71a15a 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 @@ -1,13 +1,12 @@ package com.casic.missiles.modular.controller.hik; +import cn.hutool.core.date.DateTime; +import cn.hutool.core.date.DateUtil; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.casic.missiles.model.response.ResponseData; import com.casic.missiles.modular.dao.HikFaceGroupInfoMapper; -import com.casic.missiles.modular.dto.hik.EventSubscribeRequest; -import com.casic.missiles.modular.dto.hik.FaceGroupAdditionRequest; -import com.casic.missiles.modular.dto.hik.HikRecvEvent; -import com.casic.missiles.modular.dto.hik.OrgBatchAdd; +import com.casic.missiles.modular.dto.hik.*; import com.casic.missiles.modular.enums.HikUri; import com.casic.missiles.modular.enums.SecurityEventType; import com.casic.missiles.modular.model.CaseInfo; @@ -18,16 +17,20 @@ import com.casic.missiles.modular.util.CaseInfoFactoryUtil; import com.casic.missiles.modular.util.HikUtil; import com.casic.missiles.modular.util.ThreadPoolUtil; +import com.casic.missiles.modular.util.WebSocket; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; -import org.springframework.web.bind.annotation.*; +import org.springframework.util.CollectionUtils; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.RestController; -import java.net.InetAddress; -import java.net.UnknownHostException; import java.util.ArrayList; +import java.util.Iterator; import java.util.List; import java.util.Objects; @@ -38,7 +41,6 @@ */ @Slf4j @RestController -@RequestMapping("/hik") public class HikController { @Autowired @@ -53,28 +55,37 @@ @Autowired private HikService hikService; + @Autowired + private HikFaceGroupInfoMapper hikFaceGroupInfoMapper; + + @Autowired + private WebSocket webSocket; + @Value("${server.port}") private int serverPort; - @Autowired - private HikFaceGroupInfoMapper hikFaceGroupInfoMapper; /** * 海康事件订阅 */ - @PostMapping("/event/subscribe") + @PostMapping("/hik/event/subscribe") @ResponseBody - public Object eventSubscribe() throws UnknownHostException { + public Object eventSubscribe() { EventSubscribeRequest eventSubscribeRequest = new EventSubscribeRequest(); ArrayList list = new ArrayList<>(); list.add(SecurityEventType.DEVICE_OFFLINE); + list.add(SecurityEventType.DEVICE_ONLINE); list.add(SecurityEventType.KEY_PERSONNEL_IDENTIFY_EVENT); list.add(SecurityEventType.MONITORING_POINT_OFFLINE); + list.add(SecurityEventType.MONITORING_POINT_ONLINE); list.add(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); list.add(SecurityEventType.PERSONNEL_GATHER_EVENT); - InetAddress localHost = InetAddress.getLocalHost(); + list.add(SecurityEventType.VISITOR_REGISTER); + list.add(SecurityEventType.VISITOR_CHECKOUT); + list.add(SecurityEventType.HIGH_ALTITUDE_PARABOLIC); +// InetAddress localHost = InetAddress.getLocalHost(); eventSubscribeRequest.setEventTypes(list); - eventSubscribeRequest.setEventDest("https://" + localHost + ":" + serverPort + "/eventRcv"); + eventSubscribeRequest.setEventDest("http://" + "192.168.10.6" + ":" + serverPort + "/eventRcv"); //订阅类型,0-订阅原始事件,1-联动事件,2-原始事件和联动事件,不填使用默认值0 eventSubscribeRequest.setSubType(0); /** @@ -92,19 +103,25 @@ } /** + * 查询事件订阅信息 + */ + @PostMapping("/hik/event/query") + @ResponseBody + public Object eventQuery() { + String result = HikUtil.hikApi(HikUri.EVENT_INFO, ""); + return result; + } + + /** * 海康事件接收 */ @PostMapping("/eventRcv") @ResponseBody public Object eventRcv(@RequestBody HikRecvEvent hikRecvEvent) { //1、接收所需事件类型 - Long eventType = hikRecvEvent.getEventType(); + Number eventType = hikRecvEvent.getEventType(); log.info("接收到安防事件类型为:{}", eventType); CaseInfo caseInfo = caseInfoFactoryUtil.getCaseInfo(eventType); - //接收到不关心事件直接返回 - if(Objects.isNull(caseInfo)){ - return ResponseData.success(); - } //2、不同事件不同处理,caseInfoFactoryUtil已设置好事件基础定义信息 // 再为事件添加状态、设备编码、设备名称、位置、区域、时间 // 异步处理事件 @@ -114,19 +131,23 @@ caseHandle(hikRecvEvent, eventType, caseInfo); } })); +// caseHandle(hikRecvEvent, eventType, caseInfo); - return null; + return ResponseData.success(); } - private void caseHandle(HikRecvEvent hikRecvEvent, Long eventType, CaseInfo caseInfo) { + private void caseHandle(HikRecvEvent hikRecvEvent, Number eventType, CaseInfo caseInfo) { JSONArray eventArray = hikRecvEvent.getEventArray(); List caseInfos = new ArrayList<>(); - while (eventArray.stream().iterator().hasNext()) { + Iterator iterator = eventArray.iterator(); + while (iterator.hasNext()) { CaseInfo caseInfo1 = new CaseInfo(); - BeanUtils.copyProperties(caseInfo, caseInfo1); - JSONObject event = (JSONObject) eventArray.stream().iterator().next(); + if(!Objects.isNull(caseInfo)){ + BeanUtils.copyProperties(caseInfo, caseInfo1); + } + JSONObject event = (JSONObject) iterator.next(); //5种事件进行不同处理 - if(SecurityEventType.KEY_PERSONNEL_IDENTIFY_EVENT == eventType){ + if (SecurityEventType.KEY_PERSONNEL_IDENTIFY_EVENT.equals(eventType)) { //判断所属人脸分组 JSONObject data = (JSONObject) event.get("data"); JSONObject faceRecognitionResult = (JSONObject) data.get("faceRecognitionResult"); @@ -142,52 +163,101 @@ if (faceGroupCode.equals(blackListGroup.getFaceGroupCode())) { //黑名单分组处理 caseInfo1 = hikService.blackListHandle(event, caseInfo1); - }else if(faceGroupCode.equals(propertyPersonnelGroup.getFaceGroupCode())){ + } else if (faceGroupCode.equals(propertyPersonnelGroup.getFaceGroupCode())) { //考勤分组处理-物业人员,添加到考勤表 hikService.propertyAttendanceHandle(event); - }else if(faceGroupCode.equals(securityPersonnelGroup.getFaceGroupCode())){ + } else if (faceGroupCode.equals(securityPersonnelGroup.getFaceGroupCode())) { //考勤分组处理-安保人员,添加到考勤表 hikService.securityPersonnelHandle(event); - }else { + } else { return; } - }else if(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT == eventType){ + } else if (SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT.equals(eventType)) { //离岗事件处理 caseInfo1 = hikService.demobilizedHandle(event, caseInfo1); - }else if(SecurityEventType.PERSONNEL_GATHER_EVENT == eventType){ + } else if (SecurityEventType.PERSONNEL_GATHER_EVENT.equals(eventType)) { //人员聚集事件处理 caseInfo1 = hikService.personGatherHandle(event, caseInfo1); - }else if(SecurityEventType.MONITORING_POINT_OFFLINE == eventType){ + } else if (SecurityEventType.MONITORING_POINT_OFFLINE.equals(eventType)) { //监控点离线事件处理 caseInfo1 = hikService.monitorPointOfflineHandle(event, caseInfo1); - }else if(SecurityEventType.DEVICE_OFFLINE == eventType){ + } else if (SecurityEventType.MONITORING_POINT_ONLINE.equals(eventType)) { + //监控点上线事件处理 + hikService.monitorPointOnlineHandle(event); + } else if (SecurityEventType.DEVICE_OFFLINE.equals(eventType)) { //装置离线事件处理 caseInfo1 = hikService.deviceOfflineHandle(event, caseInfo1); - }else if(SecurityEventType.VISITOR_REGISTER == eventType){ + } else if (SecurityEventType.DEVICE_ONLINE.equals(eventType)) { + //装置上线处理 + hikService.deviceOnlineHandle(event); + } else if (SecurityEventType.VISITOR_REGISTER.equals(eventType)) { //记录访客登记记录,添加到访客记录表 hikService.visitorRegisterHandler(event); - }else if(SecurityEventType.VISITOR_CHECKOUT == eventType){ + } else if (SecurityEventType.VISITOR_CHECKOUT.equals(eventType)) { //记录访客签离记录 hikService.visitorCheckOutHandler(event); } - if(!Objects.isNull(caseInfo1) && !StringUtils.isEmpty(caseInfo1.getHappenTime())){ + if (!Objects.isNull(caseInfo1) && !StringUtils.isEmpty(caseInfo1.getHappenTime())) { caseInfos.add(caseInfo1); } } //3、安防事件入库 - if(!caseInfoService.insertCaseInfoBatch(caseInfos)){ - log.error("安防事件批量入库异常"); + if (!CollectionUtils.isEmpty(caseInfos) && !caseInfoService.insertCaseInfoBatch(caseInfos)) { + log.error("安防事件批量入库异常!"); } // TODO: 2022/8/15 webSocket推送 + if (CollectionUtils.isEmpty(caseInfos)) { + log.info("webSocket事件推送"); + webSocket.sendAllMessage(JSONObject.toJSONString(caseInfos)); + } return; } /** + * 以图搜图,前端用于轨迹追踪 + */ + @PostMapping("/hik/search/picture") + @ResponseBody + public Object searchPictures(@RequestBody SearchPicturesRequest searchPicturesRequest) { + DateTime startDateTime = DateUtil.parse(searchPicturesRequest.getStartTime()); + DateTime endDateTime = DateUtil.parse(searchPicturesRequest.getEndTime()); + String startTime = DateUtil.format(startDateTime, "yyyy-MM-dd'T'HH:mm:ss.SSSXXX"); + String endTime = DateUtil.format(endDateTime, "yyyy-MM-dd'T'HH:mm:ss.SSSXXX"); + searchPicturesRequest.setStartTime(startTime); + searchPicturesRequest.setEndTime(endTime); + String body = JSONObject.toJSONString(searchPicturesRequest); + String resultStr = HikUtil.hikApi(HikUri.SEARCH_PICTURES, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (!"0".equals(resultJson.get("code"))) { + log.error("请求海康,以图搜图失败,海康response:{}", resultStr); + return ResponseData.error("以图搜图失败"); + } + return ResponseData.success(resultJson); + } + + + /** + * 海康事件取消订阅 + */ + @PostMapping("/hik/event/cancel") + @ResponseBody + public Object eventCancelSubscribe(@RequestBody CancelSubscribeRequest cancelSubscribeRequest) { + String body = JSONObject.toJSONString(cancelSubscribeRequest); + String resultStr = HikUtil.hikApi(HikUri.EVENT_CANCEL, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (!"0".equals(resultJson.get("code"))) { + log.error("请求海康,取消订阅失败,海康response:{}", resultStr); + return ResponseData.error("取消订阅失败"); + } + return ResponseData.success(resultJson); + } + + /** * 单个添加海康人脸分组 * api->hik单个添加人脸分组api->response->mysql */ - @PostMapping("/faceGroup/single/add") + @PostMapping("/hik/faceGroup/single/add") @ResponseBody public Object faceGroupAddition(@RequestBody FaceGroupAdditionRequest faceGroupAdditionRequest) { String body = JSONObject.toJSONString(faceGroupAdditionRequest); @@ -212,7 +282,7 @@ * 批量添加海康组织 * api->hik批量添加组织api->response */ - @PostMapping("/org/batch/add") + @PostMapping("/hik/org/batch/add") @ResponseBody public Object orgBatchAdd(@RequestBody List orgBatchAddRequest) { String body = JSONObject.toJSONString(orgBatchAddRequest); @@ -232,4 +302,62 @@ return ResponseData.error("批量添加组织失败"); } + /** + * 获取人员列表 + */ + @PostMapping("/hik/person/personList") + @ResponseBody + public Object personList() { + PersonListRequest request = new PersonListRequest(); + request.setPageNo(1); + request.setPageSize(100); + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi("/api/resource/v2/person/personList", body); + return resultStr; + } + + /** + * 获取组织列表 + */ + @PostMapping("/hik/org/orgList") + @ResponseBody + public Object orgList() { + PersonListRequest request = new PersonListRequest(); + request.setPageNo(1); + request.setPageSize(100); + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi("/api/resource/v1/org/orgList", body); + return resultStr; + } + + /** + * 查询访客权限下载记录 + */ + @PostMapping("/hik/auth/result") + @ResponseBody + public Object authResult() { + PersonListRequest request = new PersonListRequest(); + request.setPageNo(1); + request.setPageSize(100); + request.setOrderId("ba101db6246711edaea66f7939a13638"); + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi("/api/visitor/v1/auth/result", body); + return resultStr; + } + + /** + * 人脸图片获取 + */ + @PostMapping("/hik/face/picture") + @ResponseBody + public Object facePicture() { + FaceRequest request = new FaceRequest(); +// List list = new ArrayList<>(); +// list.add(""); + request.setCertificateNum("wanggong"); + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi("/api/frs/v1/face", body); + return resultStr; + } + } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/AssetInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/AssetInfoMapper.java index 4f64e83..c0684ee 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/AssetInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/AssetInfoMapper.java @@ -17,6 +17,6 @@ @Mapper public interface AssetInfoMapper extends BaseMapper { - List getAssetInfoListPage(@Param("page") Page page, AssetInfoRequest assetInfoRequest); + List getAssetInfoListPage(@Param("page") Page page, @Param("assetInfoRequest") AssetInfoRequest assetInfoRequest); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/AttendanceInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/AttendanceInfoMapper.java index f9e793e..ec87e46 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/AttendanceInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/AttendanceInfoMapper.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.statistics.AttendanceNumberDTO; import com.casic.missiles.modular.dto.statistics.AttendanceRatioDTO; import com.casic.missiles.modular.model.AttendanceInfo; import org.apache.ibatis.annotations.Mapper; @@ -17,7 +18,7 @@ */ @Mapper public interface AttendanceInfoMapper extends BaseMapper { - List getAttendanceInfoListPage(@Param("page") Page page, StaffInfoRequest attendanceInfoRequest); + List getAttendanceInfoListPage(@Param("page") Page page, @Param("attendanceInfoRequest") StaffInfoRequest attendanceInfoRequest); AttendanceInfo selectByCodeAndDate(@Param("staffCode") String staffCode); @@ -26,4 +27,8 @@ List getCountByTypeAndDateForMonth(@Param("staffType")String staffType); List getCountByTypeAndDateForYear(@Param("staffType")String staffType); + + List getCountForWeek(); + + List getCountForDay(); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java index ce94b8f..6137a7d 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java @@ -17,5 +17,5 @@ @Mapper public interface BlackInfoMapper extends BaseMapper { - List getBlackInfoListPage(@Param("page") Page page, BlackInfoRequest blackInfoRequest); + List getBlackInfoListPage(@Param("page") Page page, @Param("blackInfoRequest") BlackInfoRequest blackInfoRequest); } 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 efda6b3..50aaa6f 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 @@ -20,7 +20,7 @@ List getCaseInfoListPage(@Param("page") Page page, @Param("caseInfoRequest") CaseInfoRequest caseInfoRequest); - int updateStatusById(CaseInfoRequest caseInfoRequest); + int updateStatusById(@Param("caseInfoRequest") CaseInfoRequest caseInfoRequest); List selectByLevelAndMonth(@Param("year") String year); @@ -47,4 +47,20 @@ List selectPreWeekCountByThirtyDay(); List selectPreDayCountBySevenDay(); + + Integer selectDemobilizedCount(@Param("eventType") Number personnelDemobilizedEvent); + + List selectPreMonthCount(); + + List selectListBySevenDay(); + + List selectListByToday(); + + List selectListByToday2(); + + List selectListByToday3(); + + List selectListByType(@Param("eventType") Number eventType); + + List selectDemobilizedCountByHour(@Param("eventType") Number eventType); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/CategoryLevelMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/CategoryLevelMapper.java index 52fc714..afe1650 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/CategoryLevelMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/CategoryLevelMapper.java @@ -17,9 +17,9 @@ @Mapper public interface CategoryLevelMapper extends BaseMapper { - List getCaseCategoryLevelListPage(@Param("page") Page page, CategoryLevelRequest categoryLevelRequest); + List getCaseCategoryLevelListPage(@Param("page") Page page, @Param("categoryLevelRequest") CategoryLevelRequest categoryLevelRequest); - List getCaseCategoryLevelList(CategoryLevelRequest categoryLevelRequest); + List getCaseCategoryLevelList(@Param("categoryLevelRequest") CategoryLevelRequest categoryLevelRequest); CaseCategoryLevel getCaseCategoryLevel(@Param("categoryLevelCode") String categoryLevelCode); 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 66353b1..2555a09 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 @@ -19,7 +19,7 @@ @Mapper public interface DeviceInfoMapper extends BaseMapper { - List getDeviceInfoListPage(@Param("page") Page page, DeviceInfoRequest deviceInfoRequest); + List getDeviceInfoListPage(@Param("page") Page page, @Param("deviceInfoRequest") DeviceInfoRequest deviceInfoRequest); List getDeviceInfoList(@Param("deviceInfoRequest") DeviceInfoRequest deviceInfoRequest); @@ -27,6 +27,8 @@ DeviceInfo getByIndexCode(@Param("srcIndex") String srcIndex); + DeviceInfo getByIp(@Param("ip") String ip); + List selectIndexCodesByCodes(@Param("deviceCodes") List deviceCodes); List selectByType(@Param("devType") String devType); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java index 41dd0af..5bfaf63 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java @@ -5,6 +5,7 @@ import com.casic.missiles.modular.dto.DeviceRepairRequest; import com.casic.missiles.modular.model.DeviceRepairLog; import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; import java.util.List; @@ -16,7 +17,7 @@ @Mapper public interface DeviceRepairLogMapper extends BaseMapper { - List getDeviceRepairListPage(Page page, DeviceRepairRequest deviceRepairRequest); + List getDeviceRepairListPage(@Param("page") Page page, @Param("deviceRepairRequest")DeviceRepairRequest deviceRepairRequest); - List getDeviceRepairList(DeviceRepairRequest deviceRepairRequest); + List getDeviceRepairList(@Param("deviceRepairRequest") DeviceRepairRequest deviceRepairRequest); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java index 9035c47..4823ac1 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java @@ -18,7 +18,7 @@ @Mapper public interface FireEquipInfoMapper extends BaseMapper { - List getFireEquipInfoListPage(@Param("page") Page page, FireEquipRequest fireEquipRequest); + List getFireEquipInfoListPage(@Param("page") Page page, @Param("fireEquipRequest") FireEquipRequest fireEquipRequest); FireEquipInfo getFireEquipInfo(@Param("equipCode") String equipCode); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/GateGroupMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/GateGroupMapper.java index d8c330d..977a427 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/GateGroupMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/GateGroupMapper.java @@ -17,7 +17,7 @@ */ @Mapper public interface GateGroupMapper extends BaseMapper { - List getGateGroupListPage(@Param("page") Page page, GateGroupRequest gateGroupRequest); + List getGateGroupListPage(@Param("page") Page page, @Param("gateGroupRequest") GateGroupRequest gateGroupRequest); GateGroup getGateGroupByName(@Param("groupName") String groupName); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/HazardLevelMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/HazardLevelMapper.java index 8957780..dcf47bb 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/HazardLevelMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/HazardLevelMapper.java @@ -17,11 +17,13 @@ @Mapper public interface HazardLevelMapper extends BaseMapper { - List getCaseHazardLevelListPage(@Param("page") Page page, HazardLevelRequest hazardLevelRequest); + List getCaseHazardLevelListPage(@Param("page") Page page, @Param("hazardLevelRequest") HazardLevelRequest hazardLevelRequest); - List getCaseHazardLevelList(HazardLevelRequest hazardLevelRequest); + List getCaseHazardLevelList(@Param("hazardLevelRequest") HazardLevelRequest hazardLevelRequest); CaseHazardLevel getCaseHazardLevel(@Param("hazardLevelCode") String hazardLevelCode); List selectHazardName(); + + String selectHazardNameByCode(@Param("hazardLevelCode") String hazardLevelCode); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/HikCaseDefineMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/HikCaseDefineMapper.java index 0dc47d1..f162fef 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/HikCaseDefineMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/HikCaseDefineMapper.java @@ -12,5 +12,5 @@ */ @Mapper public interface HikCaseDefineMapper extends BaseMapper { - HikCaseDefine getHikCaseDefine(@Param("caseTypeCode") Long caseTypeCode); + HikCaseDefine getHikCaseDefine(@Param("caseTypeCode") Number caseTypeCode); } 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 f8a674c..fe5afc2 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 @@ -17,11 +17,13 @@ @Mapper public interface StaffInfoMapper extends BaseMapper { - List getStaffInfoListPage(@Param("page") Page page, StaffInfoRequest staffInfoRequest); + List getStaffInfoListPage(@Param("page") Page page, @Param("staffInfoRequest") StaffInfoRequest staffInfoRequest); StaffInfo selectByCode(@Param("staffCode") String staffCode); - List getStaffInfoList(StaffInfoRequest staffInfoRequest); + List getStaffInfoList(@Param("staffInfoRequest") StaffInfoRequest staffInfoRequest); - List selectBatchCodes(List list); + List selectBatchCodes(@Param("list") List list); + + int updateByCodeForCard(@Param("staffCode") String staffCode, @Param("cardNo") String cardNo); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitInfoMapper.java index b1217c5..6c52542 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitInfoMapper.java @@ -16,7 +16,7 @@ */ @Mapper public interface VisitInfoMapper extends BaseMapper { - List getVisitInfoListPage(@Param("page") Page page, VisitorRequest visitorRequest); + List getVisitInfoListPage(@Param("page") Page page, @Param("visitorRequest") VisitorRequest visitorRequest); VisitInfo selectByOrderId(@Param("orderId") String orderId); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitorApplyMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitorApplyMapper.java index c09f3c0..6ea55bd 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitorApplyMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitorApplyMapper.java @@ -18,7 +18,7 @@ @Mapper public interface VisitorApplyMapper extends BaseMapper { - List getVisitorApplyListPage(@Param("page") Page page, VisitorApplyRequest visitorApplyRequest); + List getVisitorApplyListPage(@Param("page") Page page, @Param("visitorApplyRequest") VisitorApplyRequest visitorApplyRequest); List selectByVisitReason(); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/AttendanceInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/AttendanceInfoMapper.xml index b2ece71..f8bdd6e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/AttendanceInfoMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/AttendanceInfoMapper.xml @@ -43,7 +43,8 @@ and staff_type = #{staffType} - and YEARWEEK(date_format(atte_date, '%Y-%m-%d'), 1) = YEARWEEK(now(),1); + AND DATE_SUB(CURDATE(), INTERVAL 7 DAY) <= DATE(atte_date) + GROUP BY DATE_FORMAT(atte_date, '%Y-%m-%d') @@ -69,4 +70,20 @@ GROUP BY DATE_FORMAT(atte_date, '%Y-%m') + + + \ No newline at end of file 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 2b6953f..06ec0a8 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 @@ -28,7 +28,9 @@ @@ -87,7 +89,8 @@ SELECT hazard_level_code as levelCode, count(id) as quantity FROM bus_case_info WHERE hazard_level_code is not null - AND DATE_SUB(CURDATE(), INTERVAL 7 DAY) <= date(happen_time); + AND is_key_area = 1 + AND DATE_SUB(CURDATE(), INTERVAL 7 DAY) <= date(happen_time) GROUP BY hazard_level_code @@ -95,7 +98,8 @@ SELECT hazard_level_code as levelCode, count(id) as quantity FROM bus_case_info WHERE hazard_level_code is not null - AND DATE_SUB(CURDATE(), INTERVAL 30 DAY) <= date(happen_time); + AND is_key_area = 1 + AND DATE_SUB(CURDATE(), INTERVAL 30 DAY) <= date(happen_time) GROUP BY hazard_level_code @@ -122,4 +126,71 @@ AND hazard_level_code is not null GROUP BY DATE_FORMAT(happen_time,'%Y-%m-%d') + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/CategoryLevelMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/CategoryLevelMapper.xml index 4670b1f..1d25cbd 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/CategoryLevelMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/CategoryLevelMapper.xml @@ -20,11 +20,11 @@ SELECT * FROM bus_case_category_level WHERE 1=1 - - and code = #{code} + + and code = #{categoryLevelRequest.code} - - and name = #{name} + + and name = #{categoryLevelRequest.name} ORDER by create_time DESC diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/BlackListController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/BlackListController.java index a27f9f8..0c06661 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/BlackListController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/BlackListController.java @@ -1,13 +1,18 @@ package com.casic.missiles.modular.controller; +import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.base.controller.ExportController; import com.casic.missiles.core.page.PageFactory; import com.casic.missiles.model.response.ResponseData; import com.casic.missiles.modular.dto.BlackInfoRequest; +import com.casic.missiles.modular.dto.BlackPictureRequest; +import com.casic.missiles.modular.dto.hik.PersonInfoRequest; +import com.casic.missiles.modular.enums.HikUri; import com.casic.missiles.modular.enums.OperateTypeEnum; import com.casic.missiles.modular.model.BlackInfo; import com.casic.missiles.modular.service.BlackInfoService; +import com.casic.missiles.modular.util.HikUtil; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; @@ -56,4 +61,22 @@ return null; } + /** + * 黑名单人员照片 + */ + @PostMapping("/personPicture") + @ResponseBody + public Object personPicture(@RequestBody BlackPictureRequest blackPictureRequest){ + //获取照片 + String picUri = blackPictureRequest.getPicUri(); + String serverIndexCode = blackPictureRequest.getServerIndexCode(); + PersonInfoRequest picRequest = new PersonInfoRequest(); + picRequest.setPicUri(picUri); + picRequest.setServerIndexCode(serverIndexCode); + String reBody = JSONObject.toJSONString(picRequest); + //重定向地址获取 + String url = HikUtil.hikApiFor302(HikUri.PERSON_PICTURE, reBody); + return ResponseData.success(url); + } + } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/DeviceController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/DeviceController.java index e1c4eba..666bbee 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/DeviceController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/DeviceController.java @@ -107,7 +107,7 @@ } /** - * 设备维修管理查询(分页),需计算MTTR=总维修时间/故障次数 + * 设备状态计算与评判/设备维修管理查询(分页),需计算MTTR=总维修时间/故障次数 */ @PostMapping("/repair/listPage") @ResponseBody @@ -211,7 +211,7 @@ //需根据设备编号获取到对应的门禁点唯一标识 doorControlRequest.setDoorIndexCodes(indexCodes); doorControlRequest.setControlType(Integer.valueOf(gateGroupDTO.getStatus())); - String body = JSONObject.toJSONString(deviceCodes); + String body = JSONObject.toJSONString(doorControlRequest); String resultStr = HikUtil.hikApi(HikUri.DOOR_CONTROL, body); JSONObject resultJson = (JSONObject)JSONObject.parse(resultStr); if (!"0".equals(resultJson.get("code"))) { diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/StaffController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/StaffController.java index b58ccab..704093c 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/StaffController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/StaffController.java @@ -2,15 +2,21 @@ import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.util.StrUtil; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.base.controller.ExportController; import com.casic.missiles.core.page.PageFactory; import com.casic.missiles.model.response.ErrorResponseData; import com.casic.missiles.model.response.ResponseData; import com.casic.missiles.modular.dto.StaffInfoRequest; +import com.casic.missiles.modular.dto.hik.PersonInfoRequest; +import com.casic.missiles.modular.dto.hik.StaffCardRequest; +import com.casic.missiles.modular.enums.HikUri; import com.casic.missiles.modular.enums.OperateTypeEnum; import com.casic.missiles.modular.model.StaffInfo; import com.casic.missiles.modular.service.StaffInfoService; +import com.casic.missiles.modular.util.HikUtil; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; @@ -110,4 +116,60 @@ } return ResponseData.success(); } + + /** + * 批量开卡,添加人员之后调用,若在一个接口中添加人员成功开卡失败则第二次添加时会有问题 + */ + @PostMapping("/cardBinding") + @ResponseBody + public Object cardBinding(@RequestBody StaffCardRequest staffCardRequest) { + String body = JSONObject.toJSONString(staffCardRequest); + String resultStr = HikUtil.hikApi(HikUri.CARD_BINDING, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (!"0".equals(resultJson.get("code"))) { + log.error("请求海康,批量开卡失败,海康response:{}", resultStr); + return ResponseData.error("批量开卡失败"); + } + //保存卡号 + if(staffInfoService.saveCardInfo(staffCardRequest) > 0){ + return ResponseData.success(); + } + return ResponseData.error("批量开卡失败"); + } + + /** + * 获取员工照片,海康存储 + */ + @PostMapping("/personPicture/{staffCode}") + @ResponseBody + public Object personPicture(@PathVariable("staffCode") String staffCode){ + //获取员工详细信息,含图片服务器、uri + PersonInfoRequest request = new PersonInfoRequest(); + List list = new ArrayList<>(); + list.add(staffCode); + request.setParamName("personId"); + request.setParamValue(list); + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi(HikUri.PERSON_INFO, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (!"0".equals(resultJson.get("code"))) { + log.error("请求海康,根据人员唯一字段获取人员详细信息失败,海康response:{}", resultStr); + return ResponseData.error("获取员工照片失败"); + } + //获取照片 + JSONObject data = (JSONObject) resultJson.get("data"); + JSONArray dataArray = (JSONArray) data.get("list"); + JSONObject jsonObject = (JSONObject) dataArray.get(0); + JSONArray personPhoto = (JSONArray) jsonObject.get("personPhoto"); + JSONObject photo = (JSONObject) personPhoto.get(0); + String picUri = photo.getString("picUri"); + String serverIndexCode = photo.getString("serverIndexCode"); + PersonInfoRequest picRequest = new PersonInfoRequest(); + picRequest.setPicUri(picUri); + picRequest.setServerIndexCode(serverIndexCode); + String reBody = JSONObject.toJSONString(picRequest); + //重定向地址获取 + String url = HikUtil.hikApiFor302(HikUri.PERSON_PICTURE, reBody); + return ResponseData.success(url); + } } 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 4a07dd9..7b1dcf6 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 @@ -16,6 +16,7 @@ import com.casic.missiles.modular.redis.key.CacheKeys; import com.casic.missiles.modular.service.CockpitService; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.util.CollectionUtils; import org.springframework.web.bind.annotation.*; @@ -24,10 +25,7 @@ import java.text.NumberFormat; import java.time.LocalDateTime; import java.time.temporal.ChronoUnit; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.util.*; import java.util.stream.Collectors; /** @@ -73,6 +71,9 @@ private StatisticNumberMapper numberMapper; @Autowired + private HazardLevelMapper hazardLevelMapper; + + @Autowired private AccessGroupConfig accessGroupConfig; /** @@ -104,8 +105,24 @@ public Object buildingNumberPerHour(){ //当天按小时分组的人数 List list = numberMapper.selectListByTime(); - Map> collect = list.stream().collect(Collectors.groupingBy(BuildingNumberDTO::getStatisticPosition)); - return ResponseData.success(collect); + Map> collect = list.stream().collect(Collectors.groupingBy(BuildingNumberDTO::getStatisticTime)); + //定时任务中已将每小时三栋楼人数存到数据库 + //将一期主楼和录制楼人数合并,二期单算 + List> resultList = new ArrayList<>(); + collect.keySet().forEach(key -> { + List buildingNumberDTOS = collect.get(key); + BuildingNumberDTO mainBuildingOne = buildingNumberDTOS.get(0); + BuildingNumberDTO mainBuildingTwo = buildingNumberDTOS.get(1); + BuildingNumberDTO recordingBuilding = buildingNumberDTOS.get(2); + HashMap resultMap = new HashMap<>(); + Integer oneQuantity = Integer.valueOf(mainBuildingOne.getStatisticQuantity()); + Integer recordingQuantity = Integer.valueOf(recordingBuilding.getStatisticQuantity()); + resultMap.put("staticTime", mainBuildingOne.getStatisticTime()); + resultMap.put(mainBuildingOne.getStatisticPositionName()+"、"+recordingBuilding.getStatisticPositionName(), String.valueOf(oneQuantity+recordingQuantity)); + resultMap.put(mainBuildingTwo.getStatisticPositionName(), mainBuildingTwo.getStatisticQuantity()); + resultList.add(resultMap); + }); + return ResponseData.success(resultList); } /** @@ -151,12 +168,11 @@ public Object securityNumber() { QueryWrapper wrapper = new QueryWrapper<>(); wrapper.eq("staff_type", 2); + // TODO: 2022/9/2 后续使用产品确定的每天出勤的安保人员的数量 Integer total = staffInfoMapper.selectCount(wrapper); - //当日离岗事件个数 - QueryWrapper wrapper1 = new QueryWrapper<>(); - wrapper1.eq("hik_event_type", SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); - wrapper1.apply("date_format(now(),'%Y-%m-%d') = date_format(happen_time,'%Y-%m-%d')"); - Integer leave = caseInfoMapper.selectCount(wrapper1); + //当日离岗事件按设备去重后的个数 + // TODO: 2022/9/2 目前相当于24小时内的计算,之后看需要可改成自定义小时数计算离岗率,即离岗+6小时内仅一次离岗则恢复为100%,多次则累加离岗次数计算离岗率 + Integer leave = caseInfoMapper.selectDemobilizedCount(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); NumberFormat numberFormat = NumberFormat.getInstance(); // 设置精确到小数点后2位 numberFormat.setMaximumFractionDigits(2); @@ -179,7 +195,6 @@ @ResponseBody public Object visitorApplyDetail() { List reasonGroup = applyMapper.selectByVisitReason(); - HashMap resultMap = new HashMap<>(); NumberFormat numberFormat = NumberFormat.getInstance(); // 设置精确到小数点后2位 numberFormat.setMaximumFractionDigits(2); @@ -187,12 +202,17 @@ if(0 == sum){ return ResponseData.success(); } + List resultList = new ArrayList<>(); reasonGroup.forEach(group -> { String reasonName = dictService.getDictNameByCode(SecurityEventDict.VISIT_REASON, group.getVisitReason()); String result = numberFormat.format((float) group.getQuantity() / (float) sum * 100); - resultMap.put(reasonName, result+"%"); + ApplyReasonGroupDTO applyReasonGroupDTO = new ApplyReasonGroupDTO(); + applyReasonGroupDTO.setQuantity(group.getQuantity()); + applyReasonGroupDTO.setVisitReason(reasonName); + applyReasonGroupDTO.setRatio(result+"%"); + resultList.add(applyReasonGroupDTO); }); - return ResponseData.success(resultMap); + return ResponseData.success(resultList); } /** @@ -247,6 +267,32 @@ } /** + * 机动力量实时在岗率,在岗人数除以总应在岗人数,用离岗+6小时内恢复为100%,6小时外再计算 + */ + @GetMapping("/staff/beOnDutyRatio") + @ResponseBody + public Object beOnDutyRatio() { + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("staff_type", 2); + // TODO: 2022/9/2 后续使用产品确定的每天出勤的安保人员的数量 + Integer total = staffInfoMapper.selectCount(wrapper); + if(0 == total){ + return ResponseData.success(null); + } + //当日离岗事件按设备去重后的个数 + // TODO: 2022/9/2 目前相当于24小时内的计算,之后看需要可改成自定义小时数计算离岗率,即离岗+6小时内仅一次离岗则恢复为100%,多次则累加离岗次数计算离岗率 + List onDutyRatioDTOS = caseInfoMapper.selectDemobilizedCountByHour(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); + onDutyRatioDTOS.forEach(dto -> { + NumberFormat numberFormat = NumberFormat.getInstance(); + // 设置精确到小数点后2位 + numberFormat.setMaximumFractionDigits(2); + String result = numberFormat.format(100 - Float.valueOf(dto.getQuantity()) / (float) total * 100); + dto.setRatio(result+"%"); + }); + return ResponseData.success(onDutyRatioDTOS); + } + + /** * 闸机速通门统计-设备状态分组计算数量,devType传闸机字典key * 视频频监控摄像机统计-设备状态分组计算数量,devType传摄像头字典key */ @@ -262,12 +308,17 @@ if(sum <= 0){ return ResponseData.error("无该类设备信息"); } + List resultList = new ArrayList<>(); gateStatusGroup.forEach(group -> { String devStatus = dictService.getDictNameByCode(SecurityEventDict.DEVICE_STATUS, group.getStatus()); String result = numberFormat.format((float) group.getQuantity() / (float) sum * 100); - resultMap.put(devStatus, result+"%"); + GateStatusGroupResponse gateStatusGroupResponse = new GateStatusGroupResponse(); + gateStatusGroupResponse.setStatus(devStatus); + gateStatusGroupResponse.setRatio(result+"%"); + resultList.add(gateStatusGroupResponse); }); - resultMap.put("总", sum); + resultMap.put("total", sum); + resultMap.put("list", resultList); return ResponseData.success(resultMap); } @@ -282,17 +333,38 @@ String position = securityScoreDTO.getPosition(); List caseInfos = caseInfoMapper.selectByPosition(position); //查询各危险级别权重、各类别权重,放入map,避免循环中多次查数据库 - + HashMap hazardScoreMap = new HashMap<>(); + List caseHazardLevelList = hazardLevelMapper.getCaseHazardLevelList(null); + caseHazardLevelList.forEach(hazardLevel -> { + hazardScoreMap.put(hazardLevel.getCode(), hazardLevel.getWeight()); + }); + HashMap categoryScoreMap = new HashMap<>(); + List categoryLevelList = categoryLevelMapper.getCaseCategoryLevelList(null); + categoryLevelList.forEach(categoryLevel -> { + categoryScoreMap.put(categoryLevel.getCode(), categoryLevel.getWeight()); + }); + //事件按楼层分组,计算 List securityScoreDTOs = new ArrayList<>(); caseInfos.forEach(caseInfo -> { SecurityScoreDTO securityScoreDTO1 = new SecurityScoreDTO(); + securityScoreDTO1.setPosition(caseInfo.getPosition()); securityScoreDTO1.setArea(caseInfo.getArea()); - // TODO: 2022/8/4 楼层评分计算根据产品定义调整 -// caseInfo.get -// securityScoreDTO1.setScore(); + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); + Double score = 100 - Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + securityScoreDTO1.setScore(score); + securityScoreDTOs.add(securityScoreDTO1); }); - - return null; + 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); + }); + return ResponseData.success(securityScoreDTOs); } /** @@ -303,9 +375,13 @@ public Object SecurityFrequency(@RequestBody SecurityFrequencyDTO securityFrequencyDTO) { String year = securityFrequencyDTO.getYear(); String month = securityFrequencyDTO.getMonth(); - Integer quantity = caseInfoMapper.selectCountByMonth(year, month); - securityFrequencyDTO.setQuantity(quantity); - return ResponseData.success(securityFrequencyDTO); + if(!StringUtils.isEmpty(year) && StringUtils.isEmpty(month)){ + Integer quantity = caseInfoMapper.selectCountByMonth(year, month); + securityFrequencyDTO.setQuantity(quantity); + return ResponseData.success(securityFrequencyDTO); + } + List list = caseInfoMapper.selectPreMonthCount(); + return ResponseData.success(list); } } 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 ae4d770..f4f075c 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 @@ -1,20 +1,25 @@ package com.casic.missiles.modular.controller.cockpit; +import cn.hutool.core.date.DateUnit; import cn.hutool.core.date.DateUtil; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.casic.missiles.model.response.ResponseData; -import com.casic.missiles.modular.dao.AttendanceInfoMapper; -import com.casic.missiles.modular.dao.CaseInfoMapper; -import com.casic.missiles.modular.dao.HazardLevelMapper; -import com.casic.missiles.modular.dao.StaffInfoMapper; +import com.casic.missiles.modular.dao.*; +import com.casic.missiles.modular.dto.DeviceRepairLogDTO; +import com.casic.missiles.modular.dto.DeviceRepairRequest; import com.casic.missiles.modular.dto.statistics.*; +import com.casic.missiles.modular.enums.SecurityEventType; +import com.casic.missiles.modular.model.CaseCategoryLevel; import com.casic.missiles.modular.model.CaseHazardLevel; +import com.casic.missiles.modular.model.CaseInfo; import com.casic.missiles.modular.model.StaffInfo; +import com.casic.missiles.modular.service.DeviceInfoService; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.util.CollectionUtils; import org.springframework.web.bind.annotation.*; +import java.math.BigDecimal; import java.text.NumberFormat; import java.util.*; import java.util.stream.Collectors; @@ -40,6 +45,12 @@ @Autowired private HazardLevelMapper hazardLevelMapper; + @Autowired + private CategoryLevelMapper categoryLevelMapper; + + @Autowired + private DeviceInfoService deviceInfoService; + /** * 安防事件时域频次统计,每月的每天安防事件个数(原方案) * 月维度:展示每个月的每天的数据 @@ -89,15 +100,17 @@ List monthList = caseInfoMapper.selectPreMonthCountByYear(year); Map> collect = monthList.stream().collect(Collectors.groupingBy(PreMonthOrWeekCaseDTO::getHazardLevelCode)); HashMap strAvgMap = new HashMap<>(); + List resultList = new ArrayList<>(); for (String key : collect.keySet()) { List preMonthOrWeekCaseDTOS = collect.get(key); int sum = preMonthOrWeekCaseDTOS.stream().mapToInt(PreMonthOrWeekCaseDTO::getQuantity).sum(); //若年份是本年,则使用个安防级别数量/当前月份数 //若不是本年,除数为12 MonthAndWeekDTO monthAndWeekDTO = new MonthAndWeekDTO(); + String hazardName = hazardLevelMapper.selectHazardNameByCode(key); + monthAndWeekDTO.setLevelName(hazardName); if(year.equals(String.valueOf(DateUtil.thisYear()))){ monthAndWeekDTO.setMonthQuantity(sum / DateUtil.thisMonth()); -// monthAndWeekDTO.setLevelName(); strAvgMap.put(key, monthAndWeekDTO); }else{ monthAndWeekDTO.setMonthQuantity(sum / 12); @@ -113,27 +126,37 @@ if(year.equals(String.valueOf(DateUtil.thisYear()))){ if(!Objects.isNull(strAvgMap.get(key))){ MonthAndWeekDTO monthAndWeekDTO = strAvgMap.get(key); + String hazardName = hazardLevelMapper.selectHazardNameByCode(key); + monthAndWeekDTO.setLevelName(hazardName); monthAndWeekDTO.setWeekQuantity(sum / DateUtil.thisWeekOfYear()); strAvgMap.put(key, monthAndWeekDTO); }else{ MonthAndWeekDTO monthAndWeekDTO = new MonthAndWeekDTO(); + String hazardName = hazardLevelMapper.selectHazardNameByCode(key); + monthAndWeekDTO.setLevelName(hazardName); monthAndWeekDTO.setWeekQuantity(sum / DateUtil.thisWeekOfYear()); strAvgMap.put(key, monthAndWeekDTO); } }else{ if(!Objects.isNull(strAvgMap.get(key))){ MonthAndWeekDTO monthAndWeekDTO = strAvgMap.get(key); + String hazardName = hazardLevelMapper.selectHazardNameByCode(key); + monthAndWeekDTO.setLevelName(hazardName); monthAndWeekDTO.setWeekQuantity(sum / 52); strAvgMap.put(key, monthAndWeekDTO); }else{ MonthAndWeekDTO monthAndWeekDTO = new MonthAndWeekDTO(); + String hazardName = hazardLevelMapper.selectHazardNameByCode(key); + monthAndWeekDTO.setLevelName(hazardName); monthAndWeekDTO.setWeekQuantity(sum / 52); strAvgMap.put(key, monthAndWeekDTO); } } } - avgMonthAndWeekGroupDTO.setMap(strAvgMap); - return ResponseData.success(avgMonthAndWeekGroupDTO); + strAvgMap.keySet().forEach(key -> { + resultList.add(strAvgMap.get(key)); + }); + return ResponseData.success(resultList); } /** @@ -181,12 +204,178 @@ } /** - * 员工考勤人数变化,功能待定 + * 员工考勤人数变化,统计当天(横坐标为时)及近7天(横坐标为天)的考勤人数变化,只要发生一次考勤识别,次数的基数就正常增加(没有上班下班区分) */ + @PostMapping("/staff/attendanceNumber/{dimension}") + @ResponseBody + public Object attendanceNumber(@PathVariable("dimension") String dimension) { + List attendanceNumberDTOs = null; + List> resultList = new ArrayList<>(); + if("week".equals(dimension)){ + //近7天数据按天分组统计 + attendanceNumberDTOs = attendanceInfoMapper.getCountForWeek(); + }else if("day".equals(dimension)) { + //今天数据按小时分组统计 + attendanceNumberDTOs = attendanceInfoMapper.getCountForDay(); + } + if(CollectionUtils.isEmpty(attendanceNumberDTOs)){ + return ResponseData.error("该查询条件下,无员工出勤数据!"); + } + Map> collect = attendanceNumberDTOs.stream().collect(Collectors.groupingBy(AttendanceNumberDTO::getDate)); + collect.keySet().forEach(key -> { + List attendanceNumberDTOS = collect.get(key); + AttendanceNumberDTO attendanceNumberDTO = attendanceNumberDTOS.get(0); + AttendanceNumberDTO attendanceNumberDTO2 = attendanceNumberDTOS.get(1); + Map resultMap = new HashMap<>(); + resultMap.put(attendanceNumberDTO.getStaffType(), attendanceNumberDTO.getQuantity()); + resultMap.put(attendanceNumberDTO2.getStaffType(), attendanceNumberDTO2.getQuantity()); + resultMap.put("staticTime", attendanceNumberDTO.getDate()); + resultList.add(resultMap); + }); + return ResponseData.success(resultList); + } /** - * 近30天/近一周安保人员到岗排行 + * 早晚高峰区域安防评估 */ + @PostMapping("/security/assessment/{dimension}") + @ResponseBody + public Object securityAssessment(@PathVariable("dimension") String dimension) { + //查询各危险级别权重、各类别权重,放入map,避免循环中多次查数据库 + HashMap hazardScoreMap = new HashMap<>(); + List caseHazardLevelList = hazardLevelMapper.getCaseHazardLevelList(null); + caseHazardLevelList.forEach(hazardLevel -> { + hazardScoreMap.put(hazardLevel.getCode(), hazardLevel.getWeight()); + }); + HashMap categoryScoreMap = new HashMap<>(); + List categoryLevelList = categoryLevelMapper.getCaseCategoryLevelList(null); + categoryLevelList.forEach(categoryLevel -> { + categoryScoreMap.put(categoryLevel.getCode(), categoryLevel.getWeight()); + }); + HashMap hashMap = new HashMap<>(); + if("week".equals(dimension)){ + //近7天早晚高峰数据 + List caseInfos = caseInfoMapper.selectListBySevenDay(); + //按时间(天)进行分组 + caseInfos.forEach(caseInfo -> { + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); + Double score = Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + String[] array = caseInfo.getHappenTime().split(" "); + String dayTime = array[0]; + BigDecimal preScore; + if(hashMap.containsKey(dayTime)){ + Double aDouble = hashMap.get(dayTime); + preScore = new BigDecimal(aDouble.toString()); + + }else{ + preScore = new BigDecimal("100.0"); + } + BigDecimal nowScore = new BigDecimal(score.toString()); + hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); + }); + return ResponseData.success(hashMap); + }else if("day".equals(dimension)) { + //今天数据按小时分组统计 + List caseInfos = caseInfoMapper.selectListByToday(); + caseInfos.forEach(caseInfo -> { + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); + Double score = Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + String[] array = caseInfo.getHappenTime().split(":"); + String dayTime = array[0]; + BigDecimal preScore; + if(hashMap.containsKey(dayTime)){ + Double aDouble = hashMap.get(dayTime); + preScore = new BigDecimal(aDouble.toString()); + + }else{ + preScore = new BigDecimal("100.0"); + } + BigDecimal nowScore = new BigDecimal(score.toString()); + hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); + }); + return ResponseData.success(hashMap); + } + return null; + } + + /** + * 重点区域安防事态评估,统计重点区域6:00-23:00按小时分组数据 + */ + @GetMapping("/security/keyAreaStatistic") + @ResponseBody + public Object keyAreaStatistic() { + //查询各危险级别权重、各类别权重,放入map,避免循环中多次查数据库 + HashMap hazardScoreMap = new HashMap<>(); + List caseHazardLevelList = hazardLevelMapper.getCaseHazardLevelList(null); + caseHazardLevelList.forEach(hazardLevel -> { + hazardScoreMap.put(hazardLevel.getCode(), hazardLevel.getWeight()); + }); + HashMap categoryScoreMap = new HashMap<>(); + List categoryLevelList = categoryLevelMapper.getCaseCategoryLevelList(null); + categoryLevelList.forEach(categoryLevel -> { + categoryScoreMap.put(categoryLevel.getCode(), categoryLevel.getWeight()); + }); + HashMap hashMap = new HashMap<>(); + //今天数据按小时分组统计 + List caseInfos = caseInfoMapper.selectListByToday2(); + caseInfos.forEach(caseInfo -> { + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); + Double score = Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + String[] array = caseInfo.getHappenTime().split(":"); + String dayTime = array[0]; + BigDecimal preScore; + if(hashMap.containsKey(dayTime)){ + Double aDouble = hashMap.get(dayTime); + preScore = new BigDecimal(aDouble.toString()); + + }else{ + preScore = new BigDecimal("100.0"); + } + BigDecimal nowScore = new BigDecimal(score.toString()); + hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); + }); + return ResponseData.success(hashMap); + } + + /** + * 安防机动支援力量调配响应评估,根据事件已解决状态及已解决时间-发送时间,按时间(小时)分组统计 + */ + @GetMapping("/security/responseAssess") + @ResponseBody + public Object responseAssess() { + //查询各危险级别权重、各类别权重,放入map,避免循环中多次查数据库 + HashMap hazardScoreMap = new HashMap<>(); + List caseHazardLevelList = hazardLevelMapper.getCaseHazardLevelList(null); + caseHazardLevelList.forEach(hazardLevel -> { + hazardScoreMap.put(hazardLevel.getCode(), hazardLevel.getWeight()); + }); + HashMap hashMap = new HashMap<>(); + //今天数据按小时分组统计 + List caseInfos = caseInfoMapper.selectListByToday3(); + caseInfos.forEach(caseInfo -> { + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + //扣分=事件级别权重*未解决小时数 + Date updateTime = DateUtil.parse(caseInfo.getUpdateTime()); + Date happenTime = DateUtil.parse(caseInfo.getHappenTime()); + long between = DateUtil.between(updateTime, happenTime, DateUnit.HOUR); + Double score = Double.valueOf(hazardWeight)*between; + String[] array = caseInfo.getHappenTime().split(":"); + String dayTime = array[0]; + BigDecimal preScore; + if(hashMap.containsKey(dayTime)){ + Double aDouble = hashMap.get(dayTime); + preScore = new BigDecimal(aDouble.toString()); + }else{ + preScore = new BigDecimal("100.0"); + } + BigDecimal nowScore = new BigDecimal(score.toString()); + hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); + }); + return ResponseData.success(hashMap); + } /** * 重点区域威胁事件类型统计,优先级2,统计近7天和近30天 @@ -224,7 +413,34 @@ } /** - * 设备状态计算系数和评判,优先级3,需确认设备恢复时间是否可以获取 + * 近30天/近一周安保人员到岗排行 */ + + /** + * 安保等级评估,发生离岗事件减1分 + */ + @GetMapping("/security/levelAssess") + @ResponseBody + public Object securityLevelAssess() { + //今天数据按小时分组统计 + List resultList = caseInfoMapper.selectListByType(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); + resultList.forEach(result -> { + BigDecimal deScore = new BigDecimal(result.getQuantity()); + BigDecimal preScore = new BigDecimal("100.0"); + result.setScore(preScore.subtract(deScore).doubleValue()); + }); + return ResponseData.success(resultList); + } + + /** + * 设备状态计算系数和评判,即设备维修管理查询(不分页) + */ + @PostMapping("/device/repairList") + @ResponseBody + public Object repairList(@RequestBody DeviceRepairRequest deviceRepairRequest) { + List deviceRepairLogDTOS = deviceInfoService.deviceRepairListPage(deviceRepairRequest); + return ResponseData.success(deviceRepairLogDTOS); + } + } 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 fbf8ab6..c71a15a 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 @@ -1,13 +1,12 @@ package com.casic.missiles.modular.controller.hik; +import cn.hutool.core.date.DateTime; +import cn.hutool.core.date.DateUtil; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.casic.missiles.model.response.ResponseData; import com.casic.missiles.modular.dao.HikFaceGroupInfoMapper; -import com.casic.missiles.modular.dto.hik.EventSubscribeRequest; -import com.casic.missiles.modular.dto.hik.FaceGroupAdditionRequest; -import com.casic.missiles.modular.dto.hik.HikRecvEvent; -import com.casic.missiles.modular.dto.hik.OrgBatchAdd; +import com.casic.missiles.modular.dto.hik.*; import com.casic.missiles.modular.enums.HikUri; import com.casic.missiles.modular.enums.SecurityEventType; import com.casic.missiles.modular.model.CaseInfo; @@ -18,16 +17,20 @@ import com.casic.missiles.modular.util.CaseInfoFactoryUtil; import com.casic.missiles.modular.util.HikUtil; import com.casic.missiles.modular.util.ThreadPoolUtil; +import com.casic.missiles.modular.util.WebSocket; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; -import org.springframework.web.bind.annotation.*; +import org.springframework.util.CollectionUtils; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.RestController; -import java.net.InetAddress; -import java.net.UnknownHostException; import java.util.ArrayList; +import java.util.Iterator; import java.util.List; import java.util.Objects; @@ -38,7 +41,6 @@ */ @Slf4j @RestController -@RequestMapping("/hik") public class HikController { @Autowired @@ -53,28 +55,37 @@ @Autowired private HikService hikService; + @Autowired + private HikFaceGroupInfoMapper hikFaceGroupInfoMapper; + + @Autowired + private WebSocket webSocket; + @Value("${server.port}") private int serverPort; - @Autowired - private HikFaceGroupInfoMapper hikFaceGroupInfoMapper; /** * 海康事件订阅 */ - @PostMapping("/event/subscribe") + @PostMapping("/hik/event/subscribe") @ResponseBody - public Object eventSubscribe() throws UnknownHostException { + public Object eventSubscribe() { EventSubscribeRequest eventSubscribeRequest = new EventSubscribeRequest(); ArrayList list = new ArrayList<>(); list.add(SecurityEventType.DEVICE_OFFLINE); + list.add(SecurityEventType.DEVICE_ONLINE); list.add(SecurityEventType.KEY_PERSONNEL_IDENTIFY_EVENT); list.add(SecurityEventType.MONITORING_POINT_OFFLINE); + list.add(SecurityEventType.MONITORING_POINT_ONLINE); list.add(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); list.add(SecurityEventType.PERSONNEL_GATHER_EVENT); - InetAddress localHost = InetAddress.getLocalHost(); + list.add(SecurityEventType.VISITOR_REGISTER); + list.add(SecurityEventType.VISITOR_CHECKOUT); + list.add(SecurityEventType.HIGH_ALTITUDE_PARABOLIC); +// InetAddress localHost = InetAddress.getLocalHost(); eventSubscribeRequest.setEventTypes(list); - eventSubscribeRequest.setEventDest("https://" + localHost + ":" + serverPort + "/eventRcv"); + eventSubscribeRequest.setEventDest("http://" + "192.168.10.6" + ":" + serverPort + "/eventRcv"); //订阅类型,0-订阅原始事件,1-联动事件,2-原始事件和联动事件,不填使用默认值0 eventSubscribeRequest.setSubType(0); /** @@ -92,19 +103,25 @@ } /** + * 查询事件订阅信息 + */ + @PostMapping("/hik/event/query") + @ResponseBody + public Object eventQuery() { + String result = HikUtil.hikApi(HikUri.EVENT_INFO, ""); + return result; + } + + /** * 海康事件接收 */ @PostMapping("/eventRcv") @ResponseBody public Object eventRcv(@RequestBody HikRecvEvent hikRecvEvent) { //1、接收所需事件类型 - Long eventType = hikRecvEvent.getEventType(); + Number eventType = hikRecvEvent.getEventType(); log.info("接收到安防事件类型为:{}", eventType); CaseInfo caseInfo = caseInfoFactoryUtil.getCaseInfo(eventType); - //接收到不关心事件直接返回 - if(Objects.isNull(caseInfo)){ - return ResponseData.success(); - } //2、不同事件不同处理,caseInfoFactoryUtil已设置好事件基础定义信息 // 再为事件添加状态、设备编码、设备名称、位置、区域、时间 // 异步处理事件 @@ -114,19 +131,23 @@ caseHandle(hikRecvEvent, eventType, caseInfo); } })); +// caseHandle(hikRecvEvent, eventType, caseInfo); - return null; + return ResponseData.success(); } - private void caseHandle(HikRecvEvent hikRecvEvent, Long eventType, CaseInfo caseInfo) { + private void caseHandle(HikRecvEvent hikRecvEvent, Number eventType, CaseInfo caseInfo) { JSONArray eventArray = hikRecvEvent.getEventArray(); List caseInfos = new ArrayList<>(); - while (eventArray.stream().iterator().hasNext()) { + Iterator iterator = eventArray.iterator(); + while (iterator.hasNext()) { CaseInfo caseInfo1 = new CaseInfo(); - BeanUtils.copyProperties(caseInfo, caseInfo1); - JSONObject event = (JSONObject) eventArray.stream().iterator().next(); + if(!Objects.isNull(caseInfo)){ + BeanUtils.copyProperties(caseInfo, caseInfo1); + } + JSONObject event = (JSONObject) iterator.next(); //5种事件进行不同处理 - if(SecurityEventType.KEY_PERSONNEL_IDENTIFY_EVENT == eventType){ + if (SecurityEventType.KEY_PERSONNEL_IDENTIFY_EVENT.equals(eventType)) { //判断所属人脸分组 JSONObject data = (JSONObject) event.get("data"); JSONObject faceRecognitionResult = (JSONObject) data.get("faceRecognitionResult"); @@ -142,52 +163,101 @@ if (faceGroupCode.equals(blackListGroup.getFaceGroupCode())) { //黑名单分组处理 caseInfo1 = hikService.blackListHandle(event, caseInfo1); - }else if(faceGroupCode.equals(propertyPersonnelGroup.getFaceGroupCode())){ + } else if (faceGroupCode.equals(propertyPersonnelGroup.getFaceGroupCode())) { //考勤分组处理-物业人员,添加到考勤表 hikService.propertyAttendanceHandle(event); - }else if(faceGroupCode.equals(securityPersonnelGroup.getFaceGroupCode())){ + } else if (faceGroupCode.equals(securityPersonnelGroup.getFaceGroupCode())) { //考勤分组处理-安保人员,添加到考勤表 hikService.securityPersonnelHandle(event); - }else { + } else { return; } - }else if(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT == eventType){ + } else if (SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT.equals(eventType)) { //离岗事件处理 caseInfo1 = hikService.demobilizedHandle(event, caseInfo1); - }else if(SecurityEventType.PERSONNEL_GATHER_EVENT == eventType){ + } else if (SecurityEventType.PERSONNEL_GATHER_EVENT.equals(eventType)) { //人员聚集事件处理 caseInfo1 = hikService.personGatherHandle(event, caseInfo1); - }else if(SecurityEventType.MONITORING_POINT_OFFLINE == eventType){ + } else if (SecurityEventType.MONITORING_POINT_OFFLINE.equals(eventType)) { //监控点离线事件处理 caseInfo1 = hikService.monitorPointOfflineHandle(event, caseInfo1); - }else if(SecurityEventType.DEVICE_OFFLINE == eventType){ + } else if (SecurityEventType.MONITORING_POINT_ONLINE.equals(eventType)) { + //监控点上线事件处理 + hikService.monitorPointOnlineHandle(event); + } else if (SecurityEventType.DEVICE_OFFLINE.equals(eventType)) { //装置离线事件处理 caseInfo1 = hikService.deviceOfflineHandle(event, caseInfo1); - }else if(SecurityEventType.VISITOR_REGISTER == eventType){ + } else if (SecurityEventType.DEVICE_ONLINE.equals(eventType)) { + //装置上线处理 + hikService.deviceOnlineHandle(event); + } else if (SecurityEventType.VISITOR_REGISTER.equals(eventType)) { //记录访客登记记录,添加到访客记录表 hikService.visitorRegisterHandler(event); - }else if(SecurityEventType.VISITOR_CHECKOUT == eventType){ + } else if (SecurityEventType.VISITOR_CHECKOUT.equals(eventType)) { //记录访客签离记录 hikService.visitorCheckOutHandler(event); } - if(!Objects.isNull(caseInfo1) && !StringUtils.isEmpty(caseInfo1.getHappenTime())){ + if (!Objects.isNull(caseInfo1) && !StringUtils.isEmpty(caseInfo1.getHappenTime())) { caseInfos.add(caseInfo1); } } //3、安防事件入库 - if(!caseInfoService.insertCaseInfoBatch(caseInfos)){ - log.error("安防事件批量入库异常"); + if (!CollectionUtils.isEmpty(caseInfos) && !caseInfoService.insertCaseInfoBatch(caseInfos)) { + log.error("安防事件批量入库异常!"); } // TODO: 2022/8/15 webSocket推送 + if (CollectionUtils.isEmpty(caseInfos)) { + log.info("webSocket事件推送"); + webSocket.sendAllMessage(JSONObject.toJSONString(caseInfos)); + } return; } /** + * 以图搜图,前端用于轨迹追踪 + */ + @PostMapping("/hik/search/picture") + @ResponseBody + public Object searchPictures(@RequestBody SearchPicturesRequest searchPicturesRequest) { + DateTime startDateTime = DateUtil.parse(searchPicturesRequest.getStartTime()); + DateTime endDateTime = DateUtil.parse(searchPicturesRequest.getEndTime()); + String startTime = DateUtil.format(startDateTime, "yyyy-MM-dd'T'HH:mm:ss.SSSXXX"); + String endTime = DateUtil.format(endDateTime, "yyyy-MM-dd'T'HH:mm:ss.SSSXXX"); + searchPicturesRequest.setStartTime(startTime); + searchPicturesRequest.setEndTime(endTime); + String body = JSONObject.toJSONString(searchPicturesRequest); + String resultStr = HikUtil.hikApi(HikUri.SEARCH_PICTURES, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (!"0".equals(resultJson.get("code"))) { + log.error("请求海康,以图搜图失败,海康response:{}", resultStr); + return ResponseData.error("以图搜图失败"); + } + return ResponseData.success(resultJson); + } + + + /** + * 海康事件取消订阅 + */ + @PostMapping("/hik/event/cancel") + @ResponseBody + public Object eventCancelSubscribe(@RequestBody CancelSubscribeRequest cancelSubscribeRequest) { + String body = JSONObject.toJSONString(cancelSubscribeRequest); + String resultStr = HikUtil.hikApi(HikUri.EVENT_CANCEL, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (!"0".equals(resultJson.get("code"))) { + log.error("请求海康,取消订阅失败,海康response:{}", resultStr); + return ResponseData.error("取消订阅失败"); + } + return ResponseData.success(resultJson); + } + + /** * 单个添加海康人脸分组 * api->hik单个添加人脸分组api->response->mysql */ - @PostMapping("/faceGroup/single/add") + @PostMapping("/hik/faceGroup/single/add") @ResponseBody public Object faceGroupAddition(@RequestBody FaceGroupAdditionRequest faceGroupAdditionRequest) { String body = JSONObject.toJSONString(faceGroupAdditionRequest); @@ -212,7 +282,7 @@ * 批量添加海康组织 * api->hik批量添加组织api->response */ - @PostMapping("/org/batch/add") + @PostMapping("/hik/org/batch/add") @ResponseBody public Object orgBatchAdd(@RequestBody List orgBatchAddRequest) { String body = JSONObject.toJSONString(orgBatchAddRequest); @@ -232,4 +302,62 @@ return ResponseData.error("批量添加组织失败"); } + /** + * 获取人员列表 + */ + @PostMapping("/hik/person/personList") + @ResponseBody + public Object personList() { + PersonListRequest request = new PersonListRequest(); + request.setPageNo(1); + request.setPageSize(100); + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi("/api/resource/v2/person/personList", body); + return resultStr; + } + + /** + * 获取组织列表 + */ + @PostMapping("/hik/org/orgList") + @ResponseBody + public Object orgList() { + PersonListRequest request = new PersonListRequest(); + request.setPageNo(1); + request.setPageSize(100); + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi("/api/resource/v1/org/orgList", body); + return resultStr; + } + + /** + * 查询访客权限下载记录 + */ + @PostMapping("/hik/auth/result") + @ResponseBody + public Object authResult() { + PersonListRequest request = new PersonListRequest(); + request.setPageNo(1); + request.setPageSize(100); + request.setOrderId("ba101db6246711edaea66f7939a13638"); + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi("/api/visitor/v1/auth/result", body); + return resultStr; + } + + /** + * 人脸图片获取 + */ + @PostMapping("/hik/face/picture") + @ResponseBody + public Object facePicture() { + FaceRequest request = new FaceRequest(); +// List list = new ArrayList<>(); +// list.add(""); + request.setCertificateNum("wanggong"); + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi("/api/frs/v1/face", body); + return resultStr; + } + } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/AssetInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/AssetInfoMapper.java index 4f64e83..c0684ee 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/AssetInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/AssetInfoMapper.java @@ -17,6 +17,6 @@ @Mapper public interface AssetInfoMapper extends BaseMapper { - List getAssetInfoListPage(@Param("page") Page page, AssetInfoRequest assetInfoRequest); + List getAssetInfoListPage(@Param("page") Page page, @Param("assetInfoRequest") AssetInfoRequest assetInfoRequest); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/AttendanceInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/AttendanceInfoMapper.java index f9e793e..ec87e46 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/AttendanceInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/AttendanceInfoMapper.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.statistics.AttendanceNumberDTO; import com.casic.missiles.modular.dto.statistics.AttendanceRatioDTO; import com.casic.missiles.modular.model.AttendanceInfo; import org.apache.ibatis.annotations.Mapper; @@ -17,7 +18,7 @@ */ @Mapper public interface AttendanceInfoMapper extends BaseMapper { - List getAttendanceInfoListPage(@Param("page") Page page, StaffInfoRequest attendanceInfoRequest); + List getAttendanceInfoListPage(@Param("page") Page page, @Param("attendanceInfoRequest") StaffInfoRequest attendanceInfoRequest); AttendanceInfo selectByCodeAndDate(@Param("staffCode") String staffCode); @@ -26,4 +27,8 @@ List getCountByTypeAndDateForMonth(@Param("staffType")String staffType); List getCountByTypeAndDateForYear(@Param("staffType")String staffType); + + List getCountForWeek(); + + List getCountForDay(); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java index ce94b8f..6137a7d 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java @@ -17,5 +17,5 @@ @Mapper public interface BlackInfoMapper extends BaseMapper { - List getBlackInfoListPage(@Param("page") Page page, BlackInfoRequest blackInfoRequest); + List getBlackInfoListPage(@Param("page") Page page, @Param("blackInfoRequest") BlackInfoRequest blackInfoRequest); } 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 efda6b3..50aaa6f 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 @@ -20,7 +20,7 @@ List getCaseInfoListPage(@Param("page") Page page, @Param("caseInfoRequest") CaseInfoRequest caseInfoRequest); - int updateStatusById(CaseInfoRequest caseInfoRequest); + int updateStatusById(@Param("caseInfoRequest") CaseInfoRequest caseInfoRequest); List selectByLevelAndMonth(@Param("year") String year); @@ -47,4 +47,20 @@ List selectPreWeekCountByThirtyDay(); List selectPreDayCountBySevenDay(); + + Integer selectDemobilizedCount(@Param("eventType") Number personnelDemobilizedEvent); + + List selectPreMonthCount(); + + List selectListBySevenDay(); + + List selectListByToday(); + + List selectListByToday2(); + + List selectListByToday3(); + + List selectListByType(@Param("eventType") Number eventType); + + List selectDemobilizedCountByHour(@Param("eventType") Number eventType); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/CategoryLevelMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/CategoryLevelMapper.java index 52fc714..afe1650 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/CategoryLevelMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/CategoryLevelMapper.java @@ -17,9 +17,9 @@ @Mapper public interface CategoryLevelMapper extends BaseMapper { - List getCaseCategoryLevelListPage(@Param("page") Page page, CategoryLevelRequest categoryLevelRequest); + List getCaseCategoryLevelListPage(@Param("page") Page page, @Param("categoryLevelRequest") CategoryLevelRequest categoryLevelRequest); - List getCaseCategoryLevelList(CategoryLevelRequest categoryLevelRequest); + List getCaseCategoryLevelList(@Param("categoryLevelRequest") CategoryLevelRequest categoryLevelRequest); CaseCategoryLevel getCaseCategoryLevel(@Param("categoryLevelCode") String categoryLevelCode); 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 66353b1..2555a09 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 @@ -19,7 +19,7 @@ @Mapper public interface DeviceInfoMapper extends BaseMapper { - List getDeviceInfoListPage(@Param("page") Page page, DeviceInfoRequest deviceInfoRequest); + List getDeviceInfoListPage(@Param("page") Page page, @Param("deviceInfoRequest") DeviceInfoRequest deviceInfoRequest); List getDeviceInfoList(@Param("deviceInfoRequest") DeviceInfoRequest deviceInfoRequest); @@ -27,6 +27,8 @@ DeviceInfo getByIndexCode(@Param("srcIndex") String srcIndex); + DeviceInfo getByIp(@Param("ip") String ip); + List selectIndexCodesByCodes(@Param("deviceCodes") List deviceCodes); List selectByType(@Param("devType") String devType); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java index 41dd0af..5bfaf63 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java @@ -5,6 +5,7 @@ import com.casic.missiles.modular.dto.DeviceRepairRequest; import com.casic.missiles.modular.model.DeviceRepairLog; import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; import java.util.List; @@ -16,7 +17,7 @@ @Mapper public interface DeviceRepairLogMapper extends BaseMapper { - List getDeviceRepairListPage(Page page, DeviceRepairRequest deviceRepairRequest); + List getDeviceRepairListPage(@Param("page") Page page, @Param("deviceRepairRequest")DeviceRepairRequest deviceRepairRequest); - List getDeviceRepairList(DeviceRepairRequest deviceRepairRequest); + List getDeviceRepairList(@Param("deviceRepairRequest") DeviceRepairRequest deviceRepairRequest); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java index 9035c47..4823ac1 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java @@ -18,7 +18,7 @@ @Mapper public interface FireEquipInfoMapper extends BaseMapper { - List getFireEquipInfoListPage(@Param("page") Page page, FireEquipRequest fireEquipRequest); + List getFireEquipInfoListPage(@Param("page") Page page, @Param("fireEquipRequest") FireEquipRequest fireEquipRequest); FireEquipInfo getFireEquipInfo(@Param("equipCode") String equipCode); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/GateGroupMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/GateGroupMapper.java index d8c330d..977a427 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/GateGroupMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/GateGroupMapper.java @@ -17,7 +17,7 @@ */ @Mapper public interface GateGroupMapper extends BaseMapper { - List getGateGroupListPage(@Param("page") Page page, GateGroupRequest gateGroupRequest); + List getGateGroupListPage(@Param("page") Page page, @Param("gateGroupRequest") GateGroupRequest gateGroupRequest); GateGroup getGateGroupByName(@Param("groupName") String groupName); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/HazardLevelMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/HazardLevelMapper.java index 8957780..dcf47bb 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/HazardLevelMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/HazardLevelMapper.java @@ -17,11 +17,13 @@ @Mapper public interface HazardLevelMapper extends BaseMapper { - List getCaseHazardLevelListPage(@Param("page") Page page, HazardLevelRequest hazardLevelRequest); + List getCaseHazardLevelListPage(@Param("page") Page page, @Param("hazardLevelRequest") HazardLevelRequest hazardLevelRequest); - List getCaseHazardLevelList(HazardLevelRequest hazardLevelRequest); + List getCaseHazardLevelList(@Param("hazardLevelRequest") HazardLevelRequest hazardLevelRequest); CaseHazardLevel getCaseHazardLevel(@Param("hazardLevelCode") String hazardLevelCode); List selectHazardName(); + + String selectHazardNameByCode(@Param("hazardLevelCode") String hazardLevelCode); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/HikCaseDefineMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/HikCaseDefineMapper.java index 0dc47d1..f162fef 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/HikCaseDefineMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/HikCaseDefineMapper.java @@ -12,5 +12,5 @@ */ @Mapper public interface HikCaseDefineMapper extends BaseMapper { - HikCaseDefine getHikCaseDefine(@Param("caseTypeCode") Long caseTypeCode); + HikCaseDefine getHikCaseDefine(@Param("caseTypeCode") Number caseTypeCode); } 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 f8a674c..fe5afc2 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 @@ -17,11 +17,13 @@ @Mapper public interface StaffInfoMapper extends BaseMapper { - List getStaffInfoListPage(@Param("page") Page page, StaffInfoRequest staffInfoRequest); + List getStaffInfoListPage(@Param("page") Page page, @Param("staffInfoRequest") StaffInfoRequest staffInfoRequest); StaffInfo selectByCode(@Param("staffCode") String staffCode); - List getStaffInfoList(StaffInfoRequest staffInfoRequest); + List getStaffInfoList(@Param("staffInfoRequest") StaffInfoRequest staffInfoRequest); - List selectBatchCodes(List list); + List selectBatchCodes(@Param("list") List list); + + int updateByCodeForCard(@Param("staffCode") String staffCode, @Param("cardNo") String cardNo); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitInfoMapper.java index b1217c5..6c52542 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitInfoMapper.java @@ -16,7 +16,7 @@ */ @Mapper public interface VisitInfoMapper extends BaseMapper { - List getVisitInfoListPage(@Param("page") Page page, VisitorRequest visitorRequest); + List getVisitInfoListPage(@Param("page") Page page, @Param("visitorRequest") VisitorRequest visitorRequest); VisitInfo selectByOrderId(@Param("orderId") String orderId); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitorApplyMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitorApplyMapper.java index c09f3c0..6ea55bd 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitorApplyMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitorApplyMapper.java @@ -18,7 +18,7 @@ @Mapper public interface VisitorApplyMapper extends BaseMapper { - List getVisitorApplyListPage(@Param("page") Page page, VisitorApplyRequest visitorApplyRequest); + List getVisitorApplyListPage(@Param("page") Page page, @Param("visitorApplyRequest") VisitorApplyRequest visitorApplyRequest); List selectByVisitReason(); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/AttendanceInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/AttendanceInfoMapper.xml index b2ece71..f8bdd6e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/AttendanceInfoMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/AttendanceInfoMapper.xml @@ -43,7 +43,8 @@ and staff_type = #{staffType} - and YEARWEEK(date_format(atte_date, '%Y-%m-%d'), 1) = YEARWEEK(now(),1); + AND DATE_SUB(CURDATE(), INTERVAL 7 DAY) <= DATE(atte_date) + GROUP BY DATE_FORMAT(atte_date, '%Y-%m-%d') @@ -69,4 +70,20 @@ GROUP BY DATE_FORMAT(atte_date, '%Y-%m') + + + \ No newline at end of file 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 2b6953f..06ec0a8 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 @@ -28,7 +28,9 @@ @@ -87,7 +89,8 @@ SELECT hazard_level_code as levelCode, count(id) as quantity FROM bus_case_info WHERE hazard_level_code is not null - AND DATE_SUB(CURDATE(), INTERVAL 7 DAY) <= date(happen_time); + AND is_key_area = 1 + AND DATE_SUB(CURDATE(), INTERVAL 7 DAY) <= date(happen_time) GROUP BY hazard_level_code @@ -95,7 +98,8 @@ SELECT hazard_level_code as levelCode, count(id) as quantity FROM bus_case_info WHERE hazard_level_code is not null - AND DATE_SUB(CURDATE(), INTERVAL 30 DAY) <= date(happen_time); + AND is_key_area = 1 + AND DATE_SUB(CURDATE(), INTERVAL 30 DAY) <= date(happen_time) GROUP BY hazard_level_code @@ -122,4 +126,71 @@ AND hazard_level_code is not null GROUP BY DATE_FORMAT(happen_time,'%Y-%m-%d') + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/CategoryLevelMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/CategoryLevelMapper.xml index 4670b1f..1d25cbd 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/CategoryLevelMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/CategoryLevelMapper.xml @@ -20,11 +20,11 @@ SELECT * FROM bus_case_category_level WHERE 1=1 - - and code = #{code} + + and code = #{categoryLevelRequest.code} - - and name = #{name} + + and name = #{categoryLevelRequest.name} ORDER by create_time DESC 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 9b66fd8..bfd84b7 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 @@ -98,4 +98,10 @@ #{item} + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/BlackListController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/BlackListController.java index a27f9f8..0c06661 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/BlackListController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/BlackListController.java @@ -1,13 +1,18 @@ package com.casic.missiles.modular.controller; +import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.base.controller.ExportController; import com.casic.missiles.core.page.PageFactory; import com.casic.missiles.model.response.ResponseData; import com.casic.missiles.modular.dto.BlackInfoRequest; +import com.casic.missiles.modular.dto.BlackPictureRequest; +import com.casic.missiles.modular.dto.hik.PersonInfoRequest; +import com.casic.missiles.modular.enums.HikUri; import com.casic.missiles.modular.enums.OperateTypeEnum; import com.casic.missiles.modular.model.BlackInfo; import com.casic.missiles.modular.service.BlackInfoService; +import com.casic.missiles.modular.util.HikUtil; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; @@ -56,4 +61,22 @@ return null; } + /** + * 黑名单人员照片 + */ + @PostMapping("/personPicture") + @ResponseBody + public Object personPicture(@RequestBody BlackPictureRequest blackPictureRequest){ + //获取照片 + String picUri = blackPictureRequest.getPicUri(); + String serverIndexCode = blackPictureRequest.getServerIndexCode(); + PersonInfoRequest picRequest = new PersonInfoRequest(); + picRequest.setPicUri(picUri); + picRequest.setServerIndexCode(serverIndexCode); + String reBody = JSONObject.toJSONString(picRequest); + //重定向地址获取 + String url = HikUtil.hikApiFor302(HikUri.PERSON_PICTURE, reBody); + return ResponseData.success(url); + } + } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/DeviceController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/DeviceController.java index e1c4eba..666bbee 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/DeviceController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/DeviceController.java @@ -107,7 +107,7 @@ } /** - * 设备维修管理查询(分页),需计算MTTR=总维修时间/故障次数 + * 设备状态计算与评判/设备维修管理查询(分页),需计算MTTR=总维修时间/故障次数 */ @PostMapping("/repair/listPage") @ResponseBody @@ -211,7 +211,7 @@ //需根据设备编号获取到对应的门禁点唯一标识 doorControlRequest.setDoorIndexCodes(indexCodes); doorControlRequest.setControlType(Integer.valueOf(gateGroupDTO.getStatus())); - String body = JSONObject.toJSONString(deviceCodes); + String body = JSONObject.toJSONString(doorControlRequest); String resultStr = HikUtil.hikApi(HikUri.DOOR_CONTROL, body); JSONObject resultJson = (JSONObject)JSONObject.parse(resultStr); if (!"0".equals(resultJson.get("code"))) { diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/StaffController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/StaffController.java index b58ccab..704093c 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/StaffController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/StaffController.java @@ -2,15 +2,21 @@ import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.util.StrUtil; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.base.controller.ExportController; import com.casic.missiles.core.page.PageFactory; import com.casic.missiles.model.response.ErrorResponseData; import com.casic.missiles.model.response.ResponseData; import com.casic.missiles.modular.dto.StaffInfoRequest; +import com.casic.missiles.modular.dto.hik.PersonInfoRequest; +import com.casic.missiles.modular.dto.hik.StaffCardRequest; +import com.casic.missiles.modular.enums.HikUri; import com.casic.missiles.modular.enums.OperateTypeEnum; import com.casic.missiles.modular.model.StaffInfo; import com.casic.missiles.modular.service.StaffInfoService; +import com.casic.missiles.modular.util.HikUtil; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; @@ -110,4 +116,60 @@ } return ResponseData.success(); } + + /** + * 批量开卡,添加人员之后调用,若在一个接口中添加人员成功开卡失败则第二次添加时会有问题 + */ + @PostMapping("/cardBinding") + @ResponseBody + public Object cardBinding(@RequestBody StaffCardRequest staffCardRequest) { + String body = JSONObject.toJSONString(staffCardRequest); + String resultStr = HikUtil.hikApi(HikUri.CARD_BINDING, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (!"0".equals(resultJson.get("code"))) { + log.error("请求海康,批量开卡失败,海康response:{}", resultStr); + return ResponseData.error("批量开卡失败"); + } + //保存卡号 + if(staffInfoService.saveCardInfo(staffCardRequest) > 0){ + return ResponseData.success(); + } + return ResponseData.error("批量开卡失败"); + } + + /** + * 获取员工照片,海康存储 + */ + @PostMapping("/personPicture/{staffCode}") + @ResponseBody + public Object personPicture(@PathVariable("staffCode") String staffCode){ + //获取员工详细信息,含图片服务器、uri + PersonInfoRequest request = new PersonInfoRequest(); + List list = new ArrayList<>(); + list.add(staffCode); + request.setParamName("personId"); + request.setParamValue(list); + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi(HikUri.PERSON_INFO, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (!"0".equals(resultJson.get("code"))) { + log.error("请求海康,根据人员唯一字段获取人员详细信息失败,海康response:{}", resultStr); + return ResponseData.error("获取员工照片失败"); + } + //获取照片 + JSONObject data = (JSONObject) resultJson.get("data"); + JSONArray dataArray = (JSONArray) data.get("list"); + JSONObject jsonObject = (JSONObject) dataArray.get(0); + JSONArray personPhoto = (JSONArray) jsonObject.get("personPhoto"); + JSONObject photo = (JSONObject) personPhoto.get(0); + String picUri = photo.getString("picUri"); + String serverIndexCode = photo.getString("serverIndexCode"); + PersonInfoRequest picRequest = new PersonInfoRequest(); + picRequest.setPicUri(picUri); + picRequest.setServerIndexCode(serverIndexCode); + String reBody = JSONObject.toJSONString(picRequest); + //重定向地址获取 + String url = HikUtil.hikApiFor302(HikUri.PERSON_PICTURE, reBody); + return ResponseData.success(url); + } } 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 4a07dd9..7b1dcf6 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 @@ -16,6 +16,7 @@ import com.casic.missiles.modular.redis.key.CacheKeys; import com.casic.missiles.modular.service.CockpitService; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.util.CollectionUtils; import org.springframework.web.bind.annotation.*; @@ -24,10 +25,7 @@ import java.text.NumberFormat; import java.time.LocalDateTime; import java.time.temporal.ChronoUnit; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.util.*; import java.util.stream.Collectors; /** @@ -73,6 +71,9 @@ private StatisticNumberMapper numberMapper; @Autowired + private HazardLevelMapper hazardLevelMapper; + + @Autowired private AccessGroupConfig accessGroupConfig; /** @@ -104,8 +105,24 @@ public Object buildingNumberPerHour(){ //当天按小时分组的人数 List list = numberMapper.selectListByTime(); - Map> collect = list.stream().collect(Collectors.groupingBy(BuildingNumberDTO::getStatisticPosition)); - return ResponseData.success(collect); + Map> collect = list.stream().collect(Collectors.groupingBy(BuildingNumberDTO::getStatisticTime)); + //定时任务中已将每小时三栋楼人数存到数据库 + //将一期主楼和录制楼人数合并,二期单算 + List> resultList = new ArrayList<>(); + collect.keySet().forEach(key -> { + List buildingNumberDTOS = collect.get(key); + BuildingNumberDTO mainBuildingOne = buildingNumberDTOS.get(0); + BuildingNumberDTO mainBuildingTwo = buildingNumberDTOS.get(1); + BuildingNumberDTO recordingBuilding = buildingNumberDTOS.get(2); + HashMap resultMap = new HashMap<>(); + Integer oneQuantity = Integer.valueOf(mainBuildingOne.getStatisticQuantity()); + Integer recordingQuantity = Integer.valueOf(recordingBuilding.getStatisticQuantity()); + resultMap.put("staticTime", mainBuildingOne.getStatisticTime()); + resultMap.put(mainBuildingOne.getStatisticPositionName()+"、"+recordingBuilding.getStatisticPositionName(), String.valueOf(oneQuantity+recordingQuantity)); + resultMap.put(mainBuildingTwo.getStatisticPositionName(), mainBuildingTwo.getStatisticQuantity()); + resultList.add(resultMap); + }); + return ResponseData.success(resultList); } /** @@ -151,12 +168,11 @@ public Object securityNumber() { QueryWrapper wrapper = new QueryWrapper<>(); wrapper.eq("staff_type", 2); + // TODO: 2022/9/2 后续使用产品确定的每天出勤的安保人员的数量 Integer total = staffInfoMapper.selectCount(wrapper); - //当日离岗事件个数 - QueryWrapper wrapper1 = new QueryWrapper<>(); - wrapper1.eq("hik_event_type", SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); - wrapper1.apply("date_format(now(),'%Y-%m-%d') = date_format(happen_time,'%Y-%m-%d')"); - Integer leave = caseInfoMapper.selectCount(wrapper1); + //当日离岗事件按设备去重后的个数 + // TODO: 2022/9/2 目前相当于24小时内的计算,之后看需要可改成自定义小时数计算离岗率,即离岗+6小时内仅一次离岗则恢复为100%,多次则累加离岗次数计算离岗率 + Integer leave = caseInfoMapper.selectDemobilizedCount(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); NumberFormat numberFormat = NumberFormat.getInstance(); // 设置精确到小数点后2位 numberFormat.setMaximumFractionDigits(2); @@ -179,7 +195,6 @@ @ResponseBody public Object visitorApplyDetail() { List reasonGroup = applyMapper.selectByVisitReason(); - HashMap resultMap = new HashMap<>(); NumberFormat numberFormat = NumberFormat.getInstance(); // 设置精确到小数点后2位 numberFormat.setMaximumFractionDigits(2); @@ -187,12 +202,17 @@ if(0 == sum){ return ResponseData.success(); } + List resultList = new ArrayList<>(); reasonGroup.forEach(group -> { String reasonName = dictService.getDictNameByCode(SecurityEventDict.VISIT_REASON, group.getVisitReason()); String result = numberFormat.format((float) group.getQuantity() / (float) sum * 100); - resultMap.put(reasonName, result+"%"); + ApplyReasonGroupDTO applyReasonGroupDTO = new ApplyReasonGroupDTO(); + applyReasonGroupDTO.setQuantity(group.getQuantity()); + applyReasonGroupDTO.setVisitReason(reasonName); + applyReasonGroupDTO.setRatio(result+"%"); + resultList.add(applyReasonGroupDTO); }); - return ResponseData.success(resultMap); + return ResponseData.success(resultList); } /** @@ -247,6 +267,32 @@ } /** + * 机动力量实时在岗率,在岗人数除以总应在岗人数,用离岗+6小时内恢复为100%,6小时外再计算 + */ + @GetMapping("/staff/beOnDutyRatio") + @ResponseBody + public Object beOnDutyRatio() { + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("staff_type", 2); + // TODO: 2022/9/2 后续使用产品确定的每天出勤的安保人员的数量 + Integer total = staffInfoMapper.selectCount(wrapper); + if(0 == total){ + return ResponseData.success(null); + } + //当日离岗事件按设备去重后的个数 + // TODO: 2022/9/2 目前相当于24小时内的计算,之后看需要可改成自定义小时数计算离岗率,即离岗+6小时内仅一次离岗则恢复为100%,多次则累加离岗次数计算离岗率 + List onDutyRatioDTOS = caseInfoMapper.selectDemobilizedCountByHour(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); + onDutyRatioDTOS.forEach(dto -> { + NumberFormat numberFormat = NumberFormat.getInstance(); + // 设置精确到小数点后2位 + numberFormat.setMaximumFractionDigits(2); + String result = numberFormat.format(100 - Float.valueOf(dto.getQuantity()) / (float) total * 100); + dto.setRatio(result+"%"); + }); + return ResponseData.success(onDutyRatioDTOS); + } + + /** * 闸机速通门统计-设备状态分组计算数量,devType传闸机字典key * 视频频监控摄像机统计-设备状态分组计算数量,devType传摄像头字典key */ @@ -262,12 +308,17 @@ if(sum <= 0){ return ResponseData.error("无该类设备信息"); } + List resultList = new ArrayList<>(); gateStatusGroup.forEach(group -> { String devStatus = dictService.getDictNameByCode(SecurityEventDict.DEVICE_STATUS, group.getStatus()); String result = numberFormat.format((float) group.getQuantity() / (float) sum * 100); - resultMap.put(devStatus, result+"%"); + GateStatusGroupResponse gateStatusGroupResponse = new GateStatusGroupResponse(); + gateStatusGroupResponse.setStatus(devStatus); + gateStatusGroupResponse.setRatio(result+"%"); + resultList.add(gateStatusGroupResponse); }); - resultMap.put("总", sum); + resultMap.put("total", sum); + resultMap.put("list", resultList); return ResponseData.success(resultMap); } @@ -282,17 +333,38 @@ String position = securityScoreDTO.getPosition(); List caseInfos = caseInfoMapper.selectByPosition(position); //查询各危险级别权重、各类别权重,放入map,避免循环中多次查数据库 - + HashMap hazardScoreMap = new HashMap<>(); + List caseHazardLevelList = hazardLevelMapper.getCaseHazardLevelList(null); + caseHazardLevelList.forEach(hazardLevel -> { + hazardScoreMap.put(hazardLevel.getCode(), hazardLevel.getWeight()); + }); + HashMap categoryScoreMap = new HashMap<>(); + List categoryLevelList = categoryLevelMapper.getCaseCategoryLevelList(null); + categoryLevelList.forEach(categoryLevel -> { + categoryScoreMap.put(categoryLevel.getCode(), categoryLevel.getWeight()); + }); + //事件按楼层分组,计算 List securityScoreDTOs = new ArrayList<>(); caseInfos.forEach(caseInfo -> { SecurityScoreDTO securityScoreDTO1 = new SecurityScoreDTO(); + securityScoreDTO1.setPosition(caseInfo.getPosition()); securityScoreDTO1.setArea(caseInfo.getArea()); - // TODO: 2022/8/4 楼层评分计算根据产品定义调整 -// caseInfo.get -// securityScoreDTO1.setScore(); + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); + Double score = 100 - Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + securityScoreDTO1.setScore(score); + securityScoreDTOs.add(securityScoreDTO1); }); - - return null; + 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); + }); + return ResponseData.success(securityScoreDTOs); } /** @@ -303,9 +375,13 @@ public Object SecurityFrequency(@RequestBody SecurityFrequencyDTO securityFrequencyDTO) { String year = securityFrequencyDTO.getYear(); String month = securityFrequencyDTO.getMonth(); - Integer quantity = caseInfoMapper.selectCountByMonth(year, month); - securityFrequencyDTO.setQuantity(quantity); - return ResponseData.success(securityFrequencyDTO); + if(!StringUtils.isEmpty(year) && StringUtils.isEmpty(month)){ + Integer quantity = caseInfoMapper.selectCountByMonth(year, month); + securityFrequencyDTO.setQuantity(quantity); + return ResponseData.success(securityFrequencyDTO); + } + List list = caseInfoMapper.selectPreMonthCount(); + return ResponseData.success(list); } } 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 ae4d770..f4f075c 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 @@ -1,20 +1,25 @@ package com.casic.missiles.modular.controller.cockpit; +import cn.hutool.core.date.DateUnit; import cn.hutool.core.date.DateUtil; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.casic.missiles.model.response.ResponseData; -import com.casic.missiles.modular.dao.AttendanceInfoMapper; -import com.casic.missiles.modular.dao.CaseInfoMapper; -import com.casic.missiles.modular.dao.HazardLevelMapper; -import com.casic.missiles.modular.dao.StaffInfoMapper; +import com.casic.missiles.modular.dao.*; +import com.casic.missiles.modular.dto.DeviceRepairLogDTO; +import com.casic.missiles.modular.dto.DeviceRepairRequest; import com.casic.missiles.modular.dto.statistics.*; +import com.casic.missiles.modular.enums.SecurityEventType; +import com.casic.missiles.modular.model.CaseCategoryLevel; import com.casic.missiles.modular.model.CaseHazardLevel; +import com.casic.missiles.modular.model.CaseInfo; import com.casic.missiles.modular.model.StaffInfo; +import com.casic.missiles.modular.service.DeviceInfoService; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.util.CollectionUtils; import org.springframework.web.bind.annotation.*; +import java.math.BigDecimal; import java.text.NumberFormat; import java.util.*; import java.util.stream.Collectors; @@ -40,6 +45,12 @@ @Autowired private HazardLevelMapper hazardLevelMapper; + @Autowired + private CategoryLevelMapper categoryLevelMapper; + + @Autowired + private DeviceInfoService deviceInfoService; + /** * 安防事件时域频次统计,每月的每天安防事件个数(原方案) * 月维度:展示每个月的每天的数据 @@ -89,15 +100,17 @@ List monthList = caseInfoMapper.selectPreMonthCountByYear(year); Map> collect = monthList.stream().collect(Collectors.groupingBy(PreMonthOrWeekCaseDTO::getHazardLevelCode)); HashMap strAvgMap = new HashMap<>(); + List resultList = new ArrayList<>(); for (String key : collect.keySet()) { List preMonthOrWeekCaseDTOS = collect.get(key); int sum = preMonthOrWeekCaseDTOS.stream().mapToInt(PreMonthOrWeekCaseDTO::getQuantity).sum(); //若年份是本年,则使用个安防级别数量/当前月份数 //若不是本年,除数为12 MonthAndWeekDTO monthAndWeekDTO = new MonthAndWeekDTO(); + String hazardName = hazardLevelMapper.selectHazardNameByCode(key); + monthAndWeekDTO.setLevelName(hazardName); if(year.equals(String.valueOf(DateUtil.thisYear()))){ monthAndWeekDTO.setMonthQuantity(sum / DateUtil.thisMonth()); -// monthAndWeekDTO.setLevelName(); strAvgMap.put(key, monthAndWeekDTO); }else{ monthAndWeekDTO.setMonthQuantity(sum / 12); @@ -113,27 +126,37 @@ if(year.equals(String.valueOf(DateUtil.thisYear()))){ if(!Objects.isNull(strAvgMap.get(key))){ MonthAndWeekDTO monthAndWeekDTO = strAvgMap.get(key); + String hazardName = hazardLevelMapper.selectHazardNameByCode(key); + monthAndWeekDTO.setLevelName(hazardName); monthAndWeekDTO.setWeekQuantity(sum / DateUtil.thisWeekOfYear()); strAvgMap.put(key, monthAndWeekDTO); }else{ MonthAndWeekDTO monthAndWeekDTO = new MonthAndWeekDTO(); + String hazardName = hazardLevelMapper.selectHazardNameByCode(key); + monthAndWeekDTO.setLevelName(hazardName); monthAndWeekDTO.setWeekQuantity(sum / DateUtil.thisWeekOfYear()); strAvgMap.put(key, monthAndWeekDTO); } }else{ if(!Objects.isNull(strAvgMap.get(key))){ MonthAndWeekDTO monthAndWeekDTO = strAvgMap.get(key); + String hazardName = hazardLevelMapper.selectHazardNameByCode(key); + monthAndWeekDTO.setLevelName(hazardName); monthAndWeekDTO.setWeekQuantity(sum / 52); strAvgMap.put(key, monthAndWeekDTO); }else{ MonthAndWeekDTO monthAndWeekDTO = new MonthAndWeekDTO(); + String hazardName = hazardLevelMapper.selectHazardNameByCode(key); + monthAndWeekDTO.setLevelName(hazardName); monthAndWeekDTO.setWeekQuantity(sum / 52); strAvgMap.put(key, monthAndWeekDTO); } } } - avgMonthAndWeekGroupDTO.setMap(strAvgMap); - return ResponseData.success(avgMonthAndWeekGroupDTO); + strAvgMap.keySet().forEach(key -> { + resultList.add(strAvgMap.get(key)); + }); + return ResponseData.success(resultList); } /** @@ -181,12 +204,178 @@ } /** - * 员工考勤人数变化,功能待定 + * 员工考勤人数变化,统计当天(横坐标为时)及近7天(横坐标为天)的考勤人数变化,只要发生一次考勤识别,次数的基数就正常增加(没有上班下班区分) */ + @PostMapping("/staff/attendanceNumber/{dimension}") + @ResponseBody + public Object attendanceNumber(@PathVariable("dimension") String dimension) { + List attendanceNumberDTOs = null; + List> resultList = new ArrayList<>(); + if("week".equals(dimension)){ + //近7天数据按天分组统计 + attendanceNumberDTOs = attendanceInfoMapper.getCountForWeek(); + }else if("day".equals(dimension)) { + //今天数据按小时分组统计 + attendanceNumberDTOs = attendanceInfoMapper.getCountForDay(); + } + if(CollectionUtils.isEmpty(attendanceNumberDTOs)){ + return ResponseData.error("该查询条件下,无员工出勤数据!"); + } + Map> collect = attendanceNumberDTOs.stream().collect(Collectors.groupingBy(AttendanceNumberDTO::getDate)); + collect.keySet().forEach(key -> { + List attendanceNumberDTOS = collect.get(key); + AttendanceNumberDTO attendanceNumberDTO = attendanceNumberDTOS.get(0); + AttendanceNumberDTO attendanceNumberDTO2 = attendanceNumberDTOS.get(1); + Map resultMap = new HashMap<>(); + resultMap.put(attendanceNumberDTO.getStaffType(), attendanceNumberDTO.getQuantity()); + resultMap.put(attendanceNumberDTO2.getStaffType(), attendanceNumberDTO2.getQuantity()); + resultMap.put("staticTime", attendanceNumberDTO.getDate()); + resultList.add(resultMap); + }); + return ResponseData.success(resultList); + } /** - * 近30天/近一周安保人员到岗排行 + * 早晚高峰区域安防评估 */ + @PostMapping("/security/assessment/{dimension}") + @ResponseBody + public Object securityAssessment(@PathVariable("dimension") String dimension) { + //查询各危险级别权重、各类别权重,放入map,避免循环中多次查数据库 + HashMap hazardScoreMap = new HashMap<>(); + List caseHazardLevelList = hazardLevelMapper.getCaseHazardLevelList(null); + caseHazardLevelList.forEach(hazardLevel -> { + hazardScoreMap.put(hazardLevel.getCode(), hazardLevel.getWeight()); + }); + HashMap categoryScoreMap = new HashMap<>(); + List categoryLevelList = categoryLevelMapper.getCaseCategoryLevelList(null); + categoryLevelList.forEach(categoryLevel -> { + categoryScoreMap.put(categoryLevel.getCode(), categoryLevel.getWeight()); + }); + HashMap hashMap = new HashMap<>(); + if("week".equals(dimension)){ + //近7天早晚高峰数据 + List caseInfos = caseInfoMapper.selectListBySevenDay(); + //按时间(天)进行分组 + caseInfos.forEach(caseInfo -> { + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); + Double score = Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + String[] array = caseInfo.getHappenTime().split(" "); + String dayTime = array[0]; + BigDecimal preScore; + if(hashMap.containsKey(dayTime)){ + Double aDouble = hashMap.get(dayTime); + preScore = new BigDecimal(aDouble.toString()); + + }else{ + preScore = new BigDecimal("100.0"); + } + BigDecimal nowScore = new BigDecimal(score.toString()); + hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); + }); + return ResponseData.success(hashMap); + }else if("day".equals(dimension)) { + //今天数据按小时分组统计 + List caseInfos = caseInfoMapper.selectListByToday(); + caseInfos.forEach(caseInfo -> { + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); + Double score = Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + String[] array = caseInfo.getHappenTime().split(":"); + String dayTime = array[0]; + BigDecimal preScore; + if(hashMap.containsKey(dayTime)){ + Double aDouble = hashMap.get(dayTime); + preScore = new BigDecimal(aDouble.toString()); + + }else{ + preScore = new BigDecimal("100.0"); + } + BigDecimal nowScore = new BigDecimal(score.toString()); + hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); + }); + return ResponseData.success(hashMap); + } + return null; + } + + /** + * 重点区域安防事态评估,统计重点区域6:00-23:00按小时分组数据 + */ + @GetMapping("/security/keyAreaStatistic") + @ResponseBody + public Object keyAreaStatistic() { + //查询各危险级别权重、各类别权重,放入map,避免循环中多次查数据库 + HashMap hazardScoreMap = new HashMap<>(); + List caseHazardLevelList = hazardLevelMapper.getCaseHazardLevelList(null); + caseHazardLevelList.forEach(hazardLevel -> { + hazardScoreMap.put(hazardLevel.getCode(), hazardLevel.getWeight()); + }); + HashMap categoryScoreMap = new HashMap<>(); + List categoryLevelList = categoryLevelMapper.getCaseCategoryLevelList(null); + categoryLevelList.forEach(categoryLevel -> { + categoryScoreMap.put(categoryLevel.getCode(), categoryLevel.getWeight()); + }); + HashMap hashMap = new HashMap<>(); + //今天数据按小时分组统计 + List caseInfos = caseInfoMapper.selectListByToday2(); + caseInfos.forEach(caseInfo -> { + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); + Double score = Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + String[] array = caseInfo.getHappenTime().split(":"); + String dayTime = array[0]; + BigDecimal preScore; + if(hashMap.containsKey(dayTime)){ + Double aDouble = hashMap.get(dayTime); + preScore = new BigDecimal(aDouble.toString()); + + }else{ + preScore = new BigDecimal("100.0"); + } + BigDecimal nowScore = new BigDecimal(score.toString()); + hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); + }); + return ResponseData.success(hashMap); + } + + /** + * 安防机动支援力量调配响应评估,根据事件已解决状态及已解决时间-发送时间,按时间(小时)分组统计 + */ + @GetMapping("/security/responseAssess") + @ResponseBody + public Object responseAssess() { + //查询各危险级别权重、各类别权重,放入map,避免循环中多次查数据库 + HashMap hazardScoreMap = new HashMap<>(); + List caseHazardLevelList = hazardLevelMapper.getCaseHazardLevelList(null); + caseHazardLevelList.forEach(hazardLevel -> { + hazardScoreMap.put(hazardLevel.getCode(), hazardLevel.getWeight()); + }); + HashMap hashMap = new HashMap<>(); + //今天数据按小时分组统计 + List caseInfos = caseInfoMapper.selectListByToday3(); + caseInfos.forEach(caseInfo -> { + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + //扣分=事件级别权重*未解决小时数 + Date updateTime = DateUtil.parse(caseInfo.getUpdateTime()); + Date happenTime = DateUtil.parse(caseInfo.getHappenTime()); + long between = DateUtil.between(updateTime, happenTime, DateUnit.HOUR); + Double score = Double.valueOf(hazardWeight)*between; + String[] array = caseInfo.getHappenTime().split(":"); + String dayTime = array[0]; + BigDecimal preScore; + if(hashMap.containsKey(dayTime)){ + Double aDouble = hashMap.get(dayTime); + preScore = new BigDecimal(aDouble.toString()); + }else{ + preScore = new BigDecimal("100.0"); + } + BigDecimal nowScore = new BigDecimal(score.toString()); + hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); + }); + return ResponseData.success(hashMap); + } /** * 重点区域威胁事件类型统计,优先级2,统计近7天和近30天 @@ -224,7 +413,34 @@ } /** - * 设备状态计算系数和评判,优先级3,需确认设备恢复时间是否可以获取 + * 近30天/近一周安保人员到岗排行 */ + + /** + * 安保等级评估,发生离岗事件减1分 + */ + @GetMapping("/security/levelAssess") + @ResponseBody + public Object securityLevelAssess() { + //今天数据按小时分组统计 + List resultList = caseInfoMapper.selectListByType(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); + resultList.forEach(result -> { + BigDecimal deScore = new BigDecimal(result.getQuantity()); + BigDecimal preScore = new BigDecimal("100.0"); + result.setScore(preScore.subtract(deScore).doubleValue()); + }); + return ResponseData.success(resultList); + } + + /** + * 设备状态计算系数和评判,即设备维修管理查询(不分页) + */ + @PostMapping("/device/repairList") + @ResponseBody + public Object repairList(@RequestBody DeviceRepairRequest deviceRepairRequest) { + List deviceRepairLogDTOS = deviceInfoService.deviceRepairListPage(deviceRepairRequest); + return ResponseData.success(deviceRepairLogDTOS); + } + } 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 fbf8ab6..c71a15a 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 @@ -1,13 +1,12 @@ package com.casic.missiles.modular.controller.hik; +import cn.hutool.core.date.DateTime; +import cn.hutool.core.date.DateUtil; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.casic.missiles.model.response.ResponseData; import com.casic.missiles.modular.dao.HikFaceGroupInfoMapper; -import com.casic.missiles.modular.dto.hik.EventSubscribeRequest; -import com.casic.missiles.modular.dto.hik.FaceGroupAdditionRequest; -import com.casic.missiles.modular.dto.hik.HikRecvEvent; -import com.casic.missiles.modular.dto.hik.OrgBatchAdd; +import com.casic.missiles.modular.dto.hik.*; import com.casic.missiles.modular.enums.HikUri; import com.casic.missiles.modular.enums.SecurityEventType; import com.casic.missiles.modular.model.CaseInfo; @@ -18,16 +17,20 @@ import com.casic.missiles.modular.util.CaseInfoFactoryUtil; import com.casic.missiles.modular.util.HikUtil; import com.casic.missiles.modular.util.ThreadPoolUtil; +import com.casic.missiles.modular.util.WebSocket; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; -import org.springframework.web.bind.annotation.*; +import org.springframework.util.CollectionUtils; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.RestController; -import java.net.InetAddress; -import java.net.UnknownHostException; import java.util.ArrayList; +import java.util.Iterator; import java.util.List; import java.util.Objects; @@ -38,7 +41,6 @@ */ @Slf4j @RestController -@RequestMapping("/hik") public class HikController { @Autowired @@ -53,28 +55,37 @@ @Autowired private HikService hikService; + @Autowired + private HikFaceGroupInfoMapper hikFaceGroupInfoMapper; + + @Autowired + private WebSocket webSocket; + @Value("${server.port}") private int serverPort; - @Autowired - private HikFaceGroupInfoMapper hikFaceGroupInfoMapper; /** * 海康事件订阅 */ - @PostMapping("/event/subscribe") + @PostMapping("/hik/event/subscribe") @ResponseBody - public Object eventSubscribe() throws UnknownHostException { + public Object eventSubscribe() { EventSubscribeRequest eventSubscribeRequest = new EventSubscribeRequest(); ArrayList list = new ArrayList<>(); list.add(SecurityEventType.DEVICE_OFFLINE); + list.add(SecurityEventType.DEVICE_ONLINE); list.add(SecurityEventType.KEY_PERSONNEL_IDENTIFY_EVENT); list.add(SecurityEventType.MONITORING_POINT_OFFLINE); + list.add(SecurityEventType.MONITORING_POINT_ONLINE); list.add(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); list.add(SecurityEventType.PERSONNEL_GATHER_EVENT); - InetAddress localHost = InetAddress.getLocalHost(); + list.add(SecurityEventType.VISITOR_REGISTER); + list.add(SecurityEventType.VISITOR_CHECKOUT); + list.add(SecurityEventType.HIGH_ALTITUDE_PARABOLIC); +// InetAddress localHost = InetAddress.getLocalHost(); eventSubscribeRequest.setEventTypes(list); - eventSubscribeRequest.setEventDest("https://" + localHost + ":" + serverPort + "/eventRcv"); + eventSubscribeRequest.setEventDest("http://" + "192.168.10.6" + ":" + serverPort + "/eventRcv"); //订阅类型,0-订阅原始事件,1-联动事件,2-原始事件和联动事件,不填使用默认值0 eventSubscribeRequest.setSubType(0); /** @@ -92,19 +103,25 @@ } /** + * 查询事件订阅信息 + */ + @PostMapping("/hik/event/query") + @ResponseBody + public Object eventQuery() { + String result = HikUtil.hikApi(HikUri.EVENT_INFO, ""); + return result; + } + + /** * 海康事件接收 */ @PostMapping("/eventRcv") @ResponseBody public Object eventRcv(@RequestBody HikRecvEvent hikRecvEvent) { //1、接收所需事件类型 - Long eventType = hikRecvEvent.getEventType(); + Number eventType = hikRecvEvent.getEventType(); log.info("接收到安防事件类型为:{}", eventType); CaseInfo caseInfo = caseInfoFactoryUtil.getCaseInfo(eventType); - //接收到不关心事件直接返回 - if(Objects.isNull(caseInfo)){ - return ResponseData.success(); - } //2、不同事件不同处理,caseInfoFactoryUtil已设置好事件基础定义信息 // 再为事件添加状态、设备编码、设备名称、位置、区域、时间 // 异步处理事件 @@ -114,19 +131,23 @@ caseHandle(hikRecvEvent, eventType, caseInfo); } })); +// caseHandle(hikRecvEvent, eventType, caseInfo); - return null; + return ResponseData.success(); } - private void caseHandle(HikRecvEvent hikRecvEvent, Long eventType, CaseInfo caseInfo) { + private void caseHandle(HikRecvEvent hikRecvEvent, Number eventType, CaseInfo caseInfo) { JSONArray eventArray = hikRecvEvent.getEventArray(); List caseInfos = new ArrayList<>(); - while (eventArray.stream().iterator().hasNext()) { + Iterator iterator = eventArray.iterator(); + while (iterator.hasNext()) { CaseInfo caseInfo1 = new CaseInfo(); - BeanUtils.copyProperties(caseInfo, caseInfo1); - JSONObject event = (JSONObject) eventArray.stream().iterator().next(); + if(!Objects.isNull(caseInfo)){ + BeanUtils.copyProperties(caseInfo, caseInfo1); + } + JSONObject event = (JSONObject) iterator.next(); //5种事件进行不同处理 - if(SecurityEventType.KEY_PERSONNEL_IDENTIFY_EVENT == eventType){ + if (SecurityEventType.KEY_PERSONNEL_IDENTIFY_EVENT.equals(eventType)) { //判断所属人脸分组 JSONObject data = (JSONObject) event.get("data"); JSONObject faceRecognitionResult = (JSONObject) data.get("faceRecognitionResult"); @@ -142,52 +163,101 @@ if (faceGroupCode.equals(blackListGroup.getFaceGroupCode())) { //黑名单分组处理 caseInfo1 = hikService.blackListHandle(event, caseInfo1); - }else if(faceGroupCode.equals(propertyPersonnelGroup.getFaceGroupCode())){ + } else if (faceGroupCode.equals(propertyPersonnelGroup.getFaceGroupCode())) { //考勤分组处理-物业人员,添加到考勤表 hikService.propertyAttendanceHandle(event); - }else if(faceGroupCode.equals(securityPersonnelGroup.getFaceGroupCode())){ + } else if (faceGroupCode.equals(securityPersonnelGroup.getFaceGroupCode())) { //考勤分组处理-安保人员,添加到考勤表 hikService.securityPersonnelHandle(event); - }else { + } else { return; } - }else if(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT == eventType){ + } else if (SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT.equals(eventType)) { //离岗事件处理 caseInfo1 = hikService.demobilizedHandle(event, caseInfo1); - }else if(SecurityEventType.PERSONNEL_GATHER_EVENT == eventType){ + } else if (SecurityEventType.PERSONNEL_GATHER_EVENT.equals(eventType)) { //人员聚集事件处理 caseInfo1 = hikService.personGatherHandle(event, caseInfo1); - }else if(SecurityEventType.MONITORING_POINT_OFFLINE == eventType){ + } else if (SecurityEventType.MONITORING_POINT_OFFLINE.equals(eventType)) { //监控点离线事件处理 caseInfo1 = hikService.monitorPointOfflineHandle(event, caseInfo1); - }else if(SecurityEventType.DEVICE_OFFLINE == eventType){ + } else if (SecurityEventType.MONITORING_POINT_ONLINE.equals(eventType)) { + //监控点上线事件处理 + hikService.monitorPointOnlineHandle(event); + } else if (SecurityEventType.DEVICE_OFFLINE.equals(eventType)) { //装置离线事件处理 caseInfo1 = hikService.deviceOfflineHandle(event, caseInfo1); - }else if(SecurityEventType.VISITOR_REGISTER == eventType){ + } else if (SecurityEventType.DEVICE_ONLINE.equals(eventType)) { + //装置上线处理 + hikService.deviceOnlineHandle(event); + } else if (SecurityEventType.VISITOR_REGISTER.equals(eventType)) { //记录访客登记记录,添加到访客记录表 hikService.visitorRegisterHandler(event); - }else if(SecurityEventType.VISITOR_CHECKOUT == eventType){ + } else if (SecurityEventType.VISITOR_CHECKOUT.equals(eventType)) { //记录访客签离记录 hikService.visitorCheckOutHandler(event); } - if(!Objects.isNull(caseInfo1) && !StringUtils.isEmpty(caseInfo1.getHappenTime())){ + if (!Objects.isNull(caseInfo1) && !StringUtils.isEmpty(caseInfo1.getHappenTime())) { caseInfos.add(caseInfo1); } } //3、安防事件入库 - if(!caseInfoService.insertCaseInfoBatch(caseInfos)){ - log.error("安防事件批量入库异常"); + if (!CollectionUtils.isEmpty(caseInfos) && !caseInfoService.insertCaseInfoBatch(caseInfos)) { + log.error("安防事件批量入库异常!"); } // TODO: 2022/8/15 webSocket推送 + if (CollectionUtils.isEmpty(caseInfos)) { + log.info("webSocket事件推送"); + webSocket.sendAllMessage(JSONObject.toJSONString(caseInfos)); + } return; } /** + * 以图搜图,前端用于轨迹追踪 + */ + @PostMapping("/hik/search/picture") + @ResponseBody + public Object searchPictures(@RequestBody SearchPicturesRequest searchPicturesRequest) { + DateTime startDateTime = DateUtil.parse(searchPicturesRequest.getStartTime()); + DateTime endDateTime = DateUtil.parse(searchPicturesRequest.getEndTime()); + String startTime = DateUtil.format(startDateTime, "yyyy-MM-dd'T'HH:mm:ss.SSSXXX"); + String endTime = DateUtil.format(endDateTime, "yyyy-MM-dd'T'HH:mm:ss.SSSXXX"); + searchPicturesRequest.setStartTime(startTime); + searchPicturesRequest.setEndTime(endTime); + String body = JSONObject.toJSONString(searchPicturesRequest); + String resultStr = HikUtil.hikApi(HikUri.SEARCH_PICTURES, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (!"0".equals(resultJson.get("code"))) { + log.error("请求海康,以图搜图失败,海康response:{}", resultStr); + return ResponseData.error("以图搜图失败"); + } + return ResponseData.success(resultJson); + } + + + /** + * 海康事件取消订阅 + */ + @PostMapping("/hik/event/cancel") + @ResponseBody + public Object eventCancelSubscribe(@RequestBody CancelSubscribeRequest cancelSubscribeRequest) { + String body = JSONObject.toJSONString(cancelSubscribeRequest); + String resultStr = HikUtil.hikApi(HikUri.EVENT_CANCEL, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (!"0".equals(resultJson.get("code"))) { + log.error("请求海康,取消订阅失败,海康response:{}", resultStr); + return ResponseData.error("取消订阅失败"); + } + return ResponseData.success(resultJson); + } + + /** * 单个添加海康人脸分组 * api->hik单个添加人脸分组api->response->mysql */ - @PostMapping("/faceGroup/single/add") + @PostMapping("/hik/faceGroup/single/add") @ResponseBody public Object faceGroupAddition(@RequestBody FaceGroupAdditionRequest faceGroupAdditionRequest) { String body = JSONObject.toJSONString(faceGroupAdditionRequest); @@ -212,7 +282,7 @@ * 批量添加海康组织 * api->hik批量添加组织api->response */ - @PostMapping("/org/batch/add") + @PostMapping("/hik/org/batch/add") @ResponseBody public Object orgBatchAdd(@RequestBody List orgBatchAddRequest) { String body = JSONObject.toJSONString(orgBatchAddRequest); @@ -232,4 +302,62 @@ return ResponseData.error("批量添加组织失败"); } + /** + * 获取人员列表 + */ + @PostMapping("/hik/person/personList") + @ResponseBody + public Object personList() { + PersonListRequest request = new PersonListRequest(); + request.setPageNo(1); + request.setPageSize(100); + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi("/api/resource/v2/person/personList", body); + return resultStr; + } + + /** + * 获取组织列表 + */ + @PostMapping("/hik/org/orgList") + @ResponseBody + public Object orgList() { + PersonListRequest request = new PersonListRequest(); + request.setPageNo(1); + request.setPageSize(100); + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi("/api/resource/v1/org/orgList", body); + return resultStr; + } + + /** + * 查询访客权限下载记录 + */ + @PostMapping("/hik/auth/result") + @ResponseBody + public Object authResult() { + PersonListRequest request = new PersonListRequest(); + request.setPageNo(1); + request.setPageSize(100); + request.setOrderId("ba101db6246711edaea66f7939a13638"); + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi("/api/visitor/v1/auth/result", body); + return resultStr; + } + + /** + * 人脸图片获取 + */ + @PostMapping("/hik/face/picture") + @ResponseBody + public Object facePicture() { + FaceRequest request = new FaceRequest(); +// List list = new ArrayList<>(); +// list.add(""); + request.setCertificateNum("wanggong"); + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi("/api/frs/v1/face", body); + return resultStr; + } + } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/AssetInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/AssetInfoMapper.java index 4f64e83..c0684ee 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/AssetInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/AssetInfoMapper.java @@ -17,6 +17,6 @@ @Mapper public interface AssetInfoMapper extends BaseMapper { - List getAssetInfoListPage(@Param("page") Page page, AssetInfoRequest assetInfoRequest); + List getAssetInfoListPage(@Param("page") Page page, @Param("assetInfoRequest") AssetInfoRequest assetInfoRequest); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/AttendanceInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/AttendanceInfoMapper.java index f9e793e..ec87e46 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/AttendanceInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/AttendanceInfoMapper.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.statistics.AttendanceNumberDTO; import com.casic.missiles.modular.dto.statistics.AttendanceRatioDTO; import com.casic.missiles.modular.model.AttendanceInfo; import org.apache.ibatis.annotations.Mapper; @@ -17,7 +18,7 @@ */ @Mapper public interface AttendanceInfoMapper extends BaseMapper { - List getAttendanceInfoListPage(@Param("page") Page page, StaffInfoRequest attendanceInfoRequest); + List getAttendanceInfoListPage(@Param("page") Page page, @Param("attendanceInfoRequest") StaffInfoRequest attendanceInfoRequest); AttendanceInfo selectByCodeAndDate(@Param("staffCode") String staffCode); @@ -26,4 +27,8 @@ List getCountByTypeAndDateForMonth(@Param("staffType")String staffType); List getCountByTypeAndDateForYear(@Param("staffType")String staffType); + + List getCountForWeek(); + + List getCountForDay(); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java index ce94b8f..6137a7d 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java @@ -17,5 +17,5 @@ @Mapper public interface BlackInfoMapper extends BaseMapper { - List getBlackInfoListPage(@Param("page") Page page, BlackInfoRequest blackInfoRequest); + List getBlackInfoListPage(@Param("page") Page page, @Param("blackInfoRequest") BlackInfoRequest blackInfoRequest); } 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 efda6b3..50aaa6f 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 @@ -20,7 +20,7 @@ List getCaseInfoListPage(@Param("page") Page page, @Param("caseInfoRequest") CaseInfoRequest caseInfoRequest); - int updateStatusById(CaseInfoRequest caseInfoRequest); + int updateStatusById(@Param("caseInfoRequest") CaseInfoRequest caseInfoRequest); List selectByLevelAndMonth(@Param("year") String year); @@ -47,4 +47,20 @@ List selectPreWeekCountByThirtyDay(); List selectPreDayCountBySevenDay(); + + Integer selectDemobilizedCount(@Param("eventType") Number personnelDemobilizedEvent); + + List selectPreMonthCount(); + + List selectListBySevenDay(); + + List selectListByToday(); + + List selectListByToday2(); + + List selectListByToday3(); + + List selectListByType(@Param("eventType") Number eventType); + + List selectDemobilizedCountByHour(@Param("eventType") Number eventType); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/CategoryLevelMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/CategoryLevelMapper.java index 52fc714..afe1650 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/CategoryLevelMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/CategoryLevelMapper.java @@ -17,9 +17,9 @@ @Mapper public interface CategoryLevelMapper extends BaseMapper { - List getCaseCategoryLevelListPage(@Param("page") Page page, CategoryLevelRequest categoryLevelRequest); + List getCaseCategoryLevelListPage(@Param("page") Page page, @Param("categoryLevelRequest") CategoryLevelRequest categoryLevelRequest); - List getCaseCategoryLevelList(CategoryLevelRequest categoryLevelRequest); + List getCaseCategoryLevelList(@Param("categoryLevelRequest") CategoryLevelRequest categoryLevelRequest); CaseCategoryLevel getCaseCategoryLevel(@Param("categoryLevelCode") String categoryLevelCode); 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 66353b1..2555a09 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 @@ -19,7 +19,7 @@ @Mapper public interface DeviceInfoMapper extends BaseMapper { - List getDeviceInfoListPage(@Param("page") Page page, DeviceInfoRequest deviceInfoRequest); + List getDeviceInfoListPage(@Param("page") Page page, @Param("deviceInfoRequest") DeviceInfoRequest deviceInfoRequest); List getDeviceInfoList(@Param("deviceInfoRequest") DeviceInfoRequest deviceInfoRequest); @@ -27,6 +27,8 @@ DeviceInfo getByIndexCode(@Param("srcIndex") String srcIndex); + DeviceInfo getByIp(@Param("ip") String ip); + List selectIndexCodesByCodes(@Param("deviceCodes") List deviceCodes); List selectByType(@Param("devType") String devType); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java index 41dd0af..5bfaf63 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java @@ -5,6 +5,7 @@ import com.casic.missiles.modular.dto.DeviceRepairRequest; import com.casic.missiles.modular.model.DeviceRepairLog; import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; import java.util.List; @@ -16,7 +17,7 @@ @Mapper public interface DeviceRepairLogMapper extends BaseMapper { - List getDeviceRepairListPage(Page page, DeviceRepairRequest deviceRepairRequest); + List getDeviceRepairListPage(@Param("page") Page page, @Param("deviceRepairRequest")DeviceRepairRequest deviceRepairRequest); - List getDeviceRepairList(DeviceRepairRequest deviceRepairRequest); + List getDeviceRepairList(@Param("deviceRepairRequest") DeviceRepairRequest deviceRepairRequest); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java index 9035c47..4823ac1 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java @@ -18,7 +18,7 @@ @Mapper public interface FireEquipInfoMapper extends BaseMapper { - List getFireEquipInfoListPage(@Param("page") Page page, FireEquipRequest fireEquipRequest); + List getFireEquipInfoListPage(@Param("page") Page page, @Param("fireEquipRequest") FireEquipRequest fireEquipRequest); FireEquipInfo getFireEquipInfo(@Param("equipCode") String equipCode); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/GateGroupMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/GateGroupMapper.java index d8c330d..977a427 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/GateGroupMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/GateGroupMapper.java @@ -17,7 +17,7 @@ */ @Mapper public interface GateGroupMapper extends BaseMapper { - List getGateGroupListPage(@Param("page") Page page, GateGroupRequest gateGroupRequest); + List getGateGroupListPage(@Param("page") Page page, @Param("gateGroupRequest") GateGroupRequest gateGroupRequest); GateGroup getGateGroupByName(@Param("groupName") String groupName); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/HazardLevelMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/HazardLevelMapper.java index 8957780..dcf47bb 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/HazardLevelMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/HazardLevelMapper.java @@ -17,11 +17,13 @@ @Mapper public interface HazardLevelMapper extends BaseMapper { - List getCaseHazardLevelListPage(@Param("page") Page page, HazardLevelRequest hazardLevelRequest); + List getCaseHazardLevelListPage(@Param("page") Page page, @Param("hazardLevelRequest") HazardLevelRequest hazardLevelRequest); - List getCaseHazardLevelList(HazardLevelRequest hazardLevelRequest); + List getCaseHazardLevelList(@Param("hazardLevelRequest") HazardLevelRequest hazardLevelRequest); CaseHazardLevel getCaseHazardLevel(@Param("hazardLevelCode") String hazardLevelCode); List selectHazardName(); + + String selectHazardNameByCode(@Param("hazardLevelCode") String hazardLevelCode); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/HikCaseDefineMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/HikCaseDefineMapper.java index 0dc47d1..f162fef 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/HikCaseDefineMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/HikCaseDefineMapper.java @@ -12,5 +12,5 @@ */ @Mapper public interface HikCaseDefineMapper extends BaseMapper { - HikCaseDefine getHikCaseDefine(@Param("caseTypeCode") Long caseTypeCode); + HikCaseDefine getHikCaseDefine(@Param("caseTypeCode") Number caseTypeCode); } 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 f8a674c..fe5afc2 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 @@ -17,11 +17,13 @@ @Mapper public interface StaffInfoMapper extends BaseMapper { - List getStaffInfoListPage(@Param("page") Page page, StaffInfoRequest staffInfoRequest); + List getStaffInfoListPage(@Param("page") Page page, @Param("staffInfoRequest") StaffInfoRequest staffInfoRequest); StaffInfo selectByCode(@Param("staffCode") String staffCode); - List getStaffInfoList(StaffInfoRequest staffInfoRequest); + List getStaffInfoList(@Param("staffInfoRequest") StaffInfoRequest staffInfoRequest); - List selectBatchCodes(List list); + List selectBatchCodes(@Param("list") List list); + + int updateByCodeForCard(@Param("staffCode") String staffCode, @Param("cardNo") String cardNo); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitInfoMapper.java index b1217c5..6c52542 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitInfoMapper.java @@ -16,7 +16,7 @@ */ @Mapper public interface VisitInfoMapper extends BaseMapper { - List getVisitInfoListPage(@Param("page") Page page, VisitorRequest visitorRequest); + List getVisitInfoListPage(@Param("page") Page page, @Param("visitorRequest") VisitorRequest visitorRequest); VisitInfo selectByOrderId(@Param("orderId") String orderId); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitorApplyMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitorApplyMapper.java index c09f3c0..6ea55bd 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitorApplyMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitorApplyMapper.java @@ -18,7 +18,7 @@ @Mapper public interface VisitorApplyMapper extends BaseMapper { - List getVisitorApplyListPage(@Param("page") Page page, VisitorApplyRequest visitorApplyRequest); + List getVisitorApplyListPage(@Param("page") Page page, @Param("visitorApplyRequest") VisitorApplyRequest visitorApplyRequest); List selectByVisitReason(); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/AttendanceInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/AttendanceInfoMapper.xml index b2ece71..f8bdd6e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/AttendanceInfoMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/AttendanceInfoMapper.xml @@ -43,7 +43,8 @@ and staff_type = #{staffType} - and YEARWEEK(date_format(atte_date, '%Y-%m-%d'), 1) = YEARWEEK(now(),1); + AND DATE_SUB(CURDATE(), INTERVAL 7 DAY) <= DATE(atte_date) + GROUP BY DATE_FORMAT(atte_date, '%Y-%m-%d') @@ -69,4 +70,20 @@ GROUP BY DATE_FORMAT(atte_date, '%Y-%m') + + + \ No newline at end of file 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 2b6953f..06ec0a8 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 @@ -28,7 +28,9 @@ @@ -87,7 +89,8 @@ SELECT hazard_level_code as levelCode, count(id) as quantity FROM bus_case_info WHERE hazard_level_code is not null - AND DATE_SUB(CURDATE(), INTERVAL 7 DAY) <= date(happen_time); + AND is_key_area = 1 + AND DATE_SUB(CURDATE(), INTERVAL 7 DAY) <= date(happen_time) GROUP BY hazard_level_code @@ -95,7 +98,8 @@ SELECT hazard_level_code as levelCode, count(id) as quantity FROM bus_case_info WHERE hazard_level_code is not null - AND DATE_SUB(CURDATE(), INTERVAL 30 DAY) <= date(happen_time); + AND is_key_area = 1 + AND DATE_SUB(CURDATE(), INTERVAL 30 DAY) <= date(happen_time) GROUP BY hazard_level_code @@ -122,4 +126,71 @@ AND hazard_level_code is not null GROUP BY DATE_FORMAT(happen_time,'%Y-%m-%d') + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/CategoryLevelMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/CategoryLevelMapper.xml index 4670b1f..1d25cbd 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/CategoryLevelMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/CategoryLevelMapper.xml @@ -20,11 +20,11 @@ SELECT * FROM bus_case_category_level WHERE 1=1 - - and code = #{code} + + and code = #{categoryLevelRequest.code} - - and name = #{name} + + and name = #{categoryLevelRequest.name} ORDER by create_time DESC 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 9b66fd8..bfd84b7 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 @@ -98,4 +98,10 @@ #{item} + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceRepairLogMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceRepairLogMapper.xml index 078ed3c..cf1a481 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceRepairLogMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceRepairLogMapper.xml @@ -22,14 +22,14 @@ SELECT * FROM bus_device_repair_log WHERE 1=1 - - and device_code = #{devCode} + + and device_code = #{deviceRepairRequest.devCode} - - and device_name = #{devName} + + and device_name = #{deviceRepairRequest.devName} - - and DATE_FORMAT(create_time,"%y%m%d") = DATE_FORMAT(#{createTime},"%y%m%d") + + and DATE_FORMAT(create_time,"%y%m%d") = DATE_FORMAT(#{deviceRepairRequest.createTime},"%y%m%d") ORDER by create_time DESC diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/BlackListController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/BlackListController.java index a27f9f8..0c06661 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/BlackListController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/BlackListController.java @@ -1,13 +1,18 @@ package com.casic.missiles.modular.controller; +import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.base.controller.ExportController; import com.casic.missiles.core.page.PageFactory; import com.casic.missiles.model.response.ResponseData; import com.casic.missiles.modular.dto.BlackInfoRequest; +import com.casic.missiles.modular.dto.BlackPictureRequest; +import com.casic.missiles.modular.dto.hik.PersonInfoRequest; +import com.casic.missiles.modular.enums.HikUri; import com.casic.missiles.modular.enums.OperateTypeEnum; import com.casic.missiles.modular.model.BlackInfo; import com.casic.missiles.modular.service.BlackInfoService; +import com.casic.missiles.modular.util.HikUtil; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; @@ -56,4 +61,22 @@ return null; } + /** + * 黑名单人员照片 + */ + @PostMapping("/personPicture") + @ResponseBody + public Object personPicture(@RequestBody BlackPictureRequest blackPictureRequest){ + //获取照片 + String picUri = blackPictureRequest.getPicUri(); + String serverIndexCode = blackPictureRequest.getServerIndexCode(); + PersonInfoRequest picRequest = new PersonInfoRequest(); + picRequest.setPicUri(picUri); + picRequest.setServerIndexCode(serverIndexCode); + String reBody = JSONObject.toJSONString(picRequest); + //重定向地址获取 + String url = HikUtil.hikApiFor302(HikUri.PERSON_PICTURE, reBody); + return ResponseData.success(url); + } + } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/DeviceController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/DeviceController.java index e1c4eba..666bbee 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/DeviceController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/DeviceController.java @@ -107,7 +107,7 @@ } /** - * 设备维修管理查询(分页),需计算MTTR=总维修时间/故障次数 + * 设备状态计算与评判/设备维修管理查询(分页),需计算MTTR=总维修时间/故障次数 */ @PostMapping("/repair/listPage") @ResponseBody @@ -211,7 +211,7 @@ //需根据设备编号获取到对应的门禁点唯一标识 doorControlRequest.setDoorIndexCodes(indexCodes); doorControlRequest.setControlType(Integer.valueOf(gateGroupDTO.getStatus())); - String body = JSONObject.toJSONString(deviceCodes); + String body = JSONObject.toJSONString(doorControlRequest); String resultStr = HikUtil.hikApi(HikUri.DOOR_CONTROL, body); JSONObject resultJson = (JSONObject)JSONObject.parse(resultStr); if (!"0".equals(resultJson.get("code"))) { diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/StaffController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/StaffController.java index b58ccab..704093c 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/StaffController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/StaffController.java @@ -2,15 +2,21 @@ import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.util.StrUtil; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.base.controller.ExportController; import com.casic.missiles.core.page.PageFactory; import com.casic.missiles.model.response.ErrorResponseData; import com.casic.missiles.model.response.ResponseData; import com.casic.missiles.modular.dto.StaffInfoRequest; +import com.casic.missiles.modular.dto.hik.PersonInfoRequest; +import com.casic.missiles.modular.dto.hik.StaffCardRequest; +import com.casic.missiles.modular.enums.HikUri; import com.casic.missiles.modular.enums.OperateTypeEnum; import com.casic.missiles.modular.model.StaffInfo; import com.casic.missiles.modular.service.StaffInfoService; +import com.casic.missiles.modular.util.HikUtil; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; @@ -110,4 +116,60 @@ } return ResponseData.success(); } + + /** + * 批量开卡,添加人员之后调用,若在一个接口中添加人员成功开卡失败则第二次添加时会有问题 + */ + @PostMapping("/cardBinding") + @ResponseBody + public Object cardBinding(@RequestBody StaffCardRequest staffCardRequest) { + String body = JSONObject.toJSONString(staffCardRequest); + String resultStr = HikUtil.hikApi(HikUri.CARD_BINDING, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (!"0".equals(resultJson.get("code"))) { + log.error("请求海康,批量开卡失败,海康response:{}", resultStr); + return ResponseData.error("批量开卡失败"); + } + //保存卡号 + if(staffInfoService.saveCardInfo(staffCardRequest) > 0){ + return ResponseData.success(); + } + return ResponseData.error("批量开卡失败"); + } + + /** + * 获取员工照片,海康存储 + */ + @PostMapping("/personPicture/{staffCode}") + @ResponseBody + public Object personPicture(@PathVariable("staffCode") String staffCode){ + //获取员工详细信息,含图片服务器、uri + PersonInfoRequest request = new PersonInfoRequest(); + List list = new ArrayList<>(); + list.add(staffCode); + request.setParamName("personId"); + request.setParamValue(list); + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi(HikUri.PERSON_INFO, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (!"0".equals(resultJson.get("code"))) { + log.error("请求海康,根据人员唯一字段获取人员详细信息失败,海康response:{}", resultStr); + return ResponseData.error("获取员工照片失败"); + } + //获取照片 + JSONObject data = (JSONObject) resultJson.get("data"); + JSONArray dataArray = (JSONArray) data.get("list"); + JSONObject jsonObject = (JSONObject) dataArray.get(0); + JSONArray personPhoto = (JSONArray) jsonObject.get("personPhoto"); + JSONObject photo = (JSONObject) personPhoto.get(0); + String picUri = photo.getString("picUri"); + String serverIndexCode = photo.getString("serverIndexCode"); + PersonInfoRequest picRequest = new PersonInfoRequest(); + picRequest.setPicUri(picUri); + picRequest.setServerIndexCode(serverIndexCode); + String reBody = JSONObject.toJSONString(picRequest); + //重定向地址获取 + String url = HikUtil.hikApiFor302(HikUri.PERSON_PICTURE, reBody); + return ResponseData.success(url); + } } 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 4a07dd9..7b1dcf6 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 @@ -16,6 +16,7 @@ import com.casic.missiles.modular.redis.key.CacheKeys; import com.casic.missiles.modular.service.CockpitService; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.util.CollectionUtils; import org.springframework.web.bind.annotation.*; @@ -24,10 +25,7 @@ import java.text.NumberFormat; import java.time.LocalDateTime; import java.time.temporal.ChronoUnit; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.util.*; import java.util.stream.Collectors; /** @@ -73,6 +71,9 @@ private StatisticNumberMapper numberMapper; @Autowired + private HazardLevelMapper hazardLevelMapper; + + @Autowired private AccessGroupConfig accessGroupConfig; /** @@ -104,8 +105,24 @@ public Object buildingNumberPerHour(){ //当天按小时分组的人数 List list = numberMapper.selectListByTime(); - Map> collect = list.stream().collect(Collectors.groupingBy(BuildingNumberDTO::getStatisticPosition)); - return ResponseData.success(collect); + Map> collect = list.stream().collect(Collectors.groupingBy(BuildingNumberDTO::getStatisticTime)); + //定时任务中已将每小时三栋楼人数存到数据库 + //将一期主楼和录制楼人数合并,二期单算 + List> resultList = new ArrayList<>(); + collect.keySet().forEach(key -> { + List buildingNumberDTOS = collect.get(key); + BuildingNumberDTO mainBuildingOne = buildingNumberDTOS.get(0); + BuildingNumberDTO mainBuildingTwo = buildingNumberDTOS.get(1); + BuildingNumberDTO recordingBuilding = buildingNumberDTOS.get(2); + HashMap resultMap = new HashMap<>(); + Integer oneQuantity = Integer.valueOf(mainBuildingOne.getStatisticQuantity()); + Integer recordingQuantity = Integer.valueOf(recordingBuilding.getStatisticQuantity()); + resultMap.put("staticTime", mainBuildingOne.getStatisticTime()); + resultMap.put(mainBuildingOne.getStatisticPositionName()+"、"+recordingBuilding.getStatisticPositionName(), String.valueOf(oneQuantity+recordingQuantity)); + resultMap.put(mainBuildingTwo.getStatisticPositionName(), mainBuildingTwo.getStatisticQuantity()); + resultList.add(resultMap); + }); + return ResponseData.success(resultList); } /** @@ -151,12 +168,11 @@ public Object securityNumber() { QueryWrapper wrapper = new QueryWrapper<>(); wrapper.eq("staff_type", 2); + // TODO: 2022/9/2 后续使用产品确定的每天出勤的安保人员的数量 Integer total = staffInfoMapper.selectCount(wrapper); - //当日离岗事件个数 - QueryWrapper wrapper1 = new QueryWrapper<>(); - wrapper1.eq("hik_event_type", SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); - wrapper1.apply("date_format(now(),'%Y-%m-%d') = date_format(happen_time,'%Y-%m-%d')"); - Integer leave = caseInfoMapper.selectCount(wrapper1); + //当日离岗事件按设备去重后的个数 + // TODO: 2022/9/2 目前相当于24小时内的计算,之后看需要可改成自定义小时数计算离岗率,即离岗+6小时内仅一次离岗则恢复为100%,多次则累加离岗次数计算离岗率 + Integer leave = caseInfoMapper.selectDemobilizedCount(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); NumberFormat numberFormat = NumberFormat.getInstance(); // 设置精确到小数点后2位 numberFormat.setMaximumFractionDigits(2); @@ -179,7 +195,6 @@ @ResponseBody public Object visitorApplyDetail() { List reasonGroup = applyMapper.selectByVisitReason(); - HashMap resultMap = new HashMap<>(); NumberFormat numberFormat = NumberFormat.getInstance(); // 设置精确到小数点后2位 numberFormat.setMaximumFractionDigits(2); @@ -187,12 +202,17 @@ if(0 == sum){ return ResponseData.success(); } + List resultList = new ArrayList<>(); reasonGroup.forEach(group -> { String reasonName = dictService.getDictNameByCode(SecurityEventDict.VISIT_REASON, group.getVisitReason()); String result = numberFormat.format((float) group.getQuantity() / (float) sum * 100); - resultMap.put(reasonName, result+"%"); + ApplyReasonGroupDTO applyReasonGroupDTO = new ApplyReasonGroupDTO(); + applyReasonGroupDTO.setQuantity(group.getQuantity()); + applyReasonGroupDTO.setVisitReason(reasonName); + applyReasonGroupDTO.setRatio(result+"%"); + resultList.add(applyReasonGroupDTO); }); - return ResponseData.success(resultMap); + return ResponseData.success(resultList); } /** @@ -247,6 +267,32 @@ } /** + * 机动力量实时在岗率,在岗人数除以总应在岗人数,用离岗+6小时内恢复为100%,6小时外再计算 + */ + @GetMapping("/staff/beOnDutyRatio") + @ResponseBody + public Object beOnDutyRatio() { + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("staff_type", 2); + // TODO: 2022/9/2 后续使用产品确定的每天出勤的安保人员的数量 + Integer total = staffInfoMapper.selectCount(wrapper); + if(0 == total){ + return ResponseData.success(null); + } + //当日离岗事件按设备去重后的个数 + // TODO: 2022/9/2 目前相当于24小时内的计算,之后看需要可改成自定义小时数计算离岗率,即离岗+6小时内仅一次离岗则恢复为100%,多次则累加离岗次数计算离岗率 + List onDutyRatioDTOS = caseInfoMapper.selectDemobilizedCountByHour(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); + onDutyRatioDTOS.forEach(dto -> { + NumberFormat numberFormat = NumberFormat.getInstance(); + // 设置精确到小数点后2位 + numberFormat.setMaximumFractionDigits(2); + String result = numberFormat.format(100 - Float.valueOf(dto.getQuantity()) / (float) total * 100); + dto.setRatio(result+"%"); + }); + return ResponseData.success(onDutyRatioDTOS); + } + + /** * 闸机速通门统计-设备状态分组计算数量,devType传闸机字典key * 视频频监控摄像机统计-设备状态分组计算数量,devType传摄像头字典key */ @@ -262,12 +308,17 @@ if(sum <= 0){ return ResponseData.error("无该类设备信息"); } + List resultList = new ArrayList<>(); gateStatusGroup.forEach(group -> { String devStatus = dictService.getDictNameByCode(SecurityEventDict.DEVICE_STATUS, group.getStatus()); String result = numberFormat.format((float) group.getQuantity() / (float) sum * 100); - resultMap.put(devStatus, result+"%"); + GateStatusGroupResponse gateStatusGroupResponse = new GateStatusGroupResponse(); + gateStatusGroupResponse.setStatus(devStatus); + gateStatusGroupResponse.setRatio(result+"%"); + resultList.add(gateStatusGroupResponse); }); - resultMap.put("总", sum); + resultMap.put("total", sum); + resultMap.put("list", resultList); return ResponseData.success(resultMap); } @@ -282,17 +333,38 @@ String position = securityScoreDTO.getPosition(); List caseInfos = caseInfoMapper.selectByPosition(position); //查询各危险级别权重、各类别权重,放入map,避免循环中多次查数据库 - + HashMap hazardScoreMap = new HashMap<>(); + List caseHazardLevelList = hazardLevelMapper.getCaseHazardLevelList(null); + caseHazardLevelList.forEach(hazardLevel -> { + hazardScoreMap.put(hazardLevel.getCode(), hazardLevel.getWeight()); + }); + HashMap categoryScoreMap = new HashMap<>(); + List categoryLevelList = categoryLevelMapper.getCaseCategoryLevelList(null); + categoryLevelList.forEach(categoryLevel -> { + categoryScoreMap.put(categoryLevel.getCode(), categoryLevel.getWeight()); + }); + //事件按楼层分组,计算 List securityScoreDTOs = new ArrayList<>(); caseInfos.forEach(caseInfo -> { SecurityScoreDTO securityScoreDTO1 = new SecurityScoreDTO(); + securityScoreDTO1.setPosition(caseInfo.getPosition()); securityScoreDTO1.setArea(caseInfo.getArea()); - // TODO: 2022/8/4 楼层评分计算根据产品定义调整 -// caseInfo.get -// securityScoreDTO1.setScore(); + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); + Double score = 100 - Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + securityScoreDTO1.setScore(score); + securityScoreDTOs.add(securityScoreDTO1); }); - - return null; + 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); + }); + return ResponseData.success(securityScoreDTOs); } /** @@ -303,9 +375,13 @@ public Object SecurityFrequency(@RequestBody SecurityFrequencyDTO securityFrequencyDTO) { String year = securityFrequencyDTO.getYear(); String month = securityFrequencyDTO.getMonth(); - Integer quantity = caseInfoMapper.selectCountByMonth(year, month); - securityFrequencyDTO.setQuantity(quantity); - return ResponseData.success(securityFrequencyDTO); + if(!StringUtils.isEmpty(year) && StringUtils.isEmpty(month)){ + Integer quantity = caseInfoMapper.selectCountByMonth(year, month); + securityFrequencyDTO.setQuantity(quantity); + return ResponseData.success(securityFrequencyDTO); + } + List list = caseInfoMapper.selectPreMonthCount(); + return ResponseData.success(list); } } 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 ae4d770..f4f075c 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 @@ -1,20 +1,25 @@ package com.casic.missiles.modular.controller.cockpit; +import cn.hutool.core.date.DateUnit; import cn.hutool.core.date.DateUtil; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.casic.missiles.model.response.ResponseData; -import com.casic.missiles.modular.dao.AttendanceInfoMapper; -import com.casic.missiles.modular.dao.CaseInfoMapper; -import com.casic.missiles.modular.dao.HazardLevelMapper; -import com.casic.missiles.modular.dao.StaffInfoMapper; +import com.casic.missiles.modular.dao.*; +import com.casic.missiles.modular.dto.DeviceRepairLogDTO; +import com.casic.missiles.modular.dto.DeviceRepairRequest; import com.casic.missiles.modular.dto.statistics.*; +import com.casic.missiles.modular.enums.SecurityEventType; +import com.casic.missiles.modular.model.CaseCategoryLevel; import com.casic.missiles.modular.model.CaseHazardLevel; +import com.casic.missiles.modular.model.CaseInfo; import com.casic.missiles.modular.model.StaffInfo; +import com.casic.missiles.modular.service.DeviceInfoService; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.util.CollectionUtils; import org.springframework.web.bind.annotation.*; +import java.math.BigDecimal; import java.text.NumberFormat; import java.util.*; import java.util.stream.Collectors; @@ -40,6 +45,12 @@ @Autowired private HazardLevelMapper hazardLevelMapper; + @Autowired + private CategoryLevelMapper categoryLevelMapper; + + @Autowired + private DeviceInfoService deviceInfoService; + /** * 安防事件时域频次统计,每月的每天安防事件个数(原方案) * 月维度:展示每个月的每天的数据 @@ -89,15 +100,17 @@ List monthList = caseInfoMapper.selectPreMonthCountByYear(year); Map> collect = monthList.stream().collect(Collectors.groupingBy(PreMonthOrWeekCaseDTO::getHazardLevelCode)); HashMap strAvgMap = new HashMap<>(); + List resultList = new ArrayList<>(); for (String key : collect.keySet()) { List preMonthOrWeekCaseDTOS = collect.get(key); int sum = preMonthOrWeekCaseDTOS.stream().mapToInt(PreMonthOrWeekCaseDTO::getQuantity).sum(); //若年份是本年,则使用个安防级别数量/当前月份数 //若不是本年,除数为12 MonthAndWeekDTO monthAndWeekDTO = new MonthAndWeekDTO(); + String hazardName = hazardLevelMapper.selectHazardNameByCode(key); + monthAndWeekDTO.setLevelName(hazardName); if(year.equals(String.valueOf(DateUtil.thisYear()))){ monthAndWeekDTO.setMonthQuantity(sum / DateUtil.thisMonth()); -// monthAndWeekDTO.setLevelName(); strAvgMap.put(key, monthAndWeekDTO); }else{ monthAndWeekDTO.setMonthQuantity(sum / 12); @@ -113,27 +126,37 @@ if(year.equals(String.valueOf(DateUtil.thisYear()))){ if(!Objects.isNull(strAvgMap.get(key))){ MonthAndWeekDTO monthAndWeekDTO = strAvgMap.get(key); + String hazardName = hazardLevelMapper.selectHazardNameByCode(key); + monthAndWeekDTO.setLevelName(hazardName); monthAndWeekDTO.setWeekQuantity(sum / DateUtil.thisWeekOfYear()); strAvgMap.put(key, monthAndWeekDTO); }else{ MonthAndWeekDTO monthAndWeekDTO = new MonthAndWeekDTO(); + String hazardName = hazardLevelMapper.selectHazardNameByCode(key); + monthAndWeekDTO.setLevelName(hazardName); monthAndWeekDTO.setWeekQuantity(sum / DateUtil.thisWeekOfYear()); strAvgMap.put(key, monthAndWeekDTO); } }else{ if(!Objects.isNull(strAvgMap.get(key))){ MonthAndWeekDTO monthAndWeekDTO = strAvgMap.get(key); + String hazardName = hazardLevelMapper.selectHazardNameByCode(key); + monthAndWeekDTO.setLevelName(hazardName); monthAndWeekDTO.setWeekQuantity(sum / 52); strAvgMap.put(key, monthAndWeekDTO); }else{ MonthAndWeekDTO monthAndWeekDTO = new MonthAndWeekDTO(); + String hazardName = hazardLevelMapper.selectHazardNameByCode(key); + monthAndWeekDTO.setLevelName(hazardName); monthAndWeekDTO.setWeekQuantity(sum / 52); strAvgMap.put(key, monthAndWeekDTO); } } } - avgMonthAndWeekGroupDTO.setMap(strAvgMap); - return ResponseData.success(avgMonthAndWeekGroupDTO); + strAvgMap.keySet().forEach(key -> { + resultList.add(strAvgMap.get(key)); + }); + return ResponseData.success(resultList); } /** @@ -181,12 +204,178 @@ } /** - * 员工考勤人数变化,功能待定 + * 员工考勤人数变化,统计当天(横坐标为时)及近7天(横坐标为天)的考勤人数变化,只要发生一次考勤识别,次数的基数就正常增加(没有上班下班区分) */ + @PostMapping("/staff/attendanceNumber/{dimension}") + @ResponseBody + public Object attendanceNumber(@PathVariable("dimension") String dimension) { + List attendanceNumberDTOs = null; + List> resultList = new ArrayList<>(); + if("week".equals(dimension)){ + //近7天数据按天分组统计 + attendanceNumberDTOs = attendanceInfoMapper.getCountForWeek(); + }else if("day".equals(dimension)) { + //今天数据按小时分组统计 + attendanceNumberDTOs = attendanceInfoMapper.getCountForDay(); + } + if(CollectionUtils.isEmpty(attendanceNumberDTOs)){ + return ResponseData.error("该查询条件下,无员工出勤数据!"); + } + Map> collect = attendanceNumberDTOs.stream().collect(Collectors.groupingBy(AttendanceNumberDTO::getDate)); + collect.keySet().forEach(key -> { + List attendanceNumberDTOS = collect.get(key); + AttendanceNumberDTO attendanceNumberDTO = attendanceNumberDTOS.get(0); + AttendanceNumberDTO attendanceNumberDTO2 = attendanceNumberDTOS.get(1); + Map resultMap = new HashMap<>(); + resultMap.put(attendanceNumberDTO.getStaffType(), attendanceNumberDTO.getQuantity()); + resultMap.put(attendanceNumberDTO2.getStaffType(), attendanceNumberDTO2.getQuantity()); + resultMap.put("staticTime", attendanceNumberDTO.getDate()); + resultList.add(resultMap); + }); + return ResponseData.success(resultList); + } /** - * 近30天/近一周安保人员到岗排行 + * 早晚高峰区域安防评估 */ + @PostMapping("/security/assessment/{dimension}") + @ResponseBody + public Object securityAssessment(@PathVariable("dimension") String dimension) { + //查询各危险级别权重、各类别权重,放入map,避免循环中多次查数据库 + HashMap hazardScoreMap = new HashMap<>(); + List caseHazardLevelList = hazardLevelMapper.getCaseHazardLevelList(null); + caseHazardLevelList.forEach(hazardLevel -> { + hazardScoreMap.put(hazardLevel.getCode(), hazardLevel.getWeight()); + }); + HashMap categoryScoreMap = new HashMap<>(); + List categoryLevelList = categoryLevelMapper.getCaseCategoryLevelList(null); + categoryLevelList.forEach(categoryLevel -> { + categoryScoreMap.put(categoryLevel.getCode(), categoryLevel.getWeight()); + }); + HashMap hashMap = new HashMap<>(); + if("week".equals(dimension)){ + //近7天早晚高峰数据 + List caseInfos = caseInfoMapper.selectListBySevenDay(); + //按时间(天)进行分组 + caseInfos.forEach(caseInfo -> { + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); + Double score = Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + String[] array = caseInfo.getHappenTime().split(" "); + String dayTime = array[0]; + BigDecimal preScore; + if(hashMap.containsKey(dayTime)){ + Double aDouble = hashMap.get(dayTime); + preScore = new BigDecimal(aDouble.toString()); + + }else{ + preScore = new BigDecimal("100.0"); + } + BigDecimal nowScore = new BigDecimal(score.toString()); + hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); + }); + return ResponseData.success(hashMap); + }else if("day".equals(dimension)) { + //今天数据按小时分组统计 + List caseInfos = caseInfoMapper.selectListByToday(); + caseInfos.forEach(caseInfo -> { + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); + Double score = Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + String[] array = caseInfo.getHappenTime().split(":"); + String dayTime = array[0]; + BigDecimal preScore; + if(hashMap.containsKey(dayTime)){ + Double aDouble = hashMap.get(dayTime); + preScore = new BigDecimal(aDouble.toString()); + + }else{ + preScore = new BigDecimal("100.0"); + } + BigDecimal nowScore = new BigDecimal(score.toString()); + hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); + }); + return ResponseData.success(hashMap); + } + return null; + } + + /** + * 重点区域安防事态评估,统计重点区域6:00-23:00按小时分组数据 + */ + @GetMapping("/security/keyAreaStatistic") + @ResponseBody + public Object keyAreaStatistic() { + //查询各危险级别权重、各类别权重,放入map,避免循环中多次查数据库 + HashMap hazardScoreMap = new HashMap<>(); + List caseHazardLevelList = hazardLevelMapper.getCaseHazardLevelList(null); + caseHazardLevelList.forEach(hazardLevel -> { + hazardScoreMap.put(hazardLevel.getCode(), hazardLevel.getWeight()); + }); + HashMap categoryScoreMap = new HashMap<>(); + List categoryLevelList = categoryLevelMapper.getCaseCategoryLevelList(null); + categoryLevelList.forEach(categoryLevel -> { + categoryScoreMap.put(categoryLevel.getCode(), categoryLevel.getWeight()); + }); + HashMap hashMap = new HashMap<>(); + //今天数据按小时分组统计 + List caseInfos = caseInfoMapper.selectListByToday2(); + caseInfos.forEach(caseInfo -> { + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); + Double score = Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + String[] array = caseInfo.getHappenTime().split(":"); + String dayTime = array[0]; + BigDecimal preScore; + if(hashMap.containsKey(dayTime)){ + Double aDouble = hashMap.get(dayTime); + preScore = new BigDecimal(aDouble.toString()); + + }else{ + preScore = new BigDecimal("100.0"); + } + BigDecimal nowScore = new BigDecimal(score.toString()); + hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); + }); + return ResponseData.success(hashMap); + } + + /** + * 安防机动支援力量调配响应评估,根据事件已解决状态及已解决时间-发送时间,按时间(小时)分组统计 + */ + @GetMapping("/security/responseAssess") + @ResponseBody + public Object responseAssess() { + //查询各危险级别权重、各类别权重,放入map,避免循环中多次查数据库 + HashMap hazardScoreMap = new HashMap<>(); + List caseHazardLevelList = hazardLevelMapper.getCaseHazardLevelList(null); + caseHazardLevelList.forEach(hazardLevel -> { + hazardScoreMap.put(hazardLevel.getCode(), hazardLevel.getWeight()); + }); + HashMap hashMap = new HashMap<>(); + //今天数据按小时分组统计 + List caseInfos = caseInfoMapper.selectListByToday3(); + caseInfos.forEach(caseInfo -> { + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + //扣分=事件级别权重*未解决小时数 + Date updateTime = DateUtil.parse(caseInfo.getUpdateTime()); + Date happenTime = DateUtil.parse(caseInfo.getHappenTime()); + long between = DateUtil.between(updateTime, happenTime, DateUnit.HOUR); + Double score = Double.valueOf(hazardWeight)*between; + String[] array = caseInfo.getHappenTime().split(":"); + String dayTime = array[0]; + BigDecimal preScore; + if(hashMap.containsKey(dayTime)){ + Double aDouble = hashMap.get(dayTime); + preScore = new BigDecimal(aDouble.toString()); + }else{ + preScore = new BigDecimal("100.0"); + } + BigDecimal nowScore = new BigDecimal(score.toString()); + hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); + }); + return ResponseData.success(hashMap); + } /** * 重点区域威胁事件类型统计,优先级2,统计近7天和近30天 @@ -224,7 +413,34 @@ } /** - * 设备状态计算系数和评判,优先级3,需确认设备恢复时间是否可以获取 + * 近30天/近一周安保人员到岗排行 */ + + /** + * 安保等级评估,发生离岗事件减1分 + */ + @GetMapping("/security/levelAssess") + @ResponseBody + public Object securityLevelAssess() { + //今天数据按小时分组统计 + List resultList = caseInfoMapper.selectListByType(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); + resultList.forEach(result -> { + BigDecimal deScore = new BigDecimal(result.getQuantity()); + BigDecimal preScore = new BigDecimal("100.0"); + result.setScore(preScore.subtract(deScore).doubleValue()); + }); + return ResponseData.success(resultList); + } + + /** + * 设备状态计算系数和评判,即设备维修管理查询(不分页) + */ + @PostMapping("/device/repairList") + @ResponseBody + public Object repairList(@RequestBody DeviceRepairRequest deviceRepairRequest) { + List deviceRepairLogDTOS = deviceInfoService.deviceRepairListPage(deviceRepairRequest); + return ResponseData.success(deviceRepairLogDTOS); + } + } 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 fbf8ab6..c71a15a 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 @@ -1,13 +1,12 @@ package com.casic.missiles.modular.controller.hik; +import cn.hutool.core.date.DateTime; +import cn.hutool.core.date.DateUtil; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.casic.missiles.model.response.ResponseData; import com.casic.missiles.modular.dao.HikFaceGroupInfoMapper; -import com.casic.missiles.modular.dto.hik.EventSubscribeRequest; -import com.casic.missiles.modular.dto.hik.FaceGroupAdditionRequest; -import com.casic.missiles.modular.dto.hik.HikRecvEvent; -import com.casic.missiles.modular.dto.hik.OrgBatchAdd; +import com.casic.missiles.modular.dto.hik.*; import com.casic.missiles.modular.enums.HikUri; import com.casic.missiles.modular.enums.SecurityEventType; import com.casic.missiles.modular.model.CaseInfo; @@ -18,16 +17,20 @@ import com.casic.missiles.modular.util.CaseInfoFactoryUtil; import com.casic.missiles.modular.util.HikUtil; import com.casic.missiles.modular.util.ThreadPoolUtil; +import com.casic.missiles.modular.util.WebSocket; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; -import org.springframework.web.bind.annotation.*; +import org.springframework.util.CollectionUtils; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.RestController; -import java.net.InetAddress; -import java.net.UnknownHostException; import java.util.ArrayList; +import java.util.Iterator; import java.util.List; import java.util.Objects; @@ -38,7 +41,6 @@ */ @Slf4j @RestController -@RequestMapping("/hik") public class HikController { @Autowired @@ -53,28 +55,37 @@ @Autowired private HikService hikService; + @Autowired + private HikFaceGroupInfoMapper hikFaceGroupInfoMapper; + + @Autowired + private WebSocket webSocket; + @Value("${server.port}") private int serverPort; - @Autowired - private HikFaceGroupInfoMapper hikFaceGroupInfoMapper; /** * 海康事件订阅 */ - @PostMapping("/event/subscribe") + @PostMapping("/hik/event/subscribe") @ResponseBody - public Object eventSubscribe() throws UnknownHostException { + public Object eventSubscribe() { EventSubscribeRequest eventSubscribeRequest = new EventSubscribeRequest(); ArrayList list = new ArrayList<>(); list.add(SecurityEventType.DEVICE_OFFLINE); + list.add(SecurityEventType.DEVICE_ONLINE); list.add(SecurityEventType.KEY_PERSONNEL_IDENTIFY_EVENT); list.add(SecurityEventType.MONITORING_POINT_OFFLINE); + list.add(SecurityEventType.MONITORING_POINT_ONLINE); list.add(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); list.add(SecurityEventType.PERSONNEL_GATHER_EVENT); - InetAddress localHost = InetAddress.getLocalHost(); + list.add(SecurityEventType.VISITOR_REGISTER); + list.add(SecurityEventType.VISITOR_CHECKOUT); + list.add(SecurityEventType.HIGH_ALTITUDE_PARABOLIC); +// InetAddress localHost = InetAddress.getLocalHost(); eventSubscribeRequest.setEventTypes(list); - eventSubscribeRequest.setEventDest("https://" + localHost + ":" + serverPort + "/eventRcv"); + eventSubscribeRequest.setEventDest("http://" + "192.168.10.6" + ":" + serverPort + "/eventRcv"); //订阅类型,0-订阅原始事件,1-联动事件,2-原始事件和联动事件,不填使用默认值0 eventSubscribeRequest.setSubType(0); /** @@ -92,19 +103,25 @@ } /** + * 查询事件订阅信息 + */ + @PostMapping("/hik/event/query") + @ResponseBody + public Object eventQuery() { + String result = HikUtil.hikApi(HikUri.EVENT_INFO, ""); + return result; + } + + /** * 海康事件接收 */ @PostMapping("/eventRcv") @ResponseBody public Object eventRcv(@RequestBody HikRecvEvent hikRecvEvent) { //1、接收所需事件类型 - Long eventType = hikRecvEvent.getEventType(); + Number eventType = hikRecvEvent.getEventType(); log.info("接收到安防事件类型为:{}", eventType); CaseInfo caseInfo = caseInfoFactoryUtil.getCaseInfo(eventType); - //接收到不关心事件直接返回 - if(Objects.isNull(caseInfo)){ - return ResponseData.success(); - } //2、不同事件不同处理,caseInfoFactoryUtil已设置好事件基础定义信息 // 再为事件添加状态、设备编码、设备名称、位置、区域、时间 // 异步处理事件 @@ -114,19 +131,23 @@ caseHandle(hikRecvEvent, eventType, caseInfo); } })); +// caseHandle(hikRecvEvent, eventType, caseInfo); - return null; + return ResponseData.success(); } - private void caseHandle(HikRecvEvent hikRecvEvent, Long eventType, CaseInfo caseInfo) { + private void caseHandle(HikRecvEvent hikRecvEvent, Number eventType, CaseInfo caseInfo) { JSONArray eventArray = hikRecvEvent.getEventArray(); List caseInfos = new ArrayList<>(); - while (eventArray.stream().iterator().hasNext()) { + Iterator iterator = eventArray.iterator(); + while (iterator.hasNext()) { CaseInfo caseInfo1 = new CaseInfo(); - BeanUtils.copyProperties(caseInfo, caseInfo1); - JSONObject event = (JSONObject) eventArray.stream().iterator().next(); + if(!Objects.isNull(caseInfo)){ + BeanUtils.copyProperties(caseInfo, caseInfo1); + } + JSONObject event = (JSONObject) iterator.next(); //5种事件进行不同处理 - if(SecurityEventType.KEY_PERSONNEL_IDENTIFY_EVENT == eventType){ + if (SecurityEventType.KEY_PERSONNEL_IDENTIFY_EVENT.equals(eventType)) { //判断所属人脸分组 JSONObject data = (JSONObject) event.get("data"); JSONObject faceRecognitionResult = (JSONObject) data.get("faceRecognitionResult"); @@ -142,52 +163,101 @@ if (faceGroupCode.equals(blackListGroup.getFaceGroupCode())) { //黑名单分组处理 caseInfo1 = hikService.blackListHandle(event, caseInfo1); - }else if(faceGroupCode.equals(propertyPersonnelGroup.getFaceGroupCode())){ + } else if (faceGroupCode.equals(propertyPersonnelGroup.getFaceGroupCode())) { //考勤分组处理-物业人员,添加到考勤表 hikService.propertyAttendanceHandle(event); - }else if(faceGroupCode.equals(securityPersonnelGroup.getFaceGroupCode())){ + } else if (faceGroupCode.equals(securityPersonnelGroup.getFaceGroupCode())) { //考勤分组处理-安保人员,添加到考勤表 hikService.securityPersonnelHandle(event); - }else { + } else { return; } - }else if(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT == eventType){ + } else if (SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT.equals(eventType)) { //离岗事件处理 caseInfo1 = hikService.demobilizedHandle(event, caseInfo1); - }else if(SecurityEventType.PERSONNEL_GATHER_EVENT == eventType){ + } else if (SecurityEventType.PERSONNEL_GATHER_EVENT.equals(eventType)) { //人员聚集事件处理 caseInfo1 = hikService.personGatherHandle(event, caseInfo1); - }else if(SecurityEventType.MONITORING_POINT_OFFLINE == eventType){ + } else if (SecurityEventType.MONITORING_POINT_OFFLINE.equals(eventType)) { //监控点离线事件处理 caseInfo1 = hikService.monitorPointOfflineHandle(event, caseInfo1); - }else if(SecurityEventType.DEVICE_OFFLINE == eventType){ + } else if (SecurityEventType.MONITORING_POINT_ONLINE.equals(eventType)) { + //监控点上线事件处理 + hikService.monitorPointOnlineHandle(event); + } else if (SecurityEventType.DEVICE_OFFLINE.equals(eventType)) { //装置离线事件处理 caseInfo1 = hikService.deviceOfflineHandle(event, caseInfo1); - }else if(SecurityEventType.VISITOR_REGISTER == eventType){ + } else if (SecurityEventType.DEVICE_ONLINE.equals(eventType)) { + //装置上线处理 + hikService.deviceOnlineHandle(event); + } else if (SecurityEventType.VISITOR_REGISTER.equals(eventType)) { //记录访客登记记录,添加到访客记录表 hikService.visitorRegisterHandler(event); - }else if(SecurityEventType.VISITOR_CHECKOUT == eventType){ + } else if (SecurityEventType.VISITOR_CHECKOUT.equals(eventType)) { //记录访客签离记录 hikService.visitorCheckOutHandler(event); } - if(!Objects.isNull(caseInfo1) && !StringUtils.isEmpty(caseInfo1.getHappenTime())){ + if (!Objects.isNull(caseInfo1) && !StringUtils.isEmpty(caseInfo1.getHappenTime())) { caseInfos.add(caseInfo1); } } //3、安防事件入库 - if(!caseInfoService.insertCaseInfoBatch(caseInfos)){ - log.error("安防事件批量入库异常"); + if (!CollectionUtils.isEmpty(caseInfos) && !caseInfoService.insertCaseInfoBatch(caseInfos)) { + log.error("安防事件批量入库异常!"); } // TODO: 2022/8/15 webSocket推送 + if (CollectionUtils.isEmpty(caseInfos)) { + log.info("webSocket事件推送"); + webSocket.sendAllMessage(JSONObject.toJSONString(caseInfos)); + } return; } /** + * 以图搜图,前端用于轨迹追踪 + */ + @PostMapping("/hik/search/picture") + @ResponseBody + public Object searchPictures(@RequestBody SearchPicturesRequest searchPicturesRequest) { + DateTime startDateTime = DateUtil.parse(searchPicturesRequest.getStartTime()); + DateTime endDateTime = DateUtil.parse(searchPicturesRequest.getEndTime()); + String startTime = DateUtil.format(startDateTime, "yyyy-MM-dd'T'HH:mm:ss.SSSXXX"); + String endTime = DateUtil.format(endDateTime, "yyyy-MM-dd'T'HH:mm:ss.SSSXXX"); + searchPicturesRequest.setStartTime(startTime); + searchPicturesRequest.setEndTime(endTime); + String body = JSONObject.toJSONString(searchPicturesRequest); + String resultStr = HikUtil.hikApi(HikUri.SEARCH_PICTURES, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (!"0".equals(resultJson.get("code"))) { + log.error("请求海康,以图搜图失败,海康response:{}", resultStr); + return ResponseData.error("以图搜图失败"); + } + return ResponseData.success(resultJson); + } + + + /** + * 海康事件取消订阅 + */ + @PostMapping("/hik/event/cancel") + @ResponseBody + public Object eventCancelSubscribe(@RequestBody CancelSubscribeRequest cancelSubscribeRequest) { + String body = JSONObject.toJSONString(cancelSubscribeRequest); + String resultStr = HikUtil.hikApi(HikUri.EVENT_CANCEL, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (!"0".equals(resultJson.get("code"))) { + log.error("请求海康,取消订阅失败,海康response:{}", resultStr); + return ResponseData.error("取消订阅失败"); + } + return ResponseData.success(resultJson); + } + + /** * 单个添加海康人脸分组 * api->hik单个添加人脸分组api->response->mysql */ - @PostMapping("/faceGroup/single/add") + @PostMapping("/hik/faceGroup/single/add") @ResponseBody public Object faceGroupAddition(@RequestBody FaceGroupAdditionRequest faceGroupAdditionRequest) { String body = JSONObject.toJSONString(faceGroupAdditionRequest); @@ -212,7 +282,7 @@ * 批量添加海康组织 * api->hik批量添加组织api->response */ - @PostMapping("/org/batch/add") + @PostMapping("/hik/org/batch/add") @ResponseBody public Object orgBatchAdd(@RequestBody List orgBatchAddRequest) { String body = JSONObject.toJSONString(orgBatchAddRequest); @@ -232,4 +302,62 @@ return ResponseData.error("批量添加组织失败"); } + /** + * 获取人员列表 + */ + @PostMapping("/hik/person/personList") + @ResponseBody + public Object personList() { + PersonListRequest request = new PersonListRequest(); + request.setPageNo(1); + request.setPageSize(100); + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi("/api/resource/v2/person/personList", body); + return resultStr; + } + + /** + * 获取组织列表 + */ + @PostMapping("/hik/org/orgList") + @ResponseBody + public Object orgList() { + PersonListRequest request = new PersonListRequest(); + request.setPageNo(1); + request.setPageSize(100); + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi("/api/resource/v1/org/orgList", body); + return resultStr; + } + + /** + * 查询访客权限下载记录 + */ + @PostMapping("/hik/auth/result") + @ResponseBody + public Object authResult() { + PersonListRequest request = new PersonListRequest(); + request.setPageNo(1); + request.setPageSize(100); + request.setOrderId("ba101db6246711edaea66f7939a13638"); + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi("/api/visitor/v1/auth/result", body); + return resultStr; + } + + /** + * 人脸图片获取 + */ + @PostMapping("/hik/face/picture") + @ResponseBody + public Object facePicture() { + FaceRequest request = new FaceRequest(); +// List list = new ArrayList<>(); +// list.add(""); + request.setCertificateNum("wanggong"); + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi("/api/frs/v1/face", body); + return resultStr; + } + } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/AssetInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/AssetInfoMapper.java index 4f64e83..c0684ee 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/AssetInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/AssetInfoMapper.java @@ -17,6 +17,6 @@ @Mapper public interface AssetInfoMapper extends BaseMapper { - List getAssetInfoListPage(@Param("page") Page page, AssetInfoRequest assetInfoRequest); + List getAssetInfoListPage(@Param("page") Page page, @Param("assetInfoRequest") AssetInfoRequest assetInfoRequest); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/AttendanceInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/AttendanceInfoMapper.java index f9e793e..ec87e46 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/AttendanceInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/AttendanceInfoMapper.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.statistics.AttendanceNumberDTO; import com.casic.missiles.modular.dto.statistics.AttendanceRatioDTO; import com.casic.missiles.modular.model.AttendanceInfo; import org.apache.ibatis.annotations.Mapper; @@ -17,7 +18,7 @@ */ @Mapper public interface AttendanceInfoMapper extends BaseMapper { - List getAttendanceInfoListPage(@Param("page") Page page, StaffInfoRequest attendanceInfoRequest); + List getAttendanceInfoListPage(@Param("page") Page page, @Param("attendanceInfoRequest") StaffInfoRequest attendanceInfoRequest); AttendanceInfo selectByCodeAndDate(@Param("staffCode") String staffCode); @@ -26,4 +27,8 @@ List getCountByTypeAndDateForMonth(@Param("staffType")String staffType); List getCountByTypeAndDateForYear(@Param("staffType")String staffType); + + List getCountForWeek(); + + List getCountForDay(); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java index ce94b8f..6137a7d 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java @@ -17,5 +17,5 @@ @Mapper public interface BlackInfoMapper extends BaseMapper { - List getBlackInfoListPage(@Param("page") Page page, BlackInfoRequest blackInfoRequest); + List getBlackInfoListPage(@Param("page") Page page, @Param("blackInfoRequest") BlackInfoRequest blackInfoRequest); } 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 efda6b3..50aaa6f 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 @@ -20,7 +20,7 @@ List getCaseInfoListPage(@Param("page") Page page, @Param("caseInfoRequest") CaseInfoRequest caseInfoRequest); - int updateStatusById(CaseInfoRequest caseInfoRequest); + int updateStatusById(@Param("caseInfoRequest") CaseInfoRequest caseInfoRequest); List selectByLevelAndMonth(@Param("year") String year); @@ -47,4 +47,20 @@ List selectPreWeekCountByThirtyDay(); List selectPreDayCountBySevenDay(); + + Integer selectDemobilizedCount(@Param("eventType") Number personnelDemobilizedEvent); + + List selectPreMonthCount(); + + List selectListBySevenDay(); + + List selectListByToday(); + + List selectListByToday2(); + + List selectListByToday3(); + + List selectListByType(@Param("eventType") Number eventType); + + List selectDemobilizedCountByHour(@Param("eventType") Number eventType); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/CategoryLevelMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/CategoryLevelMapper.java index 52fc714..afe1650 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/CategoryLevelMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/CategoryLevelMapper.java @@ -17,9 +17,9 @@ @Mapper public interface CategoryLevelMapper extends BaseMapper { - List getCaseCategoryLevelListPage(@Param("page") Page page, CategoryLevelRequest categoryLevelRequest); + List getCaseCategoryLevelListPage(@Param("page") Page page, @Param("categoryLevelRequest") CategoryLevelRequest categoryLevelRequest); - List getCaseCategoryLevelList(CategoryLevelRequest categoryLevelRequest); + List getCaseCategoryLevelList(@Param("categoryLevelRequest") CategoryLevelRequest categoryLevelRequest); CaseCategoryLevel getCaseCategoryLevel(@Param("categoryLevelCode") String categoryLevelCode); 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 66353b1..2555a09 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 @@ -19,7 +19,7 @@ @Mapper public interface DeviceInfoMapper extends BaseMapper { - List getDeviceInfoListPage(@Param("page") Page page, DeviceInfoRequest deviceInfoRequest); + List getDeviceInfoListPage(@Param("page") Page page, @Param("deviceInfoRequest") DeviceInfoRequest deviceInfoRequest); List getDeviceInfoList(@Param("deviceInfoRequest") DeviceInfoRequest deviceInfoRequest); @@ -27,6 +27,8 @@ DeviceInfo getByIndexCode(@Param("srcIndex") String srcIndex); + DeviceInfo getByIp(@Param("ip") String ip); + List selectIndexCodesByCodes(@Param("deviceCodes") List deviceCodes); List selectByType(@Param("devType") String devType); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java index 41dd0af..5bfaf63 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java @@ -5,6 +5,7 @@ import com.casic.missiles.modular.dto.DeviceRepairRequest; import com.casic.missiles.modular.model.DeviceRepairLog; import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; import java.util.List; @@ -16,7 +17,7 @@ @Mapper public interface DeviceRepairLogMapper extends BaseMapper { - List getDeviceRepairListPage(Page page, DeviceRepairRequest deviceRepairRequest); + List getDeviceRepairListPage(@Param("page") Page page, @Param("deviceRepairRequest")DeviceRepairRequest deviceRepairRequest); - List getDeviceRepairList(DeviceRepairRequest deviceRepairRequest); + List getDeviceRepairList(@Param("deviceRepairRequest") DeviceRepairRequest deviceRepairRequest); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java index 9035c47..4823ac1 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java @@ -18,7 +18,7 @@ @Mapper public interface FireEquipInfoMapper extends BaseMapper { - List getFireEquipInfoListPage(@Param("page") Page page, FireEquipRequest fireEquipRequest); + List getFireEquipInfoListPage(@Param("page") Page page, @Param("fireEquipRequest") FireEquipRequest fireEquipRequest); FireEquipInfo getFireEquipInfo(@Param("equipCode") String equipCode); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/GateGroupMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/GateGroupMapper.java index d8c330d..977a427 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/GateGroupMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/GateGroupMapper.java @@ -17,7 +17,7 @@ */ @Mapper public interface GateGroupMapper extends BaseMapper { - List getGateGroupListPage(@Param("page") Page page, GateGroupRequest gateGroupRequest); + List getGateGroupListPage(@Param("page") Page page, @Param("gateGroupRequest") GateGroupRequest gateGroupRequest); GateGroup getGateGroupByName(@Param("groupName") String groupName); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/HazardLevelMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/HazardLevelMapper.java index 8957780..dcf47bb 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/HazardLevelMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/HazardLevelMapper.java @@ -17,11 +17,13 @@ @Mapper public interface HazardLevelMapper extends BaseMapper { - List getCaseHazardLevelListPage(@Param("page") Page page, HazardLevelRequest hazardLevelRequest); + List getCaseHazardLevelListPage(@Param("page") Page page, @Param("hazardLevelRequest") HazardLevelRequest hazardLevelRequest); - List getCaseHazardLevelList(HazardLevelRequest hazardLevelRequest); + List getCaseHazardLevelList(@Param("hazardLevelRequest") HazardLevelRequest hazardLevelRequest); CaseHazardLevel getCaseHazardLevel(@Param("hazardLevelCode") String hazardLevelCode); List selectHazardName(); + + String selectHazardNameByCode(@Param("hazardLevelCode") String hazardLevelCode); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/HikCaseDefineMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/HikCaseDefineMapper.java index 0dc47d1..f162fef 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/HikCaseDefineMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/HikCaseDefineMapper.java @@ -12,5 +12,5 @@ */ @Mapper public interface HikCaseDefineMapper extends BaseMapper { - HikCaseDefine getHikCaseDefine(@Param("caseTypeCode") Long caseTypeCode); + HikCaseDefine getHikCaseDefine(@Param("caseTypeCode") Number caseTypeCode); } 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 f8a674c..fe5afc2 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 @@ -17,11 +17,13 @@ @Mapper public interface StaffInfoMapper extends BaseMapper { - List getStaffInfoListPage(@Param("page") Page page, StaffInfoRequest staffInfoRequest); + List getStaffInfoListPage(@Param("page") Page page, @Param("staffInfoRequest") StaffInfoRequest staffInfoRequest); StaffInfo selectByCode(@Param("staffCode") String staffCode); - List getStaffInfoList(StaffInfoRequest staffInfoRequest); + List getStaffInfoList(@Param("staffInfoRequest") StaffInfoRequest staffInfoRequest); - List selectBatchCodes(List list); + List selectBatchCodes(@Param("list") List list); + + int updateByCodeForCard(@Param("staffCode") String staffCode, @Param("cardNo") String cardNo); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitInfoMapper.java index b1217c5..6c52542 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitInfoMapper.java @@ -16,7 +16,7 @@ */ @Mapper public interface VisitInfoMapper extends BaseMapper { - List getVisitInfoListPage(@Param("page") Page page, VisitorRequest visitorRequest); + List getVisitInfoListPage(@Param("page") Page page, @Param("visitorRequest") VisitorRequest visitorRequest); VisitInfo selectByOrderId(@Param("orderId") String orderId); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitorApplyMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitorApplyMapper.java index c09f3c0..6ea55bd 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitorApplyMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitorApplyMapper.java @@ -18,7 +18,7 @@ @Mapper public interface VisitorApplyMapper extends BaseMapper { - List getVisitorApplyListPage(@Param("page") Page page, VisitorApplyRequest visitorApplyRequest); + List getVisitorApplyListPage(@Param("page") Page page, @Param("visitorApplyRequest") VisitorApplyRequest visitorApplyRequest); List selectByVisitReason(); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/AttendanceInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/AttendanceInfoMapper.xml index b2ece71..f8bdd6e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/AttendanceInfoMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/AttendanceInfoMapper.xml @@ -43,7 +43,8 @@ and staff_type = #{staffType} - and YEARWEEK(date_format(atte_date, '%Y-%m-%d'), 1) = YEARWEEK(now(),1); + AND DATE_SUB(CURDATE(), INTERVAL 7 DAY) <= DATE(atte_date) + GROUP BY DATE_FORMAT(atte_date, '%Y-%m-%d') @@ -69,4 +70,20 @@ GROUP BY DATE_FORMAT(atte_date, '%Y-%m') + + + \ No newline at end of file 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 2b6953f..06ec0a8 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 @@ -28,7 +28,9 @@ @@ -87,7 +89,8 @@ SELECT hazard_level_code as levelCode, count(id) as quantity FROM bus_case_info WHERE hazard_level_code is not null - AND DATE_SUB(CURDATE(), INTERVAL 7 DAY) <= date(happen_time); + AND is_key_area = 1 + AND DATE_SUB(CURDATE(), INTERVAL 7 DAY) <= date(happen_time) GROUP BY hazard_level_code @@ -95,7 +98,8 @@ SELECT hazard_level_code as levelCode, count(id) as quantity FROM bus_case_info WHERE hazard_level_code is not null - AND DATE_SUB(CURDATE(), INTERVAL 30 DAY) <= date(happen_time); + AND is_key_area = 1 + AND DATE_SUB(CURDATE(), INTERVAL 30 DAY) <= date(happen_time) GROUP BY hazard_level_code @@ -122,4 +126,71 @@ AND hazard_level_code is not null GROUP BY DATE_FORMAT(happen_time,'%Y-%m-%d') + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/CategoryLevelMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/CategoryLevelMapper.xml index 4670b1f..1d25cbd 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/CategoryLevelMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/CategoryLevelMapper.xml @@ -20,11 +20,11 @@ SELECT * FROM bus_case_category_level WHERE 1=1 - - and code = #{code} + + and code = #{categoryLevelRequest.code} - - and name = #{name} + + and name = #{categoryLevelRequest.name} ORDER by create_time DESC 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 9b66fd8..bfd84b7 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 @@ -98,4 +98,10 @@ #{item} + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceRepairLogMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceRepairLogMapper.xml index 078ed3c..cf1a481 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceRepairLogMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceRepairLogMapper.xml @@ -22,14 +22,14 @@ SELECT * FROM bus_device_repair_log WHERE 1=1 - - and device_code = #{devCode} + + and device_code = #{deviceRepairRequest.devCode} - - and device_name = #{devName} + + and device_name = #{deviceRepairRequest.devName} - - and DATE_FORMAT(create_time,"%y%m%d") = DATE_FORMAT(#{createTime},"%y%m%d") + + and DATE_FORMAT(create_time,"%y%m%d") = DATE_FORMAT(#{deviceRepairRequest.createTime},"%y%m%d") ORDER by create_time DESC diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/HazardLevelMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/HazardLevelMapper.xml index f16f2b9..458322b 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/HazardLevelMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/HazardLevelMapper.xml @@ -20,11 +20,11 @@ SELECT * FROM bus_case_hazard_level WHERE 1=1 - - and code = #{code} + + and code = #{hazardLevelRequest.code} - - and name = #{name} + + and name = #{hazardLevelRequest.name} ORDER by create_time DESC @@ -42,4 +42,10 @@ SELECT name FROM bus_case_hazard_level + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/BlackListController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/BlackListController.java index a27f9f8..0c06661 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/BlackListController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/BlackListController.java @@ -1,13 +1,18 @@ package com.casic.missiles.modular.controller; +import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.base.controller.ExportController; import com.casic.missiles.core.page.PageFactory; import com.casic.missiles.model.response.ResponseData; import com.casic.missiles.modular.dto.BlackInfoRequest; +import com.casic.missiles.modular.dto.BlackPictureRequest; +import com.casic.missiles.modular.dto.hik.PersonInfoRequest; +import com.casic.missiles.modular.enums.HikUri; import com.casic.missiles.modular.enums.OperateTypeEnum; import com.casic.missiles.modular.model.BlackInfo; import com.casic.missiles.modular.service.BlackInfoService; +import com.casic.missiles.modular.util.HikUtil; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; @@ -56,4 +61,22 @@ return null; } + /** + * 黑名单人员照片 + */ + @PostMapping("/personPicture") + @ResponseBody + public Object personPicture(@RequestBody BlackPictureRequest blackPictureRequest){ + //获取照片 + String picUri = blackPictureRequest.getPicUri(); + String serverIndexCode = blackPictureRequest.getServerIndexCode(); + PersonInfoRequest picRequest = new PersonInfoRequest(); + picRequest.setPicUri(picUri); + picRequest.setServerIndexCode(serverIndexCode); + String reBody = JSONObject.toJSONString(picRequest); + //重定向地址获取 + String url = HikUtil.hikApiFor302(HikUri.PERSON_PICTURE, reBody); + return ResponseData.success(url); + } + } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/DeviceController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/DeviceController.java index e1c4eba..666bbee 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/DeviceController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/DeviceController.java @@ -107,7 +107,7 @@ } /** - * 设备维修管理查询(分页),需计算MTTR=总维修时间/故障次数 + * 设备状态计算与评判/设备维修管理查询(分页),需计算MTTR=总维修时间/故障次数 */ @PostMapping("/repair/listPage") @ResponseBody @@ -211,7 +211,7 @@ //需根据设备编号获取到对应的门禁点唯一标识 doorControlRequest.setDoorIndexCodes(indexCodes); doorControlRequest.setControlType(Integer.valueOf(gateGroupDTO.getStatus())); - String body = JSONObject.toJSONString(deviceCodes); + String body = JSONObject.toJSONString(doorControlRequest); String resultStr = HikUtil.hikApi(HikUri.DOOR_CONTROL, body); JSONObject resultJson = (JSONObject)JSONObject.parse(resultStr); if (!"0".equals(resultJson.get("code"))) { diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/StaffController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/StaffController.java index b58ccab..704093c 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/StaffController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/StaffController.java @@ -2,15 +2,21 @@ import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.util.StrUtil; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.base.controller.ExportController; import com.casic.missiles.core.page.PageFactory; import com.casic.missiles.model.response.ErrorResponseData; import com.casic.missiles.model.response.ResponseData; import com.casic.missiles.modular.dto.StaffInfoRequest; +import com.casic.missiles.modular.dto.hik.PersonInfoRequest; +import com.casic.missiles.modular.dto.hik.StaffCardRequest; +import com.casic.missiles.modular.enums.HikUri; import com.casic.missiles.modular.enums.OperateTypeEnum; import com.casic.missiles.modular.model.StaffInfo; import com.casic.missiles.modular.service.StaffInfoService; +import com.casic.missiles.modular.util.HikUtil; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; @@ -110,4 +116,60 @@ } return ResponseData.success(); } + + /** + * 批量开卡,添加人员之后调用,若在一个接口中添加人员成功开卡失败则第二次添加时会有问题 + */ + @PostMapping("/cardBinding") + @ResponseBody + public Object cardBinding(@RequestBody StaffCardRequest staffCardRequest) { + String body = JSONObject.toJSONString(staffCardRequest); + String resultStr = HikUtil.hikApi(HikUri.CARD_BINDING, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (!"0".equals(resultJson.get("code"))) { + log.error("请求海康,批量开卡失败,海康response:{}", resultStr); + return ResponseData.error("批量开卡失败"); + } + //保存卡号 + if(staffInfoService.saveCardInfo(staffCardRequest) > 0){ + return ResponseData.success(); + } + return ResponseData.error("批量开卡失败"); + } + + /** + * 获取员工照片,海康存储 + */ + @PostMapping("/personPicture/{staffCode}") + @ResponseBody + public Object personPicture(@PathVariable("staffCode") String staffCode){ + //获取员工详细信息,含图片服务器、uri + PersonInfoRequest request = new PersonInfoRequest(); + List list = new ArrayList<>(); + list.add(staffCode); + request.setParamName("personId"); + request.setParamValue(list); + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi(HikUri.PERSON_INFO, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (!"0".equals(resultJson.get("code"))) { + log.error("请求海康,根据人员唯一字段获取人员详细信息失败,海康response:{}", resultStr); + return ResponseData.error("获取员工照片失败"); + } + //获取照片 + JSONObject data = (JSONObject) resultJson.get("data"); + JSONArray dataArray = (JSONArray) data.get("list"); + JSONObject jsonObject = (JSONObject) dataArray.get(0); + JSONArray personPhoto = (JSONArray) jsonObject.get("personPhoto"); + JSONObject photo = (JSONObject) personPhoto.get(0); + String picUri = photo.getString("picUri"); + String serverIndexCode = photo.getString("serverIndexCode"); + PersonInfoRequest picRequest = new PersonInfoRequest(); + picRequest.setPicUri(picUri); + picRequest.setServerIndexCode(serverIndexCode); + String reBody = JSONObject.toJSONString(picRequest); + //重定向地址获取 + String url = HikUtil.hikApiFor302(HikUri.PERSON_PICTURE, reBody); + return ResponseData.success(url); + } } 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 4a07dd9..7b1dcf6 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 @@ -16,6 +16,7 @@ import com.casic.missiles.modular.redis.key.CacheKeys; import com.casic.missiles.modular.service.CockpitService; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.util.CollectionUtils; import org.springframework.web.bind.annotation.*; @@ -24,10 +25,7 @@ import java.text.NumberFormat; import java.time.LocalDateTime; import java.time.temporal.ChronoUnit; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.util.*; import java.util.stream.Collectors; /** @@ -73,6 +71,9 @@ private StatisticNumberMapper numberMapper; @Autowired + private HazardLevelMapper hazardLevelMapper; + + @Autowired private AccessGroupConfig accessGroupConfig; /** @@ -104,8 +105,24 @@ public Object buildingNumberPerHour(){ //当天按小时分组的人数 List list = numberMapper.selectListByTime(); - Map> collect = list.stream().collect(Collectors.groupingBy(BuildingNumberDTO::getStatisticPosition)); - return ResponseData.success(collect); + Map> collect = list.stream().collect(Collectors.groupingBy(BuildingNumberDTO::getStatisticTime)); + //定时任务中已将每小时三栋楼人数存到数据库 + //将一期主楼和录制楼人数合并,二期单算 + List> resultList = new ArrayList<>(); + collect.keySet().forEach(key -> { + List buildingNumberDTOS = collect.get(key); + BuildingNumberDTO mainBuildingOne = buildingNumberDTOS.get(0); + BuildingNumberDTO mainBuildingTwo = buildingNumberDTOS.get(1); + BuildingNumberDTO recordingBuilding = buildingNumberDTOS.get(2); + HashMap resultMap = new HashMap<>(); + Integer oneQuantity = Integer.valueOf(mainBuildingOne.getStatisticQuantity()); + Integer recordingQuantity = Integer.valueOf(recordingBuilding.getStatisticQuantity()); + resultMap.put("staticTime", mainBuildingOne.getStatisticTime()); + resultMap.put(mainBuildingOne.getStatisticPositionName()+"、"+recordingBuilding.getStatisticPositionName(), String.valueOf(oneQuantity+recordingQuantity)); + resultMap.put(mainBuildingTwo.getStatisticPositionName(), mainBuildingTwo.getStatisticQuantity()); + resultList.add(resultMap); + }); + return ResponseData.success(resultList); } /** @@ -151,12 +168,11 @@ public Object securityNumber() { QueryWrapper wrapper = new QueryWrapper<>(); wrapper.eq("staff_type", 2); + // TODO: 2022/9/2 后续使用产品确定的每天出勤的安保人员的数量 Integer total = staffInfoMapper.selectCount(wrapper); - //当日离岗事件个数 - QueryWrapper wrapper1 = new QueryWrapper<>(); - wrapper1.eq("hik_event_type", SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); - wrapper1.apply("date_format(now(),'%Y-%m-%d') = date_format(happen_time,'%Y-%m-%d')"); - Integer leave = caseInfoMapper.selectCount(wrapper1); + //当日离岗事件按设备去重后的个数 + // TODO: 2022/9/2 目前相当于24小时内的计算,之后看需要可改成自定义小时数计算离岗率,即离岗+6小时内仅一次离岗则恢复为100%,多次则累加离岗次数计算离岗率 + Integer leave = caseInfoMapper.selectDemobilizedCount(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); NumberFormat numberFormat = NumberFormat.getInstance(); // 设置精确到小数点后2位 numberFormat.setMaximumFractionDigits(2); @@ -179,7 +195,6 @@ @ResponseBody public Object visitorApplyDetail() { List reasonGroup = applyMapper.selectByVisitReason(); - HashMap resultMap = new HashMap<>(); NumberFormat numberFormat = NumberFormat.getInstance(); // 设置精确到小数点后2位 numberFormat.setMaximumFractionDigits(2); @@ -187,12 +202,17 @@ if(0 == sum){ return ResponseData.success(); } + List resultList = new ArrayList<>(); reasonGroup.forEach(group -> { String reasonName = dictService.getDictNameByCode(SecurityEventDict.VISIT_REASON, group.getVisitReason()); String result = numberFormat.format((float) group.getQuantity() / (float) sum * 100); - resultMap.put(reasonName, result+"%"); + ApplyReasonGroupDTO applyReasonGroupDTO = new ApplyReasonGroupDTO(); + applyReasonGroupDTO.setQuantity(group.getQuantity()); + applyReasonGroupDTO.setVisitReason(reasonName); + applyReasonGroupDTO.setRatio(result+"%"); + resultList.add(applyReasonGroupDTO); }); - return ResponseData.success(resultMap); + return ResponseData.success(resultList); } /** @@ -247,6 +267,32 @@ } /** + * 机动力量实时在岗率,在岗人数除以总应在岗人数,用离岗+6小时内恢复为100%,6小时外再计算 + */ + @GetMapping("/staff/beOnDutyRatio") + @ResponseBody + public Object beOnDutyRatio() { + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("staff_type", 2); + // TODO: 2022/9/2 后续使用产品确定的每天出勤的安保人员的数量 + Integer total = staffInfoMapper.selectCount(wrapper); + if(0 == total){ + return ResponseData.success(null); + } + //当日离岗事件按设备去重后的个数 + // TODO: 2022/9/2 目前相当于24小时内的计算,之后看需要可改成自定义小时数计算离岗率,即离岗+6小时内仅一次离岗则恢复为100%,多次则累加离岗次数计算离岗率 + List onDutyRatioDTOS = caseInfoMapper.selectDemobilizedCountByHour(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); + onDutyRatioDTOS.forEach(dto -> { + NumberFormat numberFormat = NumberFormat.getInstance(); + // 设置精确到小数点后2位 + numberFormat.setMaximumFractionDigits(2); + String result = numberFormat.format(100 - Float.valueOf(dto.getQuantity()) / (float) total * 100); + dto.setRatio(result+"%"); + }); + return ResponseData.success(onDutyRatioDTOS); + } + + /** * 闸机速通门统计-设备状态分组计算数量,devType传闸机字典key * 视频频监控摄像机统计-设备状态分组计算数量,devType传摄像头字典key */ @@ -262,12 +308,17 @@ if(sum <= 0){ return ResponseData.error("无该类设备信息"); } + List resultList = new ArrayList<>(); gateStatusGroup.forEach(group -> { String devStatus = dictService.getDictNameByCode(SecurityEventDict.DEVICE_STATUS, group.getStatus()); String result = numberFormat.format((float) group.getQuantity() / (float) sum * 100); - resultMap.put(devStatus, result+"%"); + GateStatusGroupResponse gateStatusGroupResponse = new GateStatusGroupResponse(); + gateStatusGroupResponse.setStatus(devStatus); + gateStatusGroupResponse.setRatio(result+"%"); + resultList.add(gateStatusGroupResponse); }); - resultMap.put("总", sum); + resultMap.put("total", sum); + resultMap.put("list", resultList); return ResponseData.success(resultMap); } @@ -282,17 +333,38 @@ String position = securityScoreDTO.getPosition(); List caseInfos = caseInfoMapper.selectByPosition(position); //查询各危险级别权重、各类别权重,放入map,避免循环中多次查数据库 - + HashMap hazardScoreMap = new HashMap<>(); + List caseHazardLevelList = hazardLevelMapper.getCaseHazardLevelList(null); + caseHazardLevelList.forEach(hazardLevel -> { + hazardScoreMap.put(hazardLevel.getCode(), hazardLevel.getWeight()); + }); + HashMap categoryScoreMap = new HashMap<>(); + List categoryLevelList = categoryLevelMapper.getCaseCategoryLevelList(null); + categoryLevelList.forEach(categoryLevel -> { + categoryScoreMap.put(categoryLevel.getCode(), categoryLevel.getWeight()); + }); + //事件按楼层分组,计算 List securityScoreDTOs = new ArrayList<>(); caseInfos.forEach(caseInfo -> { SecurityScoreDTO securityScoreDTO1 = new SecurityScoreDTO(); + securityScoreDTO1.setPosition(caseInfo.getPosition()); securityScoreDTO1.setArea(caseInfo.getArea()); - // TODO: 2022/8/4 楼层评分计算根据产品定义调整 -// caseInfo.get -// securityScoreDTO1.setScore(); + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); + Double score = 100 - Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + securityScoreDTO1.setScore(score); + securityScoreDTOs.add(securityScoreDTO1); }); - - return null; + 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); + }); + return ResponseData.success(securityScoreDTOs); } /** @@ -303,9 +375,13 @@ public Object SecurityFrequency(@RequestBody SecurityFrequencyDTO securityFrequencyDTO) { String year = securityFrequencyDTO.getYear(); String month = securityFrequencyDTO.getMonth(); - Integer quantity = caseInfoMapper.selectCountByMonth(year, month); - securityFrequencyDTO.setQuantity(quantity); - return ResponseData.success(securityFrequencyDTO); + if(!StringUtils.isEmpty(year) && StringUtils.isEmpty(month)){ + Integer quantity = caseInfoMapper.selectCountByMonth(year, month); + securityFrequencyDTO.setQuantity(quantity); + return ResponseData.success(securityFrequencyDTO); + } + List list = caseInfoMapper.selectPreMonthCount(); + return ResponseData.success(list); } } 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 ae4d770..f4f075c 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 @@ -1,20 +1,25 @@ package com.casic.missiles.modular.controller.cockpit; +import cn.hutool.core.date.DateUnit; import cn.hutool.core.date.DateUtil; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.casic.missiles.model.response.ResponseData; -import com.casic.missiles.modular.dao.AttendanceInfoMapper; -import com.casic.missiles.modular.dao.CaseInfoMapper; -import com.casic.missiles.modular.dao.HazardLevelMapper; -import com.casic.missiles.modular.dao.StaffInfoMapper; +import com.casic.missiles.modular.dao.*; +import com.casic.missiles.modular.dto.DeviceRepairLogDTO; +import com.casic.missiles.modular.dto.DeviceRepairRequest; import com.casic.missiles.modular.dto.statistics.*; +import com.casic.missiles.modular.enums.SecurityEventType; +import com.casic.missiles.modular.model.CaseCategoryLevel; import com.casic.missiles.modular.model.CaseHazardLevel; +import com.casic.missiles.modular.model.CaseInfo; import com.casic.missiles.modular.model.StaffInfo; +import com.casic.missiles.modular.service.DeviceInfoService; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.util.CollectionUtils; import org.springframework.web.bind.annotation.*; +import java.math.BigDecimal; import java.text.NumberFormat; import java.util.*; import java.util.stream.Collectors; @@ -40,6 +45,12 @@ @Autowired private HazardLevelMapper hazardLevelMapper; + @Autowired + private CategoryLevelMapper categoryLevelMapper; + + @Autowired + private DeviceInfoService deviceInfoService; + /** * 安防事件时域频次统计,每月的每天安防事件个数(原方案) * 月维度:展示每个月的每天的数据 @@ -89,15 +100,17 @@ List monthList = caseInfoMapper.selectPreMonthCountByYear(year); Map> collect = monthList.stream().collect(Collectors.groupingBy(PreMonthOrWeekCaseDTO::getHazardLevelCode)); HashMap strAvgMap = new HashMap<>(); + List resultList = new ArrayList<>(); for (String key : collect.keySet()) { List preMonthOrWeekCaseDTOS = collect.get(key); int sum = preMonthOrWeekCaseDTOS.stream().mapToInt(PreMonthOrWeekCaseDTO::getQuantity).sum(); //若年份是本年,则使用个安防级别数量/当前月份数 //若不是本年,除数为12 MonthAndWeekDTO monthAndWeekDTO = new MonthAndWeekDTO(); + String hazardName = hazardLevelMapper.selectHazardNameByCode(key); + monthAndWeekDTO.setLevelName(hazardName); if(year.equals(String.valueOf(DateUtil.thisYear()))){ monthAndWeekDTO.setMonthQuantity(sum / DateUtil.thisMonth()); -// monthAndWeekDTO.setLevelName(); strAvgMap.put(key, monthAndWeekDTO); }else{ monthAndWeekDTO.setMonthQuantity(sum / 12); @@ -113,27 +126,37 @@ if(year.equals(String.valueOf(DateUtil.thisYear()))){ if(!Objects.isNull(strAvgMap.get(key))){ MonthAndWeekDTO monthAndWeekDTO = strAvgMap.get(key); + String hazardName = hazardLevelMapper.selectHazardNameByCode(key); + monthAndWeekDTO.setLevelName(hazardName); monthAndWeekDTO.setWeekQuantity(sum / DateUtil.thisWeekOfYear()); strAvgMap.put(key, monthAndWeekDTO); }else{ MonthAndWeekDTO monthAndWeekDTO = new MonthAndWeekDTO(); + String hazardName = hazardLevelMapper.selectHazardNameByCode(key); + monthAndWeekDTO.setLevelName(hazardName); monthAndWeekDTO.setWeekQuantity(sum / DateUtil.thisWeekOfYear()); strAvgMap.put(key, monthAndWeekDTO); } }else{ if(!Objects.isNull(strAvgMap.get(key))){ MonthAndWeekDTO monthAndWeekDTO = strAvgMap.get(key); + String hazardName = hazardLevelMapper.selectHazardNameByCode(key); + monthAndWeekDTO.setLevelName(hazardName); monthAndWeekDTO.setWeekQuantity(sum / 52); strAvgMap.put(key, monthAndWeekDTO); }else{ MonthAndWeekDTO monthAndWeekDTO = new MonthAndWeekDTO(); + String hazardName = hazardLevelMapper.selectHazardNameByCode(key); + monthAndWeekDTO.setLevelName(hazardName); monthAndWeekDTO.setWeekQuantity(sum / 52); strAvgMap.put(key, monthAndWeekDTO); } } } - avgMonthAndWeekGroupDTO.setMap(strAvgMap); - return ResponseData.success(avgMonthAndWeekGroupDTO); + strAvgMap.keySet().forEach(key -> { + resultList.add(strAvgMap.get(key)); + }); + return ResponseData.success(resultList); } /** @@ -181,12 +204,178 @@ } /** - * 员工考勤人数变化,功能待定 + * 员工考勤人数变化,统计当天(横坐标为时)及近7天(横坐标为天)的考勤人数变化,只要发生一次考勤识别,次数的基数就正常增加(没有上班下班区分) */ + @PostMapping("/staff/attendanceNumber/{dimension}") + @ResponseBody + public Object attendanceNumber(@PathVariable("dimension") String dimension) { + List attendanceNumberDTOs = null; + List> resultList = new ArrayList<>(); + if("week".equals(dimension)){ + //近7天数据按天分组统计 + attendanceNumberDTOs = attendanceInfoMapper.getCountForWeek(); + }else if("day".equals(dimension)) { + //今天数据按小时分组统计 + attendanceNumberDTOs = attendanceInfoMapper.getCountForDay(); + } + if(CollectionUtils.isEmpty(attendanceNumberDTOs)){ + return ResponseData.error("该查询条件下,无员工出勤数据!"); + } + Map> collect = attendanceNumberDTOs.stream().collect(Collectors.groupingBy(AttendanceNumberDTO::getDate)); + collect.keySet().forEach(key -> { + List attendanceNumberDTOS = collect.get(key); + AttendanceNumberDTO attendanceNumberDTO = attendanceNumberDTOS.get(0); + AttendanceNumberDTO attendanceNumberDTO2 = attendanceNumberDTOS.get(1); + Map resultMap = new HashMap<>(); + resultMap.put(attendanceNumberDTO.getStaffType(), attendanceNumberDTO.getQuantity()); + resultMap.put(attendanceNumberDTO2.getStaffType(), attendanceNumberDTO2.getQuantity()); + resultMap.put("staticTime", attendanceNumberDTO.getDate()); + resultList.add(resultMap); + }); + return ResponseData.success(resultList); + } /** - * 近30天/近一周安保人员到岗排行 + * 早晚高峰区域安防评估 */ + @PostMapping("/security/assessment/{dimension}") + @ResponseBody + public Object securityAssessment(@PathVariable("dimension") String dimension) { + //查询各危险级别权重、各类别权重,放入map,避免循环中多次查数据库 + HashMap hazardScoreMap = new HashMap<>(); + List caseHazardLevelList = hazardLevelMapper.getCaseHazardLevelList(null); + caseHazardLevelList.forEach(hazardLevel -> { + hazardScoreMap.put(hazardLevel.getCode(), hazardLevel.getWeight()); + }); + HashMap categoryScoreMap = new HashMap<>(); + List categoryLevelList = categoryLevelMapper.getCaseCategoryLevelList(null); + categoryLevelList.forEach(categoryLevel -> { + categoryScoreMap.put(categoryLevel.getCode(), categoryLevel.getWeight()); + }); + HashMap hashMap = new HashMap<>(); + if("week".equals(dimension)){ + //近7天早晚高峰数据 + List caseInfos = caseInfoMapper.selectListBySevenDay(); + //按时间(天)进行分组 + caseInfos.forEach(caseInfo -> { + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); + Double score = Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + String[] array = caseInfo.getHappenTime().split(" "); + String dayTime = array[0]; + BigDecimal preScore; + if(hashMap.containsKey(dayTime)){ + Double aDouble = hashMap.get(dayTime); + preScore = new BigDecimal(aDouble.toString()); + + }else{ + preScore = new BigDecimal("100.0"); + } + BigDecimal nowScore = new BigDecimal(score.toString()); + hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); + }); + return ResponseData.success(hashMap); + }else if("day".equals(dimension)) { + //今天数据按小时分组统计 + List caseInfos = caseInfoMapper.selectListByToday(); + caseInfos.forEach(caseInfo -> { + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); + Double score = Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + String[] array = caseInfo.getHappenTime().split(":"); + String dayTime = array[0]; + BigDecimal preScore; + if(hashMap.containsKey(dayTime)){ + Double aDouble = hashMap.get(dayTime); + preScore = new BigDecimal(aDouble.toString()); + + }else{ + preScore = new BigDecimal("100.0"); + } + BigDecimal nowScore = new BigDecimal(score.toString()); + hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); + }); + return ResponseData.success(hashMap); + } + return null; + } + + /** + * 重点区域安防事态评估,统计重点区域6:00-23:00按小时分组数据 + */ + @GetMapping("/security/keyAreaStatistic") + @ResponseBody + public Object keyAreaStatistic() { + //查询各危险级别权重、各类别权重,放入map,避免循环中多次查数据库 + HashMap hazardScoreMap = new HashMap<>(); + List caseHazardLevelList = hazardLevelMapper.getCaseHazardLevelList(null); + caseHazardLevelList.forEach(hazardLevel -> { + hazardScoreMap.put(hazardLevel.getCode(), hazardLevel.getWeight()); + }); + HashMap categoryScoreMap = new HashMap<>(); + List categoryLevelList = categoryLevelMapper.getCaseCategoryLevelList(null); + categoryLevelList.forEach(categoryLevel -> { + categoryScoreMap.put(categoryLevel.getCode(), categoryLevel.getWeight()); + }); + HashMap hashMap = new HashMap<>(); + //今天数据按小时分组统计 + List caseInfos = caseInfoMapper.selectListByToday2(); + caseInfos.forEach(caseInfo -> { + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); + Double score = Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + String[] array = caseInfo.getHappenTime().split(":"); + String dayTime = array[0]; + BigDecimal preScore; + if(hashMap.containsKey(dayTime)){ + Double aDouble = hashMap.get(dayTime); + preScore = new BigDecimal(aDouble.toString()); + + }else{ + preScore = new BigDecimal("100.0"); + } + BigDecimal nowScore = new BigDecimal(score.toString()); + hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); + }); + return ResponseData.success(hashMap); + } + + /** + * 安防机动支援力量调配响应评估,根据事件已解决状态及已解决时间-发送时间,按时间(小时)分组统计 + */ + @GetMapping("/security/responseAssess") + @ResponseBody + public Object responseAssess() { + //查询各危险级别权重、各类别权重,放入map,避免循环中多次查数据库 + HashMap hazardScoreMap = new HashMap<>(); + List caseHazardLevelList = hazardLevelMapper.getCaseHazardLevelList(null); + caseHazardLevelList.forEach(hazardLevel -> { + hazardScoreMap.put(hazardLevel.getCode(), hazardLevel.getWeight()); + }); + HashMap hashMap = new HashMap<>(); + //今天数据按小时分组统计 + List caseInfos = caseInfoMapper.selectListByToday3(); + caseInfos.forEach(caseInfo -> { + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + //扣分=事件级别权重*未解决小时数 + Date updateTime = DateUtil.parse(caseInfo.getUpdateTime()); + Date happenTime = DateUtil.parse(caseInfo.getHappenTime()); + long between = DateUtil.between(updateTime, happenTime, DateUnit.HOUR); + Double score = Double.valueOf(hazardWeight)*between; + String[] array = caseInfo.getHappenTime().split(":"); + String dayTime = array[0]; + BigDecimal preScore; + if(hashMap.containsKey(dayTime)){ + Double aDouble = hashMap.get(dayTime); + preScore = new BigDecimal(aDouble.toString()); + }else{ + preScore = new BigDecimal("100.0"); + } + BigDecimal nowScore = new BigDecimal(score.toString()); + hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); + }); + return ResponseData.success(hashMap); + } /** * 重点区域威胁事件类型统计,优先级2,统计近7天和近30天 @@ -224,7 +413,34 @@ } /** - * 设备状态计算系数和评判,优先级3,需确认设备恢复时间是否可以获取 + * 近30天/近一周安保人员到岗排行 */ + + /** + * 安保等级评估,发生离岗事件减1分 + */ + @GetMapping("/security/levelAssess") + @ResponseBody + public Object securityLevelAssess() { + //今天数据按小时分组统计 + List resultList = caseInfoMapper.selectListByType(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); + resultList.forEach(result -> { + BigDecimal deScore = new BigDecimal(result.getQuantity()); + BigDecimal preScore = new BigDecimal("100.0"); + result.setScore(preScore.subtract(deScore).doubleValue()); + }); + return ResponseData.success(resultList); + } + + /** + * 设备状态计算系数和评判,即设备维修管理查询(不分页) + */ + @PostMapping("/device/repairList") + @ResponseBody + public Object repairList(@RequestBody DeviceRepairRequest deviceRepairRequest) { + List deviceRepairLogDTOS = deviceInfoService.deviceRepairListPage(deviceRepairRequest); + return ResponseData.success(deviceRepairLogDTOS); + } + } 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 fbf8ab6..c71a15a 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 @@ -1,13 +1,12 @@ package com.casic.missiles.modular.controller.hik; +import cn.hutool.core.date.DateTime; +import cn.hutool.core.date.DateUtil; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.casic.missiles.model.response.ResponseData; import com.casic.missiles.modular.dao.HikFaceGroupInfoMapper; -import com.casic.missiles.modular.dto.hik.EventSubscribeRequest; -import com.casic.missiles.modular.dto.hik.FaceGroupAdditionRequest; -import com.casic.missiles.modular.dto.hik.HikRecvEvent; -import com.casic.missiles.modular.dto.hik.OrgBatchAdd; +import com.casic.missiles.modular.dto.hik.*; import com.casic.missiles.modular.enums.HikUri; import com.casic.missiles.modular.enums.SecurityEventType; import com.casic.missiles.modular.model.CaseInfo; @@ -18,16 +17,20 @@ import com.casic.missiles.modular.util.CaseInfoFactoryUtil; import com.casic.missiles.modular.util.HikUtil; import com.casic.missiles.modular.util.ThreadPoolUtil; +import com.casic.missiles.modular.util.WebSocket; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; -import org.springframework.web.bind.annotation.*; +import org.springframework.util.CollectionUtils; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.RestController; -import java.net.InetAddress; -import java.net.UnknownHostException; import java.util.ArrayList; +import java.util.Iterator; import java.util.List; import java.util.Objects; @@ -38,7 +41,6 @@ */ @Slf4j @RestController -@RequestMapping("/hik") public class HikController { @Autowired @@ -53,28 +55,37 @@ @Autowired private HikService hikService; + @Autowired + private HikFaceGroupInfoMapper hikFaceGroupInfoMapper; + + @Autowired + private WebSocket webSocket; + @Value("${server.port}") private int serverPort; - @Autowired - private HikFaceGroupInfoMapper hikFaceGroupInfoMapper; /** * 海康事件订阅 */ - @PostMapping("/event/subscribe") + @PostMapping("/hik/event/subscribe") @ResponseBody - public Object eventSubscribe() throws UnknownHostException { + public Object eventSubscribe() { EventSubscribeRequest eventSubscribeRequest = new EventSubscribeRequest(); ArrayList list = new ArrayList<>(); list.add(SecurityEventType.DEVICE_OFFLINE); + list.add(SecurityEventType.DEVICE_ONLINE); list.add(SecurityEventType.KEY_PERSONNEL_IDENTIFY_EVENT); list.add(SecurityEventType.MONITORING_POINT_OFFLINE); + list.add(SecurityEventType.MONITORING_POINT_ONLINE); list.add(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); list.add(SecurityEventType.PERSONNEL_GATHER_EVENT); - InetAddress localHost = InetAddress.getLocalHost(); + list.add(SecurityEventType.VISITOR_REGISTER); + list.add(SecurityEventType.VISITOR_CHECKOUT); + list.add(SecurityEventType.HIGH_ALTITUDE_PARABOLIC); +// InetAddress localHost = InetAddress.getLocalHost(); eventSubscribeRequest.setEventTypes(list); - eventSubscribeRequest.setEventDest("https://" + localHost + ":" + serverPort + "/eventRcv"); + eventSubscribeRequest.setEventDest("http://" + "192.168.10.6" + ":" + serverPort + "/eventRcv"); //订阅类型,0-订阅原始事件,1-联动事件,2-原始事件和联动事件,不填使用默认值0 eventSubscribeRequest.setSubType(0); /** @@ -92,19 +103,25 @@ } /** + * 查询事件订阅信息 + */ + @PostMapping("/hik/event/query") + @ResponseBody + public Object eventQuery() { + String result = HikUtil.hikApi(HikUri.EVENT_INFO, ""); + return result; + } + + /** * 海康事件接收 */ @PostMapping("/eventRcv") @ResponseBody public Object eventRcv(@RequestBody HikRecvEvent hikRecvEvent) { //1、接收所需事件类型 - Long eventType = hikRecvEvent.getEventType(); + Number eventType = hikRecvEvent.getEventType(); log.info("接收到安防事件类型为:{}", eventType); CaseInfo caseInfo = caseInfoFactoryUtil.getCaseInfo(eventType); - //接收到不关心事件直接返回 - if(Objects.isNull(caseInfo)){ - return ResponseData.success(); - } //2、不同事件不同处理,caseInfoFactoryUtil已设置好事件基础定义信息 // 再为事件添加状态、设备编码、设备名称、位置、区域、时间 // 异步处理事件 @@ -114,19 +131,23 @@ caseHandle(hikRecvEvent, eventType, caseInfo); } })); +// caseHandle(hikRecvEvent, eventType, caseInfo); - return null; + return ResponseData.success(); } - private void caseHandle(HikRecvEvent hikRecvEvent, Long eventType, CaseInfo caseInfo) { + private void caseHandle(HikRecvEvent hikRecvEvent, Number eventType, CaseInfo caseInfo) { JSONArray eventArray = hikRecvEvent.getEventArray(); List caseInfos = new ArrayList<>(); - while (eventArray.stream().iterator().hasNext()) { + Iterator iterator = eventArray.iterator(); + while (iterator.hasNext()) { CaseInfo caseInfo1 = new CaseInfo(); - BeanUtils.copyProperties(caseInfo, caseInfo1); - JSONObject event = (JSONObject) eventArray.stream().iterator().next(); + if(!Objects.isNull(caseInfo)){ + BeanUtils.copyProperties(caseInfo, caseInfo1); + } + JSONObject event = (JSONObject) iterator.next(); //5种事件进行不同处理 - if(SecurityEventType.KEY_PERSONNEL_IDENTIFY_EVENT == eventType){ + if (SecurityEventType.KEY_PERSONNEL_IDENTIFY_EVENT.equals(eventType)) { //判断所属人脸分组 JSONObject data = (JSONObject) event.get("data"); JSONObject faceRecognitionResult = (JSONObject) data.get("faceRecognitionResult"); @@ -142,52 +163,101 @@ if (faceGroupCode.equals(blackListGroup.getFaceGroupCode())) { //黑名单分组处理 caseInfo1 = hikService.blackListHandle(event, caseInfo1); - }else if(faceGroupCode.equals(propertyPersonnelGroup.getFaceGroupCode())){ + } else if (faceGroupCode.equals(propertyPersonnelGroup.getFaceGroupCode())) { //考勤分组处理-物业人员,添加到考勤表 hikService.propertyAttendanceHandle(event); - }else if(faceGroupCode.equals(securityPersonnelGroup.getFaceGroupCode())){ + } else if (faceGroupCode.equals(securityPersonnelGroup.getFaceGroupCode())) { //考勤分组处理-安保人员,添加到考勤表 hikService.securityPersonnelHandle(event); - }else { + } else { return; } - }else if(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT == eventType){ + } else if (SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT.equals(eventType)) { //离岗事件处理 caseInfo1 = hikService.demobilizedHandle(event, caseInfo1); - }else if(SecurityEventType.PERSONNEL_GATHER_EVENT == eventType){ + } else if (SecurityEventType.PERSONNEL_GATHER_EVENT.equals(eventType)) { //人员聚集事件处理 caseInfo1 = hikService.personGatherHandle(event, caseInfo1); - }else if(SecurityEventType.MONITORING_POINT_OFFLINE == eventType){ + } else if (SecurityEventType.MONITORING_POINT_OFFLINE.equals(eventType)) { //监控点离线事件处理 caseInfo1 = hikService.monitorPointOfflineHandle(event, caseInfo1); - }else if(SecurityEventType.DEVICE_OFFLINE == eventType){ + } else if (SecurityEventType.MONITORING_POINT_ONLINE.equals(eventType)) { + //监控点上线事件处理 + hikService.monitorPointOnlineHandle(event); + } else if (SecurityEventType.DEVICE_OFFLINE.equals(eventType)) { //装置离线事件处理 caseInfo1 = hikService.deviceOfflineHandle(event, caseInfo1); - }else if(SecurityEventType.VISITOR_REGISTER == eventType){ + } else if (SecurityEventType.DEVICE_ONLINE.equals(eventType)) { + //装置上线处理 + hikService.deviceOnlineHandle(event); + } else if (SecurityEventType.VISITOR_REGISTER.equals(eventType)) { //记录访客登记记录,添加到访客记录表 hikService.visitorRegisterHandler(event); - }else if(SecurityEventType.VISITOR_CHECKOUT == eventType){ + } else if (SecurityEventType.VISITOR_CHECKOUT.equals(eventType)) { //记录访客签离记录 hikService.visitorCheckOutHandler(event); } - if(!Objects.isNull(caseInfo1) && !StringUtils.isEmpty(caseInfo1.getHappenTime())){ + if (!Objects.isNull(caseInfo1) && !StringUtils.isEmpty(caseInfo1.getHappenTime())) { caseInfos.add(caseInfo1); } } //3、安防事件入库 - if(!caseInfoService.insertCaseInfoBatch(caseInfos)){ - log.error("安防事件批量入库异常"); + if (!CollectionUtils.isEmpty(caseInfos) && !caseInfoService.insertCaseInfoBatch(caseInfos)) { + log.error("安防事件批量入库异常!"); } // TODO: 2022/8/15 webSocket推送 + if (CollectionUtils.isEmpty(caseInfos)) { + log.info("webSocket事件推送"); + webSocket.sendAllMessage(JSONObject.toJSONString(caseInfos)); + } return; } /** + * 以图搜图,前端用于轨迹追踪 + */ + @PostMapping("/hik/search/picture") + @ResponseBody + public Object searchPictures(@RequestBody SearchPicturesRequest searchPicturesRequest) { + DateTime startDateTime = DateUtil.parse(searchPicturesRequest.getStartTime()); + DateTime endDateTime = DateUtil.parse(searchPicturesRequest.getEndTime()); + String startTime = DateUtil.format(startDateTime, "yyyy-MM-dd'T'HH:mm:ss.SSSXXX"); + String endTime = DateUtil.format(endDateTime, "yyyy-MM-dd'T'HH:mm:ss.SSSXXX"); + searchPicturesRequest.setStartTime(startTime); + searchPicturesRequest.setEndTime(endTime); + String body = JSONObject.toJSONString(searchPicturesRequest); + String resultStr = HikUtil.hikApi(HikUri.SEARCH_PICTURES, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (!"0".equals(resultJson.get("code"))) { + log.error("请求海康,以图搜图失败,海康response:{}", resultStr); + return ResponseData.error("以图搜图失败"); + } + return ResponseData.success(resultJson); + } + + + /** + * 海康事件取消订阅 + */ + @PostMapping("/hik/event/cancel") + @ResponseBody + public Object eventCancelSubscribe(@RequestBody CancelSubscribeRequest cancelSubscribeRequest) { + String body = JSONObject.toJSONString(cancelSubscribeRequest); + String resultStr = HikUtil.hikApi(HikUri.EVENT_CANCEL, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (!"0".equals(resultJson.get("code"))) { + log.error("请求海康,取消订阅失败,海康response:{}", resultStr); + return ResponseData.error("取消订阅失败"); + } + return ResponseData.success(resultJson); + } + + /** * 单个添加海康人脸分组 * api->hik单个添加人脸分组api->response->mysql */ - @PostMapping("/faceGroup/single/add") + @PostMapping("/hik/faceGroup/single/add") @ResponseBody public Object faceGroupAddition(@RequestBody FaceGroupAdditionRequest faceGroupAdditionRequest) { String body = JSONObject.toJSONString(faceGroupAdditionRequest); @@ -212,7 +282,7 @@ * 批量添加海康组织 * api->hik批量添加组织api->response */ - @PostMapping("/org/batch/add") + @PostMapping("/hik/org/batch/add") @ResponseBody public Object orgBatchAdd(@RequestBody List orgBatchAddRequest) { String body = JSONObject.toJSONString(orgBatchAddRequest); @@ -232,4 +302,62 @@ return ResponseData.error("批量添加组织失败"); } + /** + * 获取人员列表 + */ + @PostMapping("/hik/person/personList") + @ResponseBody + public Object personList() { + PersonListRequest request = new PersonListRequest(); + request.setPageNo(1); + request.setPageSize(100); + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi("/api/resource/v2/person/personList", body); + return resultStr; + } + + /** + * 获取组织列表 + */ + @PostMapping("/hik/org/orgList") + @ResponseBody + public Object orgList() { + PersonListRequest request = new PersonListRequest(); + request.setPageNo(1); + request.setPageSize(100); + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi("/api/resource/v1/org/orgList", body); + return resultStr; + } + + /** + * 查询访客权限下载记录 + */ + @PostMapping("/hik/auth/result") + @ResponseBody + public Object authResult() { + PersonListRequest request = new PersonListRequest(); + request.setPageNo(1); + request.setPageSize(100); + request.setOrderId("ba101db6246711edaea66f7939a13638"); + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi("/api/visitor/v1/auth/result", body); + return resultStr; + } + + /** + * 人脸图片获取 + */ + @PostMapping("/hik/face/picture") + @ResponseBody + public Object facePicture() { + FaceRequest request = new FaceRequest(); +// List list = new ArrayList<>(); +// list.add(""); + request.setCertificateNum("wanggong"); + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi("/api/frs/v1/face", body); + return resultStr; + } + } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/AssetInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/AssetInfoMapper.java index 4f64e83..c0684ee 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/AssetInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/AssetInfoMapper.java @@ -17,6 +17,6 @@ @Mapper public interface AssetInfoMapper extends BaseMapper { - List getAssetInfoListPage(@Param("page") Page page, AssetInfoRequest assetInfoRequest); + List getAssetInfoListPage(@Param("page") Page page, @Param("assetInfoRequest") AssetInfoRequest assetInfoRequest); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/AttendanceInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/AttendanceInfoMapper.java index f9e793e..ec87e46 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/AttendanceInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/AttendanceInfoMapper.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.statistics.AttendanceNumberDTO; import com.casic.missiles.modular.dto.statistics.AttendanceRatioDTO; import com.casic.missiles.modular.model.AttendanceInfo; import org.apache.ibatis.annotations.Mapper; @@ -17,7 +18,7 @@ */ @Mapper public interface AttendanceInfoMapper extends BaseMapper { - List getAttendanceInfoListPage(@Param("page") Page page, StaffInfoRequest attendanceInfoRequest); + List getAttendanceInfoListPage(@Param("page") Page page, @Param("attendanceInfoRequest") StaffInfoRequest attendanceInfoRequest); AttendanceInfo selectByCodeAndDate(@Param("staffCode") String staffCode); @@ -26,4 +27,8 @@ List getCountByTypeAndDateForMonth(@Param("staffType")String staffType); List getCountByTypeAndDateForYear(@Param("staffType")String staffType); + + List getCountForWeek(); + + List getCountForDay(); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java index ce94b8f..6137a7d 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java @@ -17,5 +17,5 @@ @Mapper public interface BlackInfoMapper extends BaseMapper { - List getBlackInfoListPage(@Param("page") Page page, BlackInfoRequest blackInfoRequest); + List getBlackInfoListPage(@Param("page") Page page, @Param("blackInfoRequest") BlackInfoRequest blackInfoRequest); } 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 efda6b3..50aaa6f 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 @@ -20,7 +20,7 @@ List getCaseInfoListPage(@Param("page") Page page, @Param("caseInfoRequest") CaseInfoRequest caseInfoRequest); - int updateStatusById(CaseInfoRequest caseInfoRequest); + int updateStatusById(@Param("caseInfoRequest") CaseInfoRequest caseInfoRequest); List selectByLevelAndMonth(@Param("year") String year); @@ -47,4 +47,20 @@ List selectPreWeekCountByThirtyDay(); List selectPreDayCountBySevenDay(); + + Integer selectDemobilizedCount(@Param("eventType") Number personnelDemobilizedEvent); + + List selectPreMonthCount(); + + List selectListBySevenDay(); + + List selectListByToday(); + + List selectListByToday2(); + + List selectListByToday3(); + + List selectListByType(@Param("eventType") Number eventType); + + List selectDemobilizedCountByHour(@Param("eventType") Number eventType); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/CategoryLevelMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/CategoryLevelMapper.java index 52fc714..afe1650 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/CategoryLevelMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/CategoryLevelMapper.java @@ -17,9 +17,9 @@ @Mapper public interface CategoryLevelMapper extends BaseMapper { - List getCaseCategoryLevelListPage(@Param("page") Page page, CategoryLevelRequest categoryLevelRequest); + List getCaseCategoryLevelListPage(@Param("page") Page page, @Param("categoryLevelRequest") CategoryLevelRequest categoryLevelRequest); - List getCaseCategoryLevelList(CategoryLevelRequest categoryLevelRequest); + List getCaseCategoryLevelList(@Param("categoryLevelRequest") CategoryLevelRequest categoryLevelRequest); CaseCategoryLevel getCaseCategoryLevel(@Param("categoryLevelCode") String categoryLevelCode); 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 66353b1..2555a09 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 @@ -19,7 +19,7 @@ @Mapper public interface DeviceInfoMapper extends BaseMapper { - List getDeviceInfoListPage(@Param("page") Page page, DeviceInfoRequest deviceInfoRequest); + List getDeviceInfoListPage(@Param("page") Page page, @Param("deviceInfoRequest") DeviceInfoRequest deviceInfoRequest); List getDeviceInfoList(@Param("deviceInfoRequest") DeviceInfoRequest deviceInfoRequest); @@ -27,6 +27,8 @@ DeviceInfo getByIndexCode(@Param("srcIndex") String srcIndex); + DeviceInfo getByIp(@Param("ip") String ip); + List selectIndexCodesByCodes(@Param("deviceCodes") List deviceCodes); List selectByType(@Param("devType") String devType); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java index 41dd0af..5bfaf63 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java @@ -5,6 +5,7 @@ import com.casic.missiles.modular.dto.DeviceRepairRequest; import com.casic.missiles.modular.model.DeviceRepairLog; import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; import java.util.List; @@ -16,7 +17,7 @@ @Mapper public interface DeviceRepairLogMapper extends BaseMapper { - List getDeviceRepairListPage(Page page, DeviceRepairRequest deviceRepairRequest); + List getDeviceRepairListPage(@Param("page") Page page, @Param("deviceRepairRequest")DeviceRepairRequest deviceRepairRequest); - List getDeviceRepairList(DeviceRepairRequest deviceRepairRequest); + List getDeviceRepairList(@Param("deviceRepairRequest") DeviceRepairRequest deviceRepairRequest); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java index 9035c47..4823ac1 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java @@ -18,7 +18,7 @@ @Mapper public interface FireEquipInfoMapper extends BaseMapper { - List getFireEquipInfoListPage(@Param("page") Page page, FireEquipRequest fireEquipRequest); + List getFireEquipInfoListPage(@Param("page") Page page, @Param("fireEquipRequest") FireEquipRequest fireEquipRequest); FireEquipInfo getFireEquipInfo(@Param("equipCode") String equipCode); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/GateGroupMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/GateGroupMapper.java index d8c330d..977a427 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/GateGroupMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/GateGroupMapper.java @@ -17,7 +17,7 @@ */ @Mapper public interface GateGroupMapper extends BaseMapper { - List getGateGroupListPage(@Param("page") Page page, GateGroupRequest gateGroupRequest); + List getGateGroupListPage(@Param("page") Page page, @Param("gateGroupRequest") GateGroupRequest gateGroupRequest); GateGroup getGateGroupByName(@Param("groupName") String groupName); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/HazardLevelMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/HazardLevelMapper.java index 8957780..dcf47bb 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/HazardLevelMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/HazardLevelMapper.java @@ -17,11 +17,13 @@ @Mapper public interface HazardLevelMapper extends BaseMapper { - List getCaseHazardLevelListPage(@Param("page") Page page, HazardLevelRequest hazardLevelRequest); + List getCaseHazardLevelListPage(@Param("page") Page page, @Param("hazardLevelRequest") HazardLevelRequest hazardLevelRequest); - List getCaseHazardLevelList(HazardLevelRequest hazardLevelRequest); + List getCaseHazardLevelList(@Param("hazardLevelRequest") HazardLevelRequest hazardLevelRequest); CaseHazardLevel getCaseHazardLevel(@Param("hazardLevelCode") String hazardLevelCode); List selectHazardName(); + + String selectHazardNameByCode(@Param("hazardLevelCode") String hazardLevelCode); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/HikCaseDefineMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/HikCaseDefineMapper.java index 0dc47d1..f162fef 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/HikCaseDefineMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/HikCaseDefineMapper.java @@ -12,5 +12,5 @@ */ @Mapper public interface HikCaseDefineMapper extends BaseMapper { - HikCaseDefine getHikCaseDefine(@Param("caseTypeCode") Long caseTypeCode); + HikCaseDefine getHikCaseDefine(@Param("caseTypeCode") Number caseTypeCode); } 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 f8a674c..fe5afc2 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 @@ -17,11 +17,13 @@ @Mapper public interface StaffInfoMapper extends BaseMapper { - List getStaffInfoListPage(@Param("page") Page page, StaffInfoRequest staffInfoRequest); + List getStaffInfoListPage(@Param("page") Page page, @Param("staffInfoRequest") StaffInfoRequest staffInfoRequest); StaffInfo selectByCode(@Param("staffCode") String staffCode); - List getStaffInfoList(StaffInfoRequest staffInfoRequest); + List getStaffInfoList(@Param("staffInfoRequest") StaffInfoRequest staffInfoRequest); - List selectBatchCodes(List list); + List selectBatchCodes(@Param("list") List list); + + int updateByCodeForCard(@Param("staffCode") String staffCode, @Param("cardNo") String cardNo); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitInfoMapper.java index b1217c5..6c52542 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitInfoMapper.java @@ -16,7 +16,7 @@ */ @Mapper public interface VisitInfoMapper extends BaseMapper { - List getVisitInfoListPage(@Param("page") Page page, VisitorRequest visitorRequest); + List getVisitInfoListPage(@Param("page") Page page, @Param("visitorRequest") VisitorRequest visitorRequest); VisitInfo selectByOrderId(@Param("orderId") String orderId); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitorApplyMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitorApplyMapper.java index c09f3c0..6ea55bd 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitorApplyMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitorApplyMapper.java @@ -18,7 +18,7 @@ @Mapper public interface VisitorApplyMapper extends BaseMapper { - List getVisitorApplyListPage(@Param("page") Page page, VisitorApplyRequest visitorApplyRequest); + List getVisitorApplyListPage(@Param("page") Page page, @Param("visitorApplyRequest") VisitorApplyRequest visitorApplyRequest); List selectByVisitReason(); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/AttendanceInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/AttendanceInfoMapper.xml index b2ece71..f8bdd6e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/AttendanceInfoMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/AttendanceInfoMapper.xml @@ -43,7 +43,8 @@ and staff_type = #{staffType} - and YEARWEEK(date_format(atte_date, '%Y-%m-%d'), 1) = YEARWEEK(now(),1); + AND DATE_SUB(CURDATE(), INTERVAL 7 DAY) <= DATE(atte_date) + GROUP BY DATE_FORMAT(atte_date, '%Y-%m-%d') @@ -69,4 +70,20 @@ GROUP BY DATE_FORMAT(atte_date, '%Y-%m') + + + \ No newline at end of file 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 2b6953f..06ec0a8 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 @@ -28,7 +28,9 @@ @@ -87,7 +89,8 @@ SELECT hazard_level_code as levelCode, count(id) as quantity FROM bus_case_info WHERE hazard_level_code is not null - AND DATE_SUB(CURDATE(), INTERVAL 7 DAY) <= date(happen_time); + AND is_key_area = 1 + AND DATE_SUB(CURDATE(), INTERVAL 7 DAY) <= date(happen_time) GROUP BY hazard_level_code @@ -95,7 +98,8 @@ SELECT hazard_level_code as levelCode, count(id) as quantity FROM bus_case_info WHERE hazard_level_code is not null - AND DATE_SUB(CURDATE(), INTERVAL 30 DAY) <= date(happen_time); + AND is_key_area = 1 + AND DATE_SUB(CURDATE(), INTERVAL 30 DAY) <= date(happen_time) GROUP BY hazard_level_code @@ -122,4 +126,71 @@ AND hazard_level_code is not null GROUP BY DATE_FORMAT(happen_time,'%Y-%m-%d') + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/CategoryLevelMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/CategoryLevelMapper.xml index 4670b1f..1d25cbd 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/CategoryLevelMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/CategoryLevelMapper.xml @@ -20,11 +20,11 @@ SELECT * FROM bus_case_category_level WHERE 1=1 - - and code = #{code} + + and code = #{categoryLevelRequest.code} - - and name = #{name} + + and name = #{categoryLevelRequest.name} ORDER by create_time DESC 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 9b66fd8..bfd84b7 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 @@ -98,4 +98,10 @@ #{item} + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceRepairLogMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceRepairLogMapper.xml index 078ed3c..cf1a481 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceRepairLogMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceRepairLogMapper.xml @@ -22,14 +22,14 @@ SELECT * FROM bus_device_repair_log WHERE 1=1 - - and device_code = #{devCode} + + and device_code = #{deviceRepairRequest.devCode} - - and device_name = #{devName} + + and device_name = #{deviceRepairRequest.devName} - - and DATE_FORMAT(create_time,"%y%m%d") = DATE_FORMAT(#{createTime},"%y%m%d") + + and DATE_FORMAT(create_time,"%y%m%d") = DATE_FORMAT(#{deviceRepairRequest.createTime},"%y%m%d") ORDER by create_time DESC diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/HazardLevelMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/HazardLevelMapper.xml index f16f2b9..458322b 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/HazardLevelMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/HazardLevelMapper.xml @@ -20,11 +20,11 @@ SELECT * FROM bus_case_hazard_level WHERE 1=1 - - and code = #{code} + + and code = #{hazardLevelRequest.code} - - and name = #{name} + + and name = #{hazardLevelRequest.name} ORDER by create_time DESC @@ -42,4 +42,10 @@ SELECT name FROM bus_case_hazard_level + + \ 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 557237e..b6a183a 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 @@ -50,4 +50,10 @@ + + + UPDATE bus_staff_info + SET card_no = #{cardNo} + WHERE staff_code = #{staffCode} + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/BlackListController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/BlackListController.java index a27f9f8..0c06661 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/BlackListController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/BlackListController.java @@ -1,13 +1,18 @@ package com.casic.missiles.modular.controller; +import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.base.controller.ExportController; import com.casic.missiles.core.page.PageFactory; import com.casic.missiles.model.response.ResponseData; import com.casic.missiles.modular.dto.BlackInfoRequest; +import com.casic.missiles.modular.dto.BlackPictureRequest; +import com.casic.missiles.modular.dto.hik.PersonInfoRequest; +import com.casic.missiles.modular.enums.HikUri; import com.casic.missiles.modular.enums.OperateTypeEnum; import com.casic.missiles.modular.model.BlackInfo; import com.casic.missiles.modular.service.BlackInfoService; +import com.casic.missiles.modular.util.HikUtil; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; @@ -56,4 +61,22 @@ return null; } + /** + * 黑名单人员照片 + */ + @PostMapping("/personPicture") + @ResponseBody + public Object personPicture(@RequestBody BlackPictureRequest blackPictureRequest){ + //获取照片 + String picUri = blackPictureRequest.getPicUri(); + String serverIndexCode = blackPictureRequest.getServerIndexCode(); + PersonInfoRequest picRequest = new PersonInfoRequest(); + picRequest.setPicUri(picUri); + picRequest.setServerIndexCode(serverIndexCode); + String reBody = JSONObject.toJSONString(picRequest); + //重定向地址获取 + String url = HikUtil.hikApiFor302(HikUri.PERSON_PICTURE, reBody); + return ResponseData.success(url); + } + } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/DeviceController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/DeviceController.java index e1c4eba..666bbee 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/DeviceController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/DeviceController.java @@ -107,7 +107,7 @@ } /** - * 设备维修管理查询(分页),需计算MTTR=总维修时间/故障次数 + * 设备状态计算与评判/设备维修管理查询(分页),需计算MTTR=总维修时间/故障次数 */ @PostMapping("/repair/listPage") @ResponseBody @@ -211,7 +211,7 @@ //需根据设备编号获取到对应的门禁点唯一标识 doorControlRequest.setDoorIndexCodes(indexCodes); doorControlRequest.setControlType(Integer.valueOf(gateGroupDTO.getStatus())); - String body = JSONObject.toJSONString(deviceCodes); + String body = JSONObject.toJSONString(doorControlRequest); String resultStr = HikUtil.hikApi(HikUri.DOOR_CONTROL, body); JSONObject resultJson = (JSONObject)JSONObject.parse(resultStr); if (!"0".equals(resultJson.get("code"))) { diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/StaffController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/StaffController.java index b58ccab..704093c 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/StaffController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/StaffController.java @@ -2,15 +2,21 @@ import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.util.StrUtil; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.base.controller.ExportController; import com.casic.missiles.core.page.PageFactory; import com.casic.missiles.model.response.ErrorResponseData; import com.casic.missiles.model.response.ResponseData; import com.casic.missiles.modular.dto.StaffInfoRequest; +import com.casic.missiles.modular.dto.hik.PersonInfoRequest; +import com.casic.missiles.modular.dto.hik.StaffCardRequest; +import com.casic.missiles.modular.enums.HikUri; import com.casic.missiles.modular.enums.OperateTypeEnum; import com.casic.missiles.modular.model.StaffInfo; import com.casic.missiles.modular.service.StaffInfoService; +import com.casic.missiles.modular.util.HikUtil; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; @@ -110,4 +116,60 @@ } return ResponseData.success(); } + + /** + * 批量开卡,添加人员之后调用,若在一个接口中添加人员成功开卡失败则第二次添加时会有问题 + */ + @PostMapping("/cardBinding") + @ResponseBody + public Object cardBinding(@RequestBody StaffCardRequest staffCardRequest) { + String body = JSONObject.toJSONString(staffCardRequest); + String resultStr = HikUtil.hikApi(HikUri.CARD_BINDING, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (!"0".equals(resultJson.get("code"))) { + log.error("请求海康,批量开卡失败,海康response:{}", resultStr); + return ResponseData.error("批量开卡失败"); + } + //保存卡号 + if(staffInfoService.saveCardInfo(staffCardRequest) > 0){ + return ResponseData.success(); + } + return ResponseData.error("批量开卡失败"); + } + + /** + * 获取员工照片,海康存储 + */ + @PostMapping("/personPicture/{staffCode}") + @ResponseBody + public Object personPicture(@PathVariable("staffCode") String staffCode){ + //获取员工详细信息,含图片服务器、uri + PersonInfoRequest request = new PersonInfoRequest(); + List list = new ArrayList<>(); + list.add(staffCode); + request.setParamName("personId"); + request.setParamValue(list); + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi(HikUri.PERSON_INFO, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (!"0".equals(resultJson.get("code"))) { + log.error("请求海康,根据人员唯一字段获取人员详细信息失败,海康response:{}", resultStr); + return ResponseData.error("获取员工照片失败"); + } + //获取照片 + JSONObject data = (JSONObject) resultJson.get("data"); + JSONArray dataArray = (JSONArray) data.get("list"); + JSONObject jsonObject = (JSONObject) dataArray.get(0); + JSONArray personPhoto = (JSONArray) jsonObject.get("personPhoto"); + JSONObject photo = (JSONObject) personPhoto.get(0); + String picUri = photo.getString("picUri"); + String serverIndexCode = photo.getString("serverIndexCode"); + PersonInfoRequest picRequest = new PersonInfoRequest(); + picRequest.setPicUri(picUri); + picRequest.setServerIndexCode(serverIndexCode); + String reBody = JSONObject.toJSONString(picRequest); + //重定向地址获取 + String url = HikUtil.hikApiFor302(HikUri.PERSON_PICTURE, reBody); + return ResponseData.success(url); + } } 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 4a07dd9..7b1dcf6 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 @@ -16,6 +16,7 @@ import com.casic.missiles.modular.redis.key.CacheKeys; import com.casic.missiles.modular.service.CockpitService; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.util.CollectionUtils; import org.springframework.web.bind.annotation.*; @@ -24,10 +25,7 @@ import java.text.NumberFormat; import java.time.LocalDateTime; import java.time.temporal.ChronoUnit; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.util.*; import java.util.stream.Collectors; /** @@ -73,6 +71,9 @@ private StatisticNumberMapper numberMapper; @Autowired + private HazardLevelMapper hazardLevelMapper; + + @Autowired private AccessGroupConfig accessGroupConfig; /** @@ -104,8 +105,24 @@ public Object buildingNumberPerHour(){ //当天按小时分组的人数 List list = numberMapper.selectListByTime(); - Map> collect = list.stream().collect(Collectors.groupingBy(BuildingNumberDTO::getStatisticPosition)); - return ResponseData.success(collect); + Map> collect = list.stream().collect(Collectors.groupingBy(BuildingNumberDTO::getStatisticTime)); + //定时任务中已将每小时三栋楼人数存到数据库 + //将一期主楼和录制楼人数合并,二期单算 + List> resultList = new ArrayList<>(); + collect.keySet().forEach(key -> { + List buildingNumberDTOS = collect.get(key); + BuildingNumberDTO mainBuildingOne = buildingNumberDTOS.get(0); + BuildingNumberDTO mainBuildingTwo = buildingNumberDTOS.get(1); + BuildingNumberDTO recordingBuilding = buildingNumberDTOS.get(2); + HashMap resultMap = new HashMap<>(); + Integer oneQuantity = Integer.valueOf(mainBuildingOne.getStatisticQuantity()); + Integer recordingQuantity = Integer.valueOf(recordingBuilding.getStatisticQuantity()); + resultMap.put("staticTime", mainBuildingOne.getStatisticTime()); + resultMap.put(mainBuildingOne.getStatisticPositionName()+"、"+recordingBuilding.getStatisticPositionName(), String.valueOf(oneQuantity+recordingQuantity)); + resultMap.put(mainBuildingTwo.getStatisticPositionName(), mainBuildingTwo.getStatisticQuantity()); + resultList.add(resultMap); + }); + return ResponseData.success(resultList); } /** @@ -151,12 +168,11 @@ public Object securityNumber() { QueryWrapper wrapper = new QueryWrapper<>(); wrapper.eq("staff_type", 2); + // TODO: 2022/9/2 后续使用产品确定的每天出勤的安保人员的数量 Integer total = staffInfoMapper.selectCount(wrapper); - //当日离岗事件个数 - QueryWrapper wrapper1 = new QueryWrapper<>(); - wrapper1.eq("hik_event_type", SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); - wrapper1.apply("date_format(now(),'%Y-%m-%d') = date_format(happen_time,'%Y-%m-%d')"); - Integer leave = caseInfoMapper.selectCount(wrapper1); + //当日离岗事件按设备去重后的个数 + // TODO: 2022/9/2 目前相当于24小时内的计算,之后看需要可改成自定义小时数计算离岗率,即离岗+6小时内仅一次离岗则恢复为100%,多次则累加离岗次数计算离岗率 + Integer leave = caseInfoMapper.selectDemobilizedCount(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); NumberFormat numberFormat = NumberFormat.getInstance(); // 设置精确到小数点后2位 numberFormat.setMaximumFractionDigits(2); @@ -179,7 +195,6 @@ @ResponseBody public Object visitorApplyDetail() { List reasonGroup = applyMapper.selectByVisitReason(); - HashMap resultMap = new HashMap<>(); NumberFormat numberFormat = NumberFormat.getInstance(); // 设置精确到小数点后2位 numberFormat.setMaximumFractionDigits(2); @@ -187,12 +202,17 @@ if(0 == sum){ return ResponseData.success(); } + List resultList = new ArrayList<>(); reasonGroup.forEach(group -> { String reasonName = dictService.getDictNameByCode(SecurityEventDict.VISIT_REASON, group.getVisitReason()); String result = numberFormat.format((float) group.getQuantity() / (float) sum * 100); - resultMap.put(reasonName, result+"%"); + ApplyReasonGroupDTO applyReasonGroupDTO = new ApplyReasonGroupDTO(); + applyReasonGroupDTO.setQuantity(group.getQuantity()); + applyReasonGroupDTO.setVisitReason(reasonName); + applyReasonGroupDTO.setRatio(result+"%"); + resultList.add(applyReasonGroupDTO); }); - return ResponseData.success(resultMap); + return ResponseData.success(resultList); } /** @@ -247,6 +267,32 @@ } /** + * 机动力量实时在岗率,在岗人数除以总应在岗人数,用离岗+6小时内恢复为100%,6小时外再计算 + */ + @GetMapping("/staff/beOnDutyRatio") + @ResponseBody + public Object beOnDutyRatio() { + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("staff_type", 2); + // TODO: 2022/9/2 后续使用产品确定的每天出勤的安保人员的数量 + Integer total = staffInfoMapper.selectCount(wrapper); + if(0 == total){ + return ResponseData.success(null); + } + //当日离岗事件按设备去重后的个数 + // TODO: 2022/9/2 目前相当于24小时内的计算,之后看需要可改成自定义小时数计算离岗率,即离岗+6小时内仅一次离岗则恢复为100%,多次则累加离岗次数计算离岗率 + List onDutyRatioDTOS = caseInfoMapper.selectDemobilizedCountByHour(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); + onDutyRatioDTOS.forEach(dto -> { + NumberFormat numberFormat = NumberFormat.getInstance(); + // 设置精确到小数点后2位 + numberFormat.setMaximumFractionDigits(2); + String result = numberFormat.format(100 - Float.valueOf(dto.getQuantity()) / (float) total * 100); + dto.setRatio(result+"%"); + }); + return ResponseData.success(onDutyRatioDTOS); + } + + /** * 闸机速通门统计-设备状态分组计算数量,devType传闸机字典key * 视频频监控摄像机统计-设备状态分组计算数量,devType传摄像头字典key */ @@ -262,12 +308,17 @@ if(sum <= 0){ return ResponseData.error("无该类设备信息"); } + List resultList = new ArrayList<>(); gateStatusGroup.forEach(group -> { String devStatus = dictService.getDictNameByCode(SecurityEventDict.DEVICE_STATUS, group.getStatus()); String result = numberFormat.format((float) group.getQuantity() / (float) sum * 100); - resultMap.put(devStatus, result+"%"); + GateStatusGroupResponse gateStatusGroupResponse = new GateStatusGroupResponse(); + gateStatusGroupResponse.setStatus(devStatus); + gateStatusGroupResponse.setRatio(result+"%"); + resultList.add(gateStatusGroupResponse); }); - resultMap.put("总", sum); + resultMap.put("total", sum); + resultMap.put("list", resultList); return ResponseData.success(resultMap); } @@ -282,17 +333,38 @@ String position = securityScoreDTO.getPosition(); List caseInfos = caseInfoMapper.selectByPosition(position); //查询各危险级别权重、各类别权重,放入map,避免循环中多次查数据库 - + HashMap hazardScoreMap = new HashMap<>(); + List caseHazardLevelList = hazardLevelMapper.getCaseHazardLevelList(null); + caseHazardLevelList.forEach(hazardLevel -> { + hazardScoreMap.put(hazardLevel.getCode(), hazardLevel.getWeight()); + }); + HashMap categoryScoreMap = new HashMap<>(); + List categoryLevelList = categoryLevelMapper.getCaseCategoryLevelList(null); + categoryLevelList.forEach(categoryLevel -> { + categoryScoreMap.put(categoryLevel.getCode(), categoryLevel.getWeight()); + }); + //事件按楼层分组,计算 List securityScoreDTOs = new ArrayList<>(); caseInfos.forEach(caseInfo -> { SecurityScoreDTO securityScoreDTO1 = new SecurityScoreDTO(); + securityScoreDTO1.setPosition(caseInfo.getPosition()); securityScoreDTO1.setArea(caseInfo.getArea()); - // TODO: 2022/8/4 楼层评分计算根据产品定义调整 -// caseInfo.get -// securityScoreDTO1.setScore(); + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); + Double score = 100 - Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + securityScoreDTO1.setScore(score); + securityScoreDTOs.add(securityScoreDTO1); }); - - return null; + 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); + }); + return ResponseData.success(securityScoreDTOs); } /** @@ -303,9 +375,13 @@ public Object SecurityFrequency(@RequestBody SecurityFrequencyDTO securityFrequencyDTO) { String year = securityFrequencyDTO.getYear(); String month = securityFrequencyDTO.getMonth(); - Integer quantity = caseInfoMapper.selectCountByMonth(year, month); - securityFrequencyDTO.setQuantity(quantity); - return ResponseData.success(securityFrequencyDTO); + if(!StringUtils.isEmpty(year) && StringUtils.isEmpty(month)){ + Integer quantity = caseInfoMapper.selectCountByMonth(year, month); + securityFrequencyDTO.setQuantity(quantity); + return ResponseData.success(securityFrequencyDTO); + } + List list = caseInfoMapper.selectPreMonthCount(); + return ResponseData.success(list); } } 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 ae4d770..f4f075c 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 @@ -1,20 +1,25 @@ package com.casic.missiles.modular.controller.cockpit; +import cn.hutool.core.date.DateUnit; import cn.hutool.core.date.DateUtil; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.casic.missiles.model.response.ResponseData; -import com.casic.missiles.modular.dao.AttendanceInfoMapper; -import com.casic.missiles.modular.dao.CaseInfoMapper; -import com.casic.missiles.modular.dao.HazardLevelMapper; -import com.casic.missiles.modular.dao.StaffInfoMapper; +import com.casic.missiles.modular.dao.*; +import com.casic.missiles.modular.dto.DeviceRepairLogDTO; +import com.casic.missiles.modular.dto.DeviceRepairRequest; import com.casic.missiles.modular.dto.statistics.*; +import com.casic.missiles.modular.enums.SecurityEventType; +import com.casic.missiles.modular.model.CaseCategoryLevel; import com.casic.missiles.modular.model.CaseHazardLevel; +import com.casic.missiles.modular.model.CaseInfo; import com.casic.missiles.modular.model.StaffInfo; +import com.casic.missiles.modular.service.DeviceInfoService; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.util.CollectionUtils; import org.springframework.web.bind.annotation.*; +import java.math.BigDecimal; import java.text.NumberFormat; import java.util.*; import java.util.stream.Collectors; @@ -40,6 +45,12 @@ @Autowired private HazardLevelMapper hazardLevelMapper; + @Autowired + private CategoryLevelMapper categoryLevelMapper; + + @Autowired + private DeviceInfoService deviceInfoService; + /** * 安防事件时域频次统计,每月的每天安防事件个数(原方案) * 月维度:展示每个月的每天的数据 @@ -89,15 +100,17 @@ List monthList = caseInfoMapper.selectPreMonthCountByYear(year); Map> collect = monthList.stream().collect(Collectors.groupingBy(PreMonthOrWeekCaseDTO::getHazardLevelCode)); HashMap strAvgMap = new HashMap<>(); + List resultList = new ArrayList<>(); for (String key : collect.keySet()) { List preMonthOrWeekCaseDTOS = collect.get(key); int sum = preMonthOrWeekCaseDTOS.stream().mapToInt(PreMonthOrWeekCaseDTO::getQuantity).sum(); //若年份是本年,则使用个安防级别数量/当前月份数 //若不是本年,除数为12 MonthAndWeekDTO monthAndWeekDTO = new MonthAndWeekDTO(); + String hazardName = hazardLevelMapper.selectHazardNameByCode(key); + monthAndWeekDTO.setLevelName(hazardName); if(year.equals(String.valueOf(DateUtil.thisYear()))){ monthAndWeekDTO.setMonthQuantity(sum / DateUtil.thisMonth()); -// monthAndWeekDTO.setLevelName(); strAvgMap.put(key, monthAndWeekDTO); }else{ monthAndWeekDTO.setMonthQuantity(sum / 12); @@ -113,27 +126,37 @@ if(year.equals(String.valueOf(DateUtil.thisYear()))){ if(!Objects.isNull(strAvgMap.get(key))){ MonthAndWeekDTO monthAndWeekDTO = strAvgMap.get(key); + String hazardName = hazardLevelMapper.selectHazardNameByCode(key); + monthAndWeekDTO.setLevelName(hazardName); monthAndWeekDTO.setWeekQuantity(sum / DateUtil.thisWeekOfYear()); strAvgMap.put(key, monthAndWeekDTO); }else{ MonthAndWeekDTO monthAndWeekDTO = new MonthAndWeekDTO(); + String hazardName = hazardLevelMapper.selectHazardNameByCode(key); + monthAndWeekDTO.setLevelName(hazardName); monthAndWeekDTO.setWeekQuantity(sum / DateUtil.thisWeekOfYear()); strAvgMap.put(key, monthAndWeekDTO); } }else{ if(!Objects.isNull(strAvgMap.get(key))){ MonthAndWeekDTO monthAndWeekDTO = strAvgMap.get(key); + String hazardName = hazardLevelMapper.selectHazardNameByCode(key); + monthAndWeekDTO.setLevelName(hazardName); monthAndWeekDTO.setWeekQuantity(sum / 52); strAvgMap.put(key, monthAndWeekDTO); }else{ MonthAndWeekDTO monthAndWeekDTO = new MonthAndWeekDTO(); + String hazardName = hazardLevelMapper.selectHazardNameByCode(key); + monthAndWeekDTO.setLevelName(hazardName); monthAndWeekDTO.setWeekQuantity(sum / 52); strAvgMap.put(key, monthAndWeekDTO); } } } - avgMonthAndWeekGroupDTO.setMap(strAvgMap); - return ResponseData.success(avgMonthAndWeekGroupDTO); + strAvgMap.keySet().forEach(key -> { + resultList.add(strAvgMap.get(key)); + }); + return ResponseData.success(resultList); } /** @@ -181,12 +204,178 @@ } /** - * 员工考勤人数变化,功能待定 + * 员工考勤人数变化,统计当天(横坐标为时)及近7天(横坐标为天)的考勤人数变化,只要发生一次考勤识别,次数的基数就正常增加(没有上班下班区分) */ + @PostMapping("/staff/attendanceNumber/{dimension}") + @ResponseBody + public Object attendanceNumber(@PathVariable("dimension") String dimension) { + List attendanceNumberDTOs = null; + List> resultList = new ArrayList<>(); + if("week".equals(dimension)){ + //近7天数据按天分组统计 + attendanceNumberDTOs = attendanceInfoMapper.getCountForWeek(); + }else if("day".equals(dimension)) { + //今天数据按小时分组统计 + attendanceNumberDTOs = attendanceInfoMapper.getCountForDay(); + } + if(CollectionUtils.isEmpty(attendanceNumberDTOs)){ + return ResponseData.error("该查询条件下,无员工出勤数据!"); + } + Map> collect = attendanceNumberDTOs.stream().collect(Collectors.groupingBy(AttendanceNumberDTO::getDate)); + collect.keySet().forEach(key -> { + List attendanceNumberDTOS = collect.get(key); + AttendanceNumberDTO attendanceNumberDTO = attendanceNumberDTOS.get(0); + AttendanceNumberDTO attendanceNumberDTO2 = attendanceNumberDTOS.get(1); + Map resultMap = new HashMap<>(); + resultMap.put(attendanceNumberDTO.getStaffType(), attendanceNumberDTO.getQuantity()); + resultMap.put(attendanceNumberDTO2.getStaffType(), attendanceNumberDTO2.getQuantity()); + resultMap.put("staticTime", attendanceNumberDTO.getDate()); + resultList.add(resultMap); + }); + return ResponseData.success(resultList); + } /** - * 近30天/近一周安保人员到岗排行 + * 早晚高峰区域安防评估 */ + @PostMapping("/security/assessment/{dimension}") + @ResponseBody + public Object securityAssessment(@PathVariable("dimension") String dimension) { + //查询各危险级别权重、各类别权重,放入map,避免循环中多次查数据库 + HashMap hazardScoreMap = new HashMap<>(); + List caseHazardLevelList = hazardLevelMapper.getCaseHazardLevelList(null); + caseHazardLevelList.forEach(hazardLevel -> { + hazardScoreMap.put(hazardLevel.getCode(), hazardLevel.getWeight()); + }); + HashMap categoryScoreMap = new HashMap<>(); + List categoryLevelList = categoryLevelMapper.getCaseCategoryLevelList(null); + categoryLevelList.forEach(categoryLevel -> { + categoryScoreMap.put(categoryLevel.getCode(), categoryLevel.getWeight()); + }); + HashMap hashMap = new HashMap<>(); + if("week".equals(dimension)){ + //近7天早晚高峰数据 + List caseInfos = caseInfoMapper.selectListBySevenDay(); + //按时间(天)进行分组 + caseInfos.forEach(caseInfo -> { + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); + Double score = Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + String[] array = caseInfo.getHappenTime().split(" "); + String dayTime = array[0]; + BigDecimal preScore; + if(hashMap.containsKey(dayTime)){ + Double aDouble = hashMap.get(dayTime); + preScore = new BigDecimal(aDouble.toString()); + + }else{ + preScore = new BigDecimal("100.0"); + } + BigDecimal nowScore = new BigDecimal(score.toString()); + hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); + }); + return ResponseData.success(hashMap); + }else if("day".equals(dimension)) { + //今天数据按小时分组统计 + List caseInfos = caseInfoMapper.selectListByToday(); + caseInfos.forEach(caseInfo -> { + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); + Double score = Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + String[] array = caseInfo.getHappenTime().split(":"); + String dayTime = array[0]; + BigDecimal preScore; + if(hashMap.containsKey(dayTime)){ + Double aDouble = hashMap.get(dayTime); + preScore = new BigDecimal(aDouble.toString()); + + }else{ + preScore = new BigDecimal("100.0"); + } + BigDecimal nowScore = new BigDecimal(score.toString()); + hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); + }); + return ResponseData.success(hashMap); + } + return null; + } + + /** + * 重点区域安防事态评估,统计重点区域6:00-23:00按小时分组数据 + */ + @GetMapping("/security/keyAreaStatistic") + @ResponseBody + public Object keyAreaStatistic() { + //查询各危险级别权重、各类别权重,放入map,避免循环中多次查数据库 + HashMap hazardScoreMap = new HashMap<>(); + List caseHazardLevelList = hazardLevelMapper.getCaseHazardLevelList(null); + caseHazardLevelList.forEach(hazardLevel -> { + hazardScoreMap.put(hazardLevel.getCode(), hazardLevel.getWeight()); + }); + HashMap categoryScoreMap = new HashMap<>(); + List categoryLevelList = categoryLevelMapper.getCaseCategoryLevelList(null); + categoryLevelList.forEach(categoryLevel -> { + categoryScoreMap.put(categoryLevel.getCode(), categoryLevel.getWeight()); + }); + HashMap hashMap = new HashMap<>(); + //今天数据按小时分组统计 + List caseInfos = caseInfoMapper.selectListByToday2(); + caseInfos.forEach(caseInfo -> { + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); + Double score = Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + String[] array = caseInfo.getHappenTime().split(":"); + String dayTime = array[0]; + BigDecimal preScore; + if(hashMap.containsKey(dayTime)){ + Double aDouble = hashMap.get(dayTime); + preScore = new BigDecimal(aDouble.toString()); + + }else{ + preScore = new BigDecimal("100.0"); + } + BigDecimal nowScore = new BigDecimal(score.toString()); + hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); + }); + return ResponseData.success(hashMap); + } + + /** + * 安防机动支援力量调配响应评估,根据事件已解决状态及已解决时间-发送时间,按时间(小时)分组统计 + */ + @GetMapping("/security/responseAssess") + @ResponseBody + public Object responseAssess() { + //查询各危险级别权重、各类别权重,放入map,避免循环中多次查数据库 + HashMap hazardScoreMap = new HashMap<>(); + List caseHazardLevelList = hazardLevelMapper.getCaseHazardLevelList(null); + caseHazardLevelList.forEach(hazardLevel -> { + hazardScoreMap.put(hazardLevel.getCode(), hazardLevel.getWeight()); + }); + HashMap hashMap = new HashMap<>(); + //今天数据按小时分组统计 + List caseInfos = caseInfoMapper.selectListByToday3(); + caseInfos.forEach(caseInfo -> { + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + //扣分=事件级别权重*未解决小时数 + Date updateTime = DateUtil.parse(caseInfo.getUpdateTime()); + Date happenTime = DateUtil.parse(caseInfo.getHappenTime()); + long between = DateUtil.between(updateTime, happenTime, DateUnit.HOUR); + Double score = Double.valueOf(hazardWeight)*between; + String[] array = caseInfo.getHappenTime().split(":"); + String dayTime = array[0]; + BigDecimal preScore; + if(hashMap.containsKey(dayTime)){ + Double aDouble = hashMap.get(dayTime); + preScore = new BigDecimal(aDouble.toString()); + }else{ + preScore = new BigDecimal("100.0"); + } + BigDecimal nowScore = new BigDecimal(score.toString()); + hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); + }); + return ResponseData.success(hashMap); + } /** * 重点区域威胁事件类型统计,优先级2,统计近7天和近30天 @@ -224,7 +413,34 @@ } /** - * 设备状态计算系数和评判,优先级3,需确认设备恢复时间是否可以获取 + * 近30天/近一周安保人员到岗排行 */ + + /** + * 安保等级评估,发生离岗事件减1分 + */ + @GetMapping("/security/levelAssess") + @ResponseBody + public Object securityLevelAssess() { + //今天数据按小时分组统计 + List resultList = caseInfoMapper.selectListByType(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); + resultList.forEach(result -> { + BigDecimal deScore = new BigDecimal(result.getQuantity()); + BigDecimal preScore = new BigDecimal("100.0"); + result.setScore(preScore.subtract(deScore).doubleValue()); + }); + return ResponseData.success(resultList); + } + + /** + * 设备状态计算系数和评判,即设备维修管理查询(不分页) + */ + @PostMapping("/device/repairList") + @ResponseBody + public Object repairList(@RequestBody DeviceRepairRequest deviceRepairRequest) { + List deviceRepairLogDTOS = deviceInfoService.deviceRepairListPage(deviceRepairRequest); + return ResponseData.success(deviceRepairLogDTOS); + } + } 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 fbf8ab6..c71a15a 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 @@ -1,13 +1,12 @@ package com.casic.missiles.modular.controller.hik; +import cn.hutool.core.date.DateTime; +import cn.hutool.core.date.DateUtil; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.casic.missiles.model.response.ResponseData; import com.casic.missiles.modular.dao.HikFaceGroupInfoMapper; -import com.casic.missiles.modular.dto.hik.EventSubscribeRequest; -import com.casic.missiles.modular.dto.hik.FaceGroupAdditionRequest; -import com.casic.missiles.modular.dto.hik.HikRecvEvent; -import com.casic.missiles.modular.dto.hik.OrgBatchAdd; +import com.casic.missiles.modular.dto.hik.*; import com.casic.missiles.modular.enums.HikUri; import com.casic.missiles.modular.enums.SecurityEventType; import com.casic.missiles.modular.model.CaseInfo; @@ -18,16 +17,20 @@ import com.casic.missiles.modular.util.CaseInfoFactoryUtil; import com.casic.missiles.modular.util.HikUtil; import com.casic.missiles.modular.util.ThreadPoolUtil; +import com.casic.missiles.modular.util.WebSocket; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; -import org.springframework.web.bind.annotation.*; +import org.springframework.util.CollectionUtils; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.RestController; -import java.net.InetAddress; -import java.net.UnknownHostException; import java.util.ArrayList; +import java.util.Iterator; import java.util.List; import java.util.Objects; @@ -38,7 +41,6 @@ */ @Slf4j @RestController -@RequestMapping("/hik") public class HikController { @Autowired @@ -53,28 +55,37 @@ @Autowired private HikService hikService; + @Autowired + private HikFaceGroupInfoMapper hikFaceGroupInfoMapper; + + @Autowired + private WebSocket webSocket; + @Value("${server.port}") private int serverPort; - @Autowired - private HikFaceGroupInfoMapper hikFaceGroupInfoMapper; /** * 海康事件订阅 */ - @PostMapping("/event/subscribe") + @PostMapping("/hik/event/subscribe") @ResponseBody - public Object eventSubscribe() throws UnknownHostException { + public Object eventSubscribe() { EventSubscribeRequest eventSubscribeRequest = new EventSubscribeRequest(); ArrayList list = new ArrayList<>(); list.add(SecurityEventType.DEVICE_OFFLINE); + list.add(SecurityEventType.DEVICE_ONLINE); list.add(SecurityEventType.KEY_PERSONNEL_IDENTIFY_EVENT); list.add(SecurityEventType.MONITORING_POINT_OFFLINE); + list.add(SecurityEventType.MONITORING_POINT_ONLINE); list.add(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); list.add(SecurityEventType.PERSONNEL_GATHER_EVENT); - InetAddress localHost = InetAddress.getLocalHost(); + list.add(SecurityEventType.VISITOR_REGISTER); + list.add(SecurityEventType.VISITOR_CHECKOUT); + list.add(SecurityEventType.HIGH_ALTITUDE_PARABOLIC); +// InetAddress localHost = InetAddress.getLocalHost(); eventSubscribeRequest.setEventTypes(list); - eventSubscribeRequest.setEventDest("https://" + localHost + ":" + serverPort + "/eventRcv"); + eventSubscribeRequest.setEventDest("http://" + "192.168.10.6" + ":" + serverPort + "/eventRcv"); //订阅类型,0-订阅原始事件,1-联动事件,2-原始事件和联动事件,不填使用默认值0 eventSubscribeRequest.setSubType(0); /** @@ -92,19 +103,25 @@ } /** + * 查询事件订阅信息 + */ + @PostMapping("/hik/event/query") + @ResponseBody + public Object eventQuery() { + String result = HikUtil.hikApi(HikUri.EVENT_INFO, ""); + return result; + } + + /** * 海康事件接收 */ @PostMapping("/eventRcv") @ResponseBody public Object eventRcv(@RequestBody HikRecvEvent hikRecvEvent) { //1、接收所需事件类型 - Long eventType = hikRecvEvent.getEventType(); + Number eventType = hikRecvEvent.getEventType(); log.info("接收到安防事件类型为:{}", eventType); CaseInfo caseInfo = caseInfoFactoryUtil.getCaseInfo(eventType); - //接收到不关心事件直接返回 - if(Objects.isNull(caseInfo)){ - return ResponseData.success(); - } //2、不同事件不同处理,caseInfoFactoryUtil已设置好事件基础定义信息 // 再为事件添加状态、设备编码、设备名称、位置、区域、时间 // 异步处理事件 @@ -114,19 +131,23 @@ caseHandle(hikRecvEvent, eventType, caseInfo); } })); +// caseHandle(hikRecvEvent, eventType, caseInfo); - return null; + return ResponseData.success(); } - private void caseHandle(HikRecvEvent hikRecvEvent, Long eventType, CaseInfo caseInfo) { + private void caseHandle(HikRecvEvent hikRecvEvent, Number eventType, CaseInfo caseInfo) { JSONArray eventArray = hikRecvEvent.getEventArray(); List caseInfos = new ArrayList<>(); - while (eventArray.stream().iterator().hasNext()) { + Iterator iterator = eventArray.iterator(); + while (iterator.hasNext()) { CaseInfo caseInfo1 = new CaseInfo(); - BeanUtils.copyProperties(caseInfo, caseInfo1); - JSONObject event = (JSONObject) eventArray.stream().iterator().next(); + if(!Objects.isNull(caseInfo)){ + BeanUtils.copyProperties(caseInfo, caseInfo1); + } + JSONObject event = (JSONObject) iterator.next(); //5种事件进行不同处理 - if(SecurityEventType.KEY_PERSONNEL_IDENTIFY_EVENT == eventType){ + if (SecurityEventType.KEY_PERSONNEL_IDENTIFY_EVENT.equals(eventType)) { //判断所属人脸分组 JSONObject data = (JSONObject) event.get("data"); JSONObject faceRecognitionResult = (JSONObject) data.get("faceRecognitionResult"); @@ -142,52 +163,101 @@ if (faceGroupCode.equals(blackListGroup.getFaceGroupCode())) { //黑名单分组处理 caseInfo1 = hikService.blackListHandle(event, caseInfo1); - }else if(faceGroupCode.equals(propertyPersonnelGroup.getFaceGroupCode())){ + } else if (faceGroupCode.equals(propertyPersonnelGroup.getFaceGroupCode())) { //考勤分组处理-物业人员,添加到考勤表 hikService.propertyAttendanceHandle(event); - }else if(faceGroupCode.equals(securityPersonnelGroup.getFaceGroupCode())){ + } else if (faceGroupCode.equals(securityPersonnelGroup.getFaceGroupCode())) { //考勤分组处理-安保人员,添加到考勤表 hikService.securityPersonnelHandle(event); - }else { + } else { return; } - }else if(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT == eventType){ + } else if (SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT.equals(eventType)) { //离岗事件处理 caseInfo1 = hikService.demobilizedHandle(event, caseInfo1); - }else if(SecurityEventType.PERSONNEL_GATHER_EVENT == eventType){ + } else if (SecurityEventType.PERSONNEL_GATHER_EVENT.equals(eventType)) { //人员聚集事件处理 caseInfo1 = hikService.personGatherHandle(event, caseInfo1); - }else if(SecurityEventType.MONITORING_POINT_OFFLINE == eventType){ + } else if (SecurityEventType.MONITORING_POINT_OFFLINE.equals(eventType)) { //监控点离线事件处理 caseInfo1 = hikService.monitorPointOfflineHandle(event, caseInfo1); - }else if(SecurityEventType.DEVICE_OFFLINE == eventType){ + } else if (SecurityEventType.MONITORING_POINT_ONLINE.equals(eventType)) { + //监控点上线事件处理 + hikService.monitorPointOnlineHandle(event); + } else if (SecurityEventType.DEVICE_OFFLINE.equals(eventType)) { //装置离线事件处理 caseInfo1 = hikService.deviceOfflineHandle(event, caseInfo1); - }else if(SecurityEventType.VISITOR_REGISTER == eventType){ + } else if (SecurityEventType.DEVICE_ONLINE.equals(eventType)) { + //装置上线处理 + hikService.deviceOnlineHandle(event); + } else if (SecurityEventType.VISITOR_REGISTER.equals(eventType)) { //记录访客登记记录,添加到访客记录表 hikService.visitorRegisterHandler(event); - }else if(SecurityEventType.VISITOR_CHECKOUT == eventType){ + } else if (SecurityEventType.VISITOR_CHECKOUT.equals(eventType)) { //记录访客签离记录 hikService.visitorCheckOutHandler(event); } - if(!Objects.isNull(caseInfo1) && !StringUtils.isEmpty(caseInfo1.getHappenTime())){ + if (!Objects.isNull(caseInfo1) && !StringUtils.isEmpty(caseInfo1.getHappenTime())) { caseInfos.add(caseInfo1); } } //3、安防事件入库 - if(!caseInfoService.insertCaseInfoBatch(caseInfos)){ - log.error("安防事件批量入库异常"); + if (!CollectionUtils.isEmpty(caseInfos) && !caseInfoService.insertCaseInfoBatch(caseInfos)) { + log.error("安防事件批量入库异常!"); } // TODO: 2022/8/15 webSocket推送 + if (CollectionUtils.isEmpty(caseInfos)) { + log.info("webSocket事件推送"); + webSocket.sendAllMessage(JSONObject.toJSONString(caseInfos)); + } return; } /** + * 以图搜图,前端用于轨迹追踪 + */ + @PostMapping("/hik/search/picture") + @ResponseBody + public Object searchPictures(@RequestBody SearchPicturesRequest searchPicturesRequest) { + DateTime startDateTime = DateUtil.parse(searchPicturesRequest.getStartTime()); + DateTime endDateTime = DateUtil.parse(searchPicturesRequest.getEndTime()); + String startTime = DateUtil.format(startDateTime, "yyyy-MM-dd'T'HH:mm:ss.SSSXXX"); + String endTime = DateUtil.format(endDateTime, "yyyy-MM-dd'T'HH:mm:ss.SSSXXX"); + searchPicturesRequest.setStartTime(startTime); + searchPicturesRequest.setEndTime(endTime); + String body = JSONObject.toJSONString(searchPicturesRequest); + String resultStr = HikUtil.hikApi(HikUri.SEARCH_PICTURES, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (!"0".equals(resultJson.get("code"))) { + log.error("请求海康,以图搜图失败,海康response:{}", resultStr); + return ResponseData.error("以图搜图失败"); + } + return ResponseData.success(resultJson); + } + + + /** + * 海康事件取消订阅 + */ + @PostMapping("/hik/event/cancel") + @ResponseBody + public Object eventCancelSubscribe(@RequestBody CancelSubscribeRequest cancelSubscribeRequest) { + String body = JSONObject.toJSONString(cancelSubscribeRequest); + String resultStr = HikUtil.hikApi(HikUri.EVENT_CANCEL, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (!"0".equals(resultJson.get("code"))) { + log.error("请求海康,取消订阅失败,海康response:{}", resultStr); + return ResponseData.error("取消订阅失败"); + } + return ResponseData.success(resultJson); + } + + /** * 单个添加海康人脸分组 * api->hik单个添加人脸分组api->response->mysql */ - @PostMapping("/faceGroup/single/add") + @PostMapping("/hik/faceGroup/single/add") @ResponseBody public Object faceGroupAddition(@RequestBody FaceGroupAdditionRequest faceGroupAdditionRequest) { String body = JSONObject.toJSONString(faceGroupAdditionRequest); @@ -212,7 +282,7 @@ * 批量添加海康组织 * api->hik批量添加组织api->response */ - @PostMapping("/org/batch/add") + @PostMapping("/hik/org/batch/add") @ResponseBody public Object orgBatchAdd(@RequestBody List orgBatchAddRequest) { String body = JSONObject.toJSONString(orgBatchAddRequest); @@ -232,4 +302,62 @@ return ResponseData.error("批量添加组织失败"); } + /** + * 获取人员列表 + */ + @PostMapping("/hik/person/personList") + @ResponseBody + public Object personList() { + PersonListRequest request = new PersonListRequest(); + request.setPageNo(1); + request.setPageSize(100); + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi("/api/resource/v2/person/personList", body); + return resultStr; + } + + /** + * 获取组织列表 + */ + @PostMapping("/hik/org/orgList") + @ResponseBody + public Object orgList() { + PersonListRequest request = new PersonListRequest(); + request.setPageNo(1); + request.setPageSize(100); + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi("/api/resource/v1/org/orgList", body); + return resultStr; + } + + /** + * 查询访客权限下载记录 + */ + @PostMapping("/hik/auth/result") + @ResponseBody + public Object authResult() { + PersonListRequest request = new PersonListRequest(); + request.setPageNo(1); + request.setPageSize(100); + request.setOrderId("ba101db6246711edaea66f7939a13638"); + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi("/api/visitor/v1/auth/result", body); + return resultStr; + } + + /** + * 人脸图片获取 + */ + @PostMapping("/hik/face/picture") + @ResponseBody + public Object facePicture() { + FaceRequest request = new FaceRequest(); +// List list = new ArrayList<>(); +// list.add(""); + request.setCertificateNum("wanggong"); + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi("/api/frs/v1/face", body); + return resultStr; + } + } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/AssetInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/AssetInfoMapper.java index 4f64e83..c0684ee 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/AssetInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/AssetInfoMapper.java @@ -17,6 +17,6 @@ @Mapper public interface AssetInfoMapper extends BaseMapper { - List getAssetInfoListPage(@Param("page") Page page, AssetInfoRequest assetInfoRequest); + List getAssetInfoListPage(@Param("page") Page page, @Param("assetInfoRequest") AssetInfoRequest assetInfoRequest); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/AttendanceInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/AttendanceInfoMapper.java index f9e793e..ec87e46 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/AttendanceInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/AttendanceInfoMapper.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.statistics.AttendanceNumberDTO; import com.casic.missiles.modular.dto.statistics.AttendanceRatioDTO; import com.casic.missiles.modular.model.AttendanceInfo; import org.apache.ibatis.annotations.Mapper; @@ -17,7 +18,7 @@ */ @Mapper public interface AttendanceInfoMapper extends BaseMapper { - List getAttendanceInfoListPage(@Param("page") Page page, StaffInfoRequest attendanceInfoRequest); + List getAttendanceInfoListPage(@Param("page") Page page, @Param("attendanceInfoRequest") StaffInfoRequest attendanceInfoRequest); AttendanceInfo selectByCodeAndDate(@Param("staffCode") String staffCode); @@ -26,4 +27,8 @@ List getCountByTypeAndDateForMonth(@Param("staffType")String staffType); List getCountByTypeAndDateForYear(@Param("staffType")String staffType); + + List getCountForWeek(); + + List getCountForDay(); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java index ce94b8f..6137a7d 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java @@ -17,5 +17,5 @@ @Mapper public interface BlackInfoMapper extends BaseMapper { - List getBlackInfoListPage(@Param("page") Page page, BlackInfoRequest blackInfoRequest); + List getBlackInfoListPage(@Param("page") Page page, @Param("blackInfoRequest") BlackInfoRequest blackInfoRequest); } 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 efda6b3..50aaa6f 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 @@ -20,7 +20,7 @@ List getCaseInfoListPage(@Param("page") Page page, @Param("caseInfoRequest") CaseInfoRequest caseInfoRequest); - int updateStatusById(CaseInfoRequest caseInfoRequest); + int updateStatusById(@Param("caseInfoRequest") CaseInfoRequest caseInfoRequest); List selectByLevelAndMonth(@Param("year") String year); @@ -47,4 +47,20 @@ List selectPreWeekCountByThirtyDay(); List selectPreDayCountBySevenDay(); + + Integer selectDemobilizedCount(@Param("eventType") Number personnelDemobilizedEvent); + + List selectPreMonthCount(); + + List selectListBySevenDay(); + + List selectListByToday(); + + List selectListByToday2(); + + List selectListByToday3(); + + List selectListByType(@Param("eventType") Number eventType); + + List selectDemobilizedCountByHour(@Param("eventType") Number eventType); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/CategoryLevelMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/CategoryLevelMapper.java index 52fc714..afe1650 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/CategoryLevelMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/CategoryLevelMapper.java @@ -17,9 +17,9 @@ @Mapper public interface CategoryLevelMapper extends BaseMapper { - List getCaseCategoryLevelListPage(@Param("page") Page page, CategoryLevelRequest categoryLevelRequest); + List getCaseCategoryLevelListPage(@Param("page") Page page, @Param("categoryLevelRequest") CategoryLevelRequest categoryLevelRequest); - List getCaseCategoryLevelList(CategoryLevelRequest categoryLevelRequest); + List getCaseCategoryLevelList(@Param("categoryLevelRequest") CategoryLevelRequest categoryLevelRequest); CaseCategoryLevel getCaseCategoryLevel(@Param("categoryLevelCode") String categoryLevelCode); 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 66353b1..2555a09 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 @@ -19,7 +19,7 @@ @Mapper public interface DeviceInfoMapper extends BaseMapper { - List getDeviceInfoListPage(@Param("page") Page page, DeviceInfoRequest deviceInfoRequest); + List getDeviceInfoListPage(@Param("page") Page page, @Param("deviceInfoRequest") DeviceInfoRequest deviceInfoRequest); List getDeviceInfoList(@Param("deviceInfoRequest") DeviceInfoRequest deviceInfoRequest); @@ -27,6 +27,8 @@ DeviceInfo getByIndexCode(@Param("srcIndex") String srcIndex); + DeviceInfo getByIp(@Param("ip") String ip); + List selectIndexCodesByCodes(@Param("deviceCodes") List deviceCodes); List selectByType(@Param("devType") String devType); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java index 41dd0af..5bfaf63 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java @@ -5,6 +5,7 @@ import com.casic.missiles.modular.dto.DeviceRepairRequest; import com.casic.missiles.modular.model.DeviceRepairLog; import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; import java.util.List; @@ -16,7 +17,7 @@ @Mapper public interface DeviceRepairLogMapper extends BaseMapper { - List getDeviceRepairListPage(Page page, DeviceRepairRequest deviceRepairRequest); + List getDeviceRepairListPage(@Param("page") Page page, @Param("deviceRepairRequest")DeviceRepairRequest deviceRepairRequest); - List getDeviceRepairList(DeviceRepairRequest deviceRepairRequest); + List getDeviceRepairList(@Param("deviceRepairRequest") DeviceRepairRequest deviceRepairRequest); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java index 9035c47..4823ac1 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java @@ -18,7 +18,7 @@ @Mapper public interface FireEquipInfoMapper extends BaseMapper { - List getFireEquipInfoListPage(@Param("page") Page page, FireEquipRequest fireEquipRequest); + List getFireEquipInfoListPage(@Param("page") Page page, @Param("fireEquipRequest") FireEquipRequest fireEquipRequest); FireEquipInfo getFireEquipInfo(@Param("equipCode") String equipCode); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/GateGroupMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/GateGroupMapper.java index d8c330d..977a427 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/GateGroupMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/GateGroupMapper.java @@ -17,7 +17,7 @@ */ @Mapper public interface GateGroupMapper extends BaseMapper { - List getGateGroupListPage(@Param("page") Page page, GateGroupRequest gateGroupRequest); + List getGateGroupListPage(@Param("page") Page page, @Param("gateGroupRequest") GateGroupRequest gateGroupRequest); GateGroup getGateGroupByName(@Param("groupName") String groupName); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/HazardLevelMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/HazardLevelMapper.java index 8957780..dcf47bb 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/HazardLevelMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/HazardLevelMapper.java @@ -17,11 +17,13 @@ @Mapper public interface HazardLevelMapper extends BaseMapper { - List getCaseHazardLevelListPage(@Param("page") Page page, HazardLevelRequest hazardLevelRequest); + List getCaseHazardLevelListPage(@Param("page") Page page, @Param("hazardLevelRequest") HazardLevelRequest hazardLevelRequest); - List getCaseHazardLevelList(HazardLevelRequest hazardLevelRequest); + List getCaseHazardLevelList(@Param("hazardLevelRequest") HazardLevelRequest hazardLevelRequest); CaseHazardLevel getCaseHazardLevel(@Param("hazardLevelCode") String hazardLevelCode); List selectHazardName(); + + String selectHazardNameByCode(@Param("hazardLevelCode") String hazardLevelCode); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/HikCaseDefineMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/HikCaseDefineMapper.java index 0dc47d1..f162fef 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/HikCaseDefineMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/HikCaseDefineMapper.java @@ -12,5 +12,5 @@ */ @Mapper public interface HikCaseDefineMapper extends BaseMapper { - HikCaseDefine getHikCaseDefine(@Param("caseTypeCode") Long caseTypeCode); + HikCaseDefine getHikCaseDefine(@Param("caseTypeCode") Number caseTypeCode); } 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 f8a674c..fe5afc2 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 @@ -17,11 +17,13 @@ @Mapper public interface StaffInfoMapper extends BaseMapper { - List getStaffInfoListPage(@Param("page") Page page, StaffInfoRequest staffInfoRequest); + List getStaffInfoListPage(@Param("page") Page page, @Param("staffInfoRequest") StaffInfoRequest staffInfoRequest); StaffInfo selectByCode(@Param("staffCode") String staffCode); - List getStaffInfoList(StaffInfoRequest staffInfoRequest); + List getStaffInfoList(@Param("staffInfoRequest") StaffInfoRequest staffInfoRequest); - List selectBatchCodes(List list); + List selectBatchCodes(@Param("list") List list); + + int updateByCodeForCard(@Param("staffCode") String staffCode, @Param("cardNo") String cardNo); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitInfoMapper.java index b1217c5..6c52542 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitInfoMapper.java @@ -16,7 +16,7 @@ */ @Mapper public interface VisitInfoMapper extends BaseMapper { - List getVisitInfoListPage(@Param("page") Page page, VisitorRequest visitorRequest); + List getVisitInfoListPage(@Param("page") Page page, @Param("visitorRequest") VisitorRequest visitorRequest); VisitInfo selectByOrderId(@Param("orderId") String orderId); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitorApplyMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitorApplyMapper.java index c09f3c0..6ea55bd 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitorApplyMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitorApplyMapper.java @@ -18,7 +18,7 @@ @Mapper public interface VisitorApplyMapper extends BaseMapper { - List getVisitorApplyListPage(@Param("page") Page page, VisitorApplyRequest visitorApplyRequest); + List getVisitorApplyListPage(@Param("page") Page page, @Param("visitorApplyRequest") VisitorApplyRequest visitorApplyRequest); List selectByVisitReason(); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/AttendanceInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/AttendanceInfoMapper.xml index b2ece71..f8bdd6e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/AttendanceInfoMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/AttendanceInfoMapper.xml @@ -43,7 +43,8 @@ and staff_type = #{staffType} - and YEARWEEK(date_format(atte_date, '%Y-%m-%d'), 1) = YEARWEEK(now(),1); + AND DATE_SUB(CURDATE(), INTERVAL 7 DAY) <= DATE(atte_date) + GROUP BY DATE_FORMAT(atte_date, '%Y-%m-%d') @@ -69,4 +70,20 @@ GROUP BY DATE_FORMAT(atte_date, '%Y-%m') + + + \ No newline at end of file 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 2b6953f..06ec0a8 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 @@ -28,7 +28,9 @@ @@ -87,7 +89,8 @@ SELECT hazard_level_code as levelCode, count(id) as quantity FROM bus_case_info WHERE hazard_level_code is not null - AND DATE_SUB(CURDATE(), INTERVAL 7 DAY) <= date(happen_time); + AND is_key_area = 1 + AND DATE_SUB(CURDATE(), INTERVAL 7 DAY) <= date(happen_time) GROUP BY hazard_level_code @@ -95,7 +98,8 @@ SELECT hazard_level_code as levelCode, count(id) as quantity FROM bus_case_info WHERE hazard_level_code is not null - AND DATE_SUB(CURDATE(), INTERVAL 30 DAY) <= date(happen_time); + AND is_key_area = 1 + AND DATE_SUB(CURDATE(), INTERVAL 30 DAY) <= date(happen_time) GROUP BY hazard_level_code @@ -122,4 +126,71 @@ AND hazard_level_code is not null GROUP BY DATE_FORMAT(happen_time,'%Y-%m-%d') + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/CategoryLevelMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/CategoryLevelMapper.xml index 4670b1f..1d25cbd 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/CategoryLevelMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/CategoryLevelMapper.xml @@ -20,11 +20,11 @@ SELECT * FROM bus_case_category_level WHERE 1=1 - - and code = #{code} + + and code = #{categoryLevelRequest.code} - - and name = #{name} + + and name = #{categoryLevelRequest.name} ORDER by create_time DESC 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 9b66fd8..bfd84b7 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 @@ -98,4 +98,10 @@ #{item} + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceRepairLogMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceRepairLogMapper.xml index 078ed3c..cf1a481 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceRepairLogMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceRepairLogMapper.xml @@ -22,14 +22,14 @@ SELECT * FROM bus_device_repair_log WHERE 1=1 - - and device_code = #{devCode} + + and device_code = #{deviceRepairRequest.devCode} - - and device_name = #{devName} + + and device_name = #{deviceRepairRequest.devName} - - and DATE_FORMAT(create_time,"%y%m%d") = DATE_FORMAT(#{createTime},"%y%m%d") + + and DATE_FORMAT(create_time,"%y%m%d") = DATE_FORMAT(#{deviceRepairRequest.createTime},"%y%m%d") ORDER by create_time DESC diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/HazardLevelMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/HazardLevelMapper.xml index f16f2b9..458322b 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/HazardLevelMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/HazardLevelMapper.xml @@ -20,11 +20,11 @@ SELECT * FROM bus_case_hazard_level WHERE 1=1 - - and code = #{code} + + and code = #{hazardLevelRequest.code} - - and name = #{name} + + and name = #{hazardLevelRequest.name} ORDER by create_time DESC @@ -42,4 +42,10 @@ SELECT name FROM bus_case_hazard_level + + \ 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 557237e..b6a183a 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 @@ -50,4 +50,10 @@ + + + UPDATE bus_staff_info + SET card_no = #{cardNo} + WHERE staff_code = #{staffCode} + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitInfoMapper.xml index 84aa84f..230529a 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitInfoMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitInfoMapper.xml @@ -27,5 +27,6 @@ SELECT * FROM bus_visit_info WHERE order_id = #{orderId} and DATE_FORMAT(in_time,'%Y-%m-%d') = CURRENT_DATE + limit 1 \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/BlackListController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/BlackListController.java index a27f9f8..0c06661 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/BlackListController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/BlackListController.java @@ -1,13 +1,18 @@ package com.casic.missiles.modular.controller; +import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.base.controller.ExportController; import com.casic.missiles.core.page.PageFactory; import com.casic.missiles.model.response.ResponseData; import com.casic.missiles.modular.dto.BlackInfoRequest; +import com.casic.missiles.modular.dto.BlackPictureRequest; +import com.casic.missiles.modular.dto.hik.PersonInfoRequest; +import com.casic.missiles.modular.enums.HikUri; import com.casic.missiles.modular.enums.OperateTypeEnum; import com.casic.missiles.modular.model.BlackInfo; import com.casic.missiles.modular.service.BlackInfoService; +import com.casic.missiles.modular.util.HikUtil; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; @@ -56,4 +61,22 @@ return null; } + /** + * 黑名单人员照片 + */ + @PostMapping("/personPicture") + @ResponseBody + public Object personPicture(@RequestBody BlackPictureRequest blackPictureRequest){ + //获取照片 + String picUri = blackPictureRequest.getPicUri(); + String serverIndexCode = blackPictureRequest.getServerIndexCode(); + PersonInfoRequest picRequest = new PersonInfoRequest(); + picRequest.setPicUri(picUri); + picRequest.setServerIndexCode(serverIndexCode); + String reBody = JSONObject.toJSONString(picRequest); + //重定向地址获取 + String url = HikUtil.hikApiFor302(HikUri.PERSON_PICTURE, reBody); + return ResponseData.success(url); + } + } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/DeviceController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/DeviceController.java index e1c4eba..666bbee 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/DeviceController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/DeviceController.java @@ -107,7 +107,7 @@ } /** - * 设备维修管理查询(分页),需计算MTTR=总维修时间/故障次数 + * 设备状态计算与评判/设备维修管理查询(分页),需计算MTTR=总维修时间/故障次数 */ @PostMapping("/repair/listPage") @ResponseBody @@ -211,7 +211,7 @@ //需根据设备编号获取到对应的门禁点唯一标识 doorControlRequest.setDoorIndexCodes(indexCodes); doorControlRequest.setControlType(Integer.valueOf(gateGroupDTO.getStatus())); - String body = JSONObject.toJSONString(deviceCodes); + String body = JSONObject.toJSONString(doorControlRequest); String resultStr = HikUtil.hikApi(HikUri.DOOR_CONTROL, body); JSONObject resultJson = (JSONObject)JSONObject.parse(resultStr); if (!"0".equals(resultJson.get("code"))) { diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/StaffController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/StaffController.java index b58ccab..704093c 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/StaffController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/StaffController.java @@ -2,15 +2,21 @@ import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.util.StrUtil; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.base.controller.ExportController; import com.casic.missiles.core.page.PageFactory; import com.casic.missiles.model.response.ErrorResponseData; import com.casic.missiles.model.response.ResponseData; import com.casic.missiles.modular.dto.StaffInfoRequest; +import com.casic.missiles.modular.dto.hik.PersonInfoRequest; +import com.casic.missiles.modular.dto.hik.StaffCardRequest; +import com.casic.missiles.modular.enums.HikUri; import com.casic.missiles.modular.enums.OperateTypeEnum; import com.casic.missiles.modular.model.StaffInfo; import com.casic.missiles.modular.service.StaffInfoService; +import com.casic.missiles.modular.util.HikUtil; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; @@ -110,4 +116,60 @@ } return ResponseData.success(); } + + /** + * 批量开卡,添加人员之后调用,若在一个接口中添加人员成功开卡失败则第二次添加时会有问题 + */ + @PostMapping("/cardBinding") + @ResponseBody + public Object cardBinding(@RequestBody StaffCardRequest staffCardRequest) { + String body = JSONObject.toJSONString(staffCardRequest); + String resultStr = HikUtil.hikApi(HikUri.CARD_BINDING, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (!"0".equals(resultJson.get("code"))) { + log.error("请求海康,批量开卡失败,海康response:{}", resultStr); + return ResponseData.error("批量开卡失败"); + } + //保存卡号 + if(staffInfoService.saveCardInfo(staffCardRequest) > 0){ + return ResponseData.success(); + } + return ResponseData.error("批量开卡失败"); + } + + /** + * 获取员工照片,海康存储 + */ + @PostMapping("/personPicture/{staffCode}") + @ResponseBody + public Object personPicture(@PathVariable("staffCode") String staffCode){ + //获取员工详细信息,含图片服务器、uri + PersonInfoRequest request = new PersonInfoRequest(); + List list = new ArrayList<>(); + list.add(staffCode); + request.setParamName("personId"); + request.setParamValue(list); + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi(HikUri.PERSON_INFO, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (!"0".equals(resultJson.get("code"))) { + log.error("请求海康,根据人员唯一字段获取人员详细信息失败,海康response:{}", resultStr); + return ResponseData.error("获取员工照片失败"); + } + //获取照片 + JSONObject data = (JSONObject) resultJson.get("data"); + JSONArray dataArray = (JSONArray) data.get("list"); + JSONObject jsonObject = (JSONObject) dataArray.get(0); + JSONArray personPhoto = (JSONArray) jsonObject.get("personPhoto"); + JSONObject photo = (JSONObject) personPhoto.get(0); + String picUri = photo.getString("picUri"); + String serverIndexCode = photo.getString("serverIndexCode"); + PersonInfoRequest picRequest = new PersonInfoRequest(); + picRequest.setPicUri(picUri); + picRequest.setServerIndexCode(serverIndexCode); + String reBody = JSONObject.toJSONString(picRequest); + //重定向地址获取 + String url = HikUtil.hikApiFor302(HikUri.PERSON_PICTURE, reBody); + return ResponseData.success(url); + } } 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 4a07dd9..7b1dcf6 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 @@ -16,6 +16,7 @@ import com.casic.missiles.modular.redis.key.CacheKeys; import com.casic.missiles.modular.service.CockpitService; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.util.CollectionUtils; import org.springframework.web.bind.annotation.*; @@ -24,10 +25,7 @@ import java.text.NumberFormat; import java.time.LocalDateTime; import java.time.temporal.ChronoUnit; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.util.*; import java.util.stream.Collectors; /** @@ -73,6 +71,9 @@ private StatisticNumberMapper numberMapper; @Autowired + private HazardLevelMapper hazardLevelMapper; + + @Autowired private AccessGroupConfig accessGroupConfig; /** @@ -104,8 +105,24 @@ public Object buildingNumberPerHour(){ //当天按小时分组的人数 List list = numberMapper.selectListByTime(); - Map> collect = list.stream().collect(Collectors.groupingBy(BuildingNumberDTO::getStatisticPosition)); - return ResponseData.success(collect); + Map> collect = list.stream().collect(Collectors.groupingBy(BuildingNumberDTO::getStatisticTime)); + //定时任务中已将每小时三栋楼人数存到数据库 + //将一期主楼和录制楼人数合并,二期单算 + List> resultList = new ArrayList<>(); + collect.keySet().forEach(key -> { + List buildingNumberDTOS = collect.get(key); + BuildingNumberDTO mainBuildingOne = buildingNumberDTOS.get(0); + BuildingNumberDTO mainBuildingTwo = buildingNumberDTOS.get(1); + BuildingNumberDTO recordingBuilding = buildingNumberDTOS.get(2); + HashMap resultMap = new HashMap<>(); + Integer oneQuantity = Integer.valueOf(mainBuildingOne.getStatisticQuantity()); + Integer recordingQuantity = Integer.valueOf(recordingBuilding.getStatisticQuantity()); + resultMap.put("staticTime", mainBuildingOne.getStatisticTime()); + resultMap.put(mainBuildingOne.getStatisticPositionName()+"、"+recordingBuilding.getStatisticPositionName(), String.valueOf(oneQuantity+recordingQuantity)); + resultMap.put(mainBuildingTwo.getStatisticPositionName(), mainBuildingTwo.getStatisticQuantity()); + resultList.add(resultMap); + }); + return ResponseData.success(resultList); } /** @@ -151,12 +168,11 @@ public Object securityNumber() { QueryWrapper wrapper = new QueryWrapper<>(); wrapper.eq("staff_type", 2); + // TODO: 2022/9/2 后续使用产品确定的每天出勤的安保人员的数量 Integer total = staffInfoMapper.selectCount(wrapper); - //当日离岗事件个数 - QueryWrapper wrapper1 = new QueryWrapper<>(); - wrapper1.eq("hik_event_type", SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); - wrapper1.apply("date_format(now(),'%Y-%m-%d') = date_format(happen_time,'%Y-%m-%d')"); - Integer leave = caseInfoMapper.selectCount(wrapper1); + //当日离岗事件按设备去重后的个数 + // TODO: 2022/9/2 目前相当于24小时内的计算,之后看需要可改成自定义小时数计算离岗率,即离岗+6小时内仅一次离岗则恢复为100%,多次则累加离岗次数计算离岗率 + Integer leave = caseInfoMapper.selectDemobilizedCount(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); NumberFormat numberFormat = NumberFormat.getInstance(); // 设置精确到小数点后2位 numberFormat.setMaximumFractionDigits(2); @@ -179,7 +195,6 @@ @ResponseBody public Object visitorApplyDetail() { List reasonGroup = applyMapper.selectByVisitReason(); - HashMap resultMap = new HashMap<>(); NumberFormat numberFormat = NumberFormat.getInstance(); // 设置精确到小数点后2位 numberFormat.setMaximumFractionDigits(2); @@ -187,12 +202,17 @@ if(0 == sum){ return ResponseData.success(); } + List resultList = new ArrayList<>(); reasonGroup.forEach(group -> { String reasonName = dictService.getDictNameByCode(SecurityEventDict.VISIT_REASON, group.getVisitReason()); String result = numberFormat.format((float) group.getQuantity() / (float) sum * 100); - resultMap.put(reasonName, result+"%"); + ApplyReasonGroupDTO applyReasonGroupDTO = new ApplyReasonGroupDTO(); + applyReasonGroupDTO.setQuantity(group.getQuantity()); + applyReasonGroupDTO.setVisitReason(reasonName); + applyReasonGroupDTO.setRatio(result+"%"); + resultList.add(applyReasonGroupDTO); }); - return ResponseData.success(resultMap); + return ResponseData.success(resultList); } /** @@ -247,6 +267,32 @@ } /** + * 机动力量实时在岗率,在岗人数除以总应在岗人数,用离岗+6小时内恢复为100%,6小时外再计算 + */ + @GetMapping("/staff/beOnDutyRatio") + @ResponseBody + public Object beOnDutyRatio() { + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("staff_type", 2); + // TODO: 2022/9/2 后续使用产品确定的每天出勤的安保人员的数量 + Integer total = staffInfoMapper.selectCount(wrapper); + if(0 == total){ + return ResponseData.success(null); + } + //当日离岗事件按设备去重后的个数 + // TODO: 2022/9/2 目前相当于24小时内的计算,之后看需要可改成自定义小时数计算离岗率,即离岗+6小时内仅一次离岗则恢复为100%,多次则累加离岗次数计算离岗率 + List onDutyRatioDTOS = caseInfoMapper.selectDemobilizedCountByHour(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); + onDutyRatioDTOS.forEach(dto -> { + NumberFormat numberFormat = NumberFormat.getInstance(); + // 设置精确到小数点后2位 + numberFormat.setMaximumFractionDigits(2); + String result = numberFormat.format(100 - Float.valueOf(dto.getQuantity()) / (float) total * 100); + dto.setRatio(result+"%"); + }); + return ResponseData.success(onDutyRatioDTOS); + } + + /** * 闸机速通门统计-设备状态分组计算数量,devType传闸机字典key * 视频频监控摄像机统计-设备状态分组计算数量,devType传摄像头字典key */ @@ -262,12 +308,17 @@ if(sum <= 0){ return ResponseData.error("无该类设备信息"); } + List resultList = new ArrayList<>(); gateStatusGroup.forEach(group -> { String devStatus = dictService.getDictNameByCode(SecurityEventDict.DEVICE_STATUS, group.getStatus()); String result = numberFormat.format((float) group.getQuantity() / (float) sum * 100); - resultMap.put(devStatus, result+"%"); + GateStatusGroupResponse gateStatusGroupResponse = new GateStatusGroupResponse(); + gateStatusGroupResponse.setStatus(devStatus); + gateStatusGroupResponse.setRatio(result+"%"); + resultList.add(gateStatusGroupResponse); }); - resultMap.put("总", sum); + resultMap.put("total", sum); + resultMap.put("list", resultList); return ResponseData.success(resultMap); } @@ -282,17 +333,38 @@ String position = securityScoreDTO.getPosition(); List caseInfos = caseInfoMapper.selectByPosition(position); //查询各危险级别权重、各类别权重,放入map,避免循环中多次查数据库 - + HashMap hazardScoreMap = new HashMap<>(); + List caseHazardLevelList = hazardLevelMapper.getCaseHazardLevelList(null); + caseHazardLevelList.forEach(hazardLevel -> { + hazardScoreMap.put(hazardLevel.getCode(), hazardLevel.getWeight()); + }); + HashMap categoryScoreMap = new HashMap<>(); + List categoryLevelList = categoryLevelMapper.getCaseCategoryLevelList(null); + categoryLevelList.forEach(categoryLevel -> { + categoryScoreMap.put(categoryLevel.getCode(), categoryLevel.getWeight()); + }); + //事件按楼层分组,计算 List securityScoreDTOs = new ArrayList<>(); caseInfos.forEach(caseInfo -> { SecurityScoreDTO securityScoreDTO1 = new SecurityScoreDTO(); + securityScoreDTO1.setPosition(caseInfo.getPosition()); securityScoreDTO1.setArea(caseInfo.getArea()); - // TODO: 2022/8/4 楼层评分计算根据产品定义调整 -// caseInfo.get -// securityScoreDTO1.setScore(); + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); + Double score = 100 - Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + securityScoreDTO1.setScore(score); + securityScoreDTOs.add(securityScoreDTO1); }); - - return null; + 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); + }); + return ResponseData.success(securityScoreDTOs); } /** @@ -303,9 +375,13 @@ public Object SecurityFrequency(@RequestBody SecurityFrequencyDTO securityFrequencyDTO) { String year = securityFrequencyDTO.getYear(); String month = securityFrequencyDTO.getMonth(); - Integer quantity = caseInfoMapper.selectCountByMonth(year, month); - securityFrequencyDTO.setQuantity(quantity); - return ResponseData.success(securityFrequencyDTO); + if(!StringUtils.isEmpty(year) && StringUtils.isEmpty(month)){ + Integer quantity = caseInfoMapper.selectCountByMonth(year, month); + securityFrequencyDTO.setQuantity(quantity); + return ResponseData.success(securityFrequencyDTO); + } + List list = caseInfoMapper.selectPreMonthCount(); + return ResponseData.success(list); } } 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 ae4d770..f4f075c 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 @@ -1,20 +1,25 @@ package com.casic.missiles.modular.controller.cockpit; +import cn.hutool.core.date.DateUnit; import cn.hutool.core.date.DateUtil; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.casic.missiles.model.response.ResponseData; -import com.casic.missiles.modular.dao.AttendanceInfoMapper; -import com.casic.missiles.modular.dao.CaseInfoMapper; -import com.casic.missiles.modular.dao.HazardLevelMapper; -import com.casic.missiles.modular.dao.StaffInfoMapper; +import com.casic.missiles.modular.dao.*; +import com.casic.missiles.modular.dto.DeviceRepairLogDTO; +import com.casic.missiles.modular.dto.DeviceRepairRequest; import com.casic.missiles.modular.dto.statistics.*; +import com.casic.missiles.modular.enums.SecurityEventType; +import com.casic.missiles.modular.model.CaseCategoryLevel; import com.casic.missiles.modular.model.CaseHazardLevel; +import com.casic.missiles.modular.model.CaseInfo; import com.casic.missiles.modular.model.StaffInfo; +import com.casic.missiles.modular.service.DeviceInfoService; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.util.CollectionUtils; import org.springframework.web.bind.annotation.*; +import java.math.BigDecimal; import java.text.NumberFormat; import java.util.*; import java.util.stream.Collectors; @@ -40,6 +45,12 @@ @Autowired private HazardLevelMapper hazardLevelMapper; + @Autowired + private CategoryLevelMapper categoryLevelMapper; + + @Autowired + private DeviceInfoService deviceInfoService; + /** * 安防事件时域频次统计,每月的每天安防事件个数(原方案) * 月维度:展示每个月的每天的数据 @@ -89,15 +100,17 @@ List monthList = caseInfoMapper.selectPreMonthCountByYear(year); Map> collect = monthList.stream().collect(Collectors.groupingBy(PreMonthOrWeekCaseDTO::getHazardLevelCode)); HashMap strAvgMap = new HashMap<>(); + List resultList = new ArrayList<>(); for (String key : collect.keySet()) { List preMonthOrWeekCaseDTOS = collect.get(key); int sum = preMonthOrWeekCaseDTOS.stream().mapToInt(PreMonthOrWeekCaseDTO::getQuantity).sum(); //若年份是本年,则使用个安防级别数量/当前月份数 //若不是本年,除数为12 MonthAndWeekDTO monthAndWeekDTO = new MonthAndWeekDTO(); + String hazardName = hazardLevelMapper.selectHazardNameByCode(key); + monthAndWeekDTO.setLevelName(hazardName); if(year.equals(String.valueOf(DateUtil.thisYear()))){ monthAndWeekDTO.setMonthQuantity(sum / DateUtil.thisMonth()); -// monthAndWeekDTO.setLevelName(); strAvgMap.put(key, monthAndWeekDTO); }else{ monthAndWeekDTO.setMonthQuantity(sum / 12); @@ -113,27 +126,37 @@ if(year.equals(String.valueOf(DateUtil.thisYear()))){ if(!Objects.isNull(strAvgMap.get(key))){ MonthAndWeekDTO monthAndWeekDTO = strAvgMap.get(key); + String hazardName = hazardLevelMapper.selectHazardNameByCode(key); + monthAndWeekDTO.setLevelName(hazardName); monthAndWeekDTO.setWeekQuantity(sum / DateUtil.thisWeekOfYear()); strAvgMap.put(key, monthAndWeekDTO); }else{ MonthAndWeekDTO monthAndWeekDTO = new MonthAndWeekDTO(); + String hazardName = hazardLevelMapper.selectHazardNameByCode(key); + monthAndWeekDTO.setLevelName(hazardName); monthAndWeekDTO.setWeekQuantity(sum / DateUtil.thisWeekOfYear()); strAvgMap.put(key, monthAndWeekDTO); } }else{ if(!Objects.isNull(strAvgMap.get(key))){ MonthAndWeekDTO monthAndWeekDTO = strAvgMap.get(key); + String hazardName = hazardLevelMapper.selectHazardNameByCode(key); + monthAndWeekDTO.setLevelName(hazardName); monthAndWeekDTO.setWeekQuantity(sum / 52); strAvgMap.put(key, monthAndWeekDTO); }else{ MonthAndWeekDTO monthAndWeekDTO = new MonthAndWeekDTO(); + String hazardName = hazardLevelMapper.selectHazardNameByCode(key); + monthAndWeekDTO.setLevelName(hazardName); monthAndWeekDTO.setWeekQuantity(sum / 52); strAvgMap.put(key, monthAndWeekDTO); } } } - avgMonthAndWeekGroupDTO.setMap(strAvgMap); - return ResponseData.success(avgMonthAndWeekGroupDTO); + strAvgMap.keySet().forEach(key -> { + resultList.add(strAvgMap.get(key)); + }); + return ResponseData.success(resultList); } /** @@ -181,12 +204,178 @@ } /** - * 员工考勤人数变化,功能待定 + * 员工考勤人数变化,统计当天(横坐标为时)及近7天(横坐标为天)的考勤人数变化,只要发生一次考勤识别,次数的基数就正常增加(没有上班下班区分) */ + @PostMapping("/staff/attendanceNumber/{dimension}") + @ResponseBody + public Object attendanceNumber(@PathVariable("dimension") String dimension) { + List attendanceNumberDTOs = null; + List> resultList = new ArrayList<>(); + if("week".equals(dimension)){ + //近7天数据按天分组统计 + attendanceNumberDTOs = attendanceInfoMapper.getCountForWeek(); + }else if("day".equals(dimension)) { + //今天数据按小时分组统计 + attendanceNumberDTOs = attendanceInfoMapper.getCountForDay(); + } + if(CollectionUtils.isEmpty(attendanceNumberDTOs)){ + return ResponseData.error("该查询条件下,无员工出勤数据!"); + } + Map> collect = attendanceNumberDTOs.stream().collect(Collectors.groupingBy(AttendanceNumberDTO::getDate)); + collect.keySet().forEach(key -> { + List attendanceNumberDTOS = collect.get(key); + AttendanceNumberDTO attendanceNumberDTO = attendanceNumberDTOS.get(0); + AttendanceNumberDTO attendanceNumberDTO2 = attendanceNumberDTOS.get(1); + Map resultMap = new HashMap<>(); + resultMap.put(attendanceNumberDTO.getStaffType(), attendanceNumberDTO.getQuantity()); + resultMap.put(attendanceNumberDTO2.getStaffType(), attendanceNumberDTO2.getQuantity()); + resultMap.put("staticTime", attendanceNumberDTO.getDate()); + resultList.add(resultMap); + }); + return ResponseData.success(resultList); + } /** - * 近30天/近一周安保人员到岗排行 + * 早晚高峰区域安防评估 */ + @PostMapping("/security/assessment/{dimension}") + @ResponseBody + public Object securityAssessment(@PathVariable("dimension") String dimension) { + //查询各危险级别权重、各类别权重,放入map,避免循环中多次查数据库 + HashMap hazardScoreMap = new HashMap<>(); + List caseHazardLevelList = hazardLevelMapper.getCaseHazardLevelList(null); + caseHazardLevelList.forEach(hazardLevel -> { + hazardScoreMap.put(hazardLevel.getCode(), hazardLevel.getWeight()); + }); + HashMap categoryScoreMap = new HashMap<>(); + List categoryLevelList = categoryLevelMapper.getCaseCategoryLevelList(null); + categoryLevelList.forEach(categoryLevel -> { + categoryScoreMap.put(categoryLevel.getCode(), categoryLevel.getWeight()); + }); + HashMap hashMap = new HashMap<>(); + if("week".equals(dimension)){ + //近7天早晚高峰数据 + List caseInfos = caseInfoMapper.selectListBySevenDay(); + //按时间(天)进行分组 + caseInfos.forEach(caseInfo -> { + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); + Double score = Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + String[] array = caseInfo.getHappenTime().split(" "); + String dayTime = array[0]; + BigDecimal preScore; + if(hashMap.containsKey(dayTime)){ + Double aDouble = hashMap.get(dayTime); + preScore = new BigDecimal(aDouble.toString()); + + }else{ + preScore = new BigDecimal("100.0"); + } + BigDecimal nowScore = new BigDecimal(score.toString()); + hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); + }); + return ResponseData.success(hashMap); + }else if("day".equals(dimension)) { + //今天数据按小时分组统计 + List caseInfos = caseInfoMapper.selectListByToday(); + caseInfos.forEach(caseInfo -> { + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); + Double score = Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + String[] array = caseInfo.getHappenTime().split(":"); + String dayTime = array[0]; + BigDecimal preScore; + if(hashMap.containsKey(dayTime)){ + Double aDouble = hashMap.get(dayTime); + preScore = new BigDecimal(aDouble.toString()); + + }else{ + preScore = new BigDecimal("100.0"); + } + BigDecimal nowScore = new BigDecimal(score.toString()); + hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); + }); + return ResponseData.success(hashMap); + } + return null; + } + + /** + * 重点区域安防事态评估,统计重点区域6:00-23:00按小时分组数据 + */ + @GetMapping("/security/keyAreaStatistic") + @ResponseBody + public Object keyAreaStatistic() { + //查询各危险级别权重、各类别权重,放入map,避免循环中多次查数据库 + HashMap hazardScoreMap = new HashMap<>(); + List caseHazardLevelList = hazardLevelMapper.getCaseHazardLevelList(null); + caseHazardLevelList.forEach(hazardLevel -> { + hazardScoreMap.put(hazardLevel.getCode(), hazardLevel.getWeight()); + }); + HashMap categoryScoreMap = new HashMap<>(); + List categoryLevelList = categoryLevelMapper.getCaseCategoryLevelList(null); + categoryLevelList.forEach(categoryLevel -> { + categoryScoreMap.put(categoryLevel.getCode(), categoryLevel.getWeight()); + }); + HashMap hashMap = new HashMap<>(); + //今天数据按小时分组统计 + List caseInfos = caseInfoMapper.selectListByToday2(); + caseInfos.forEach(caseInfo -> { + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); + Double score = Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + String[] array = caseInfo.getHappenTime().split(":"); + String dayTime = array[0]; + BigDecimal preScore; + if(hashMap.containsKey(dayTime)){ + Double aDouble = hashMap.get(dayTime); + preScore = new BigDecimal(aDouble.toString()); + + }else{ + preScore = new BigDecimal("100.0"); + } + BigDecimal nowScore = new BigDecimal(score.toString()); + hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); + }); + return ResponseData.success(hashMap); + } + + /** + * 安防机动支援力量调配响应评估,根据事件已解决状态及已解决时间-发送时间,按时间(小时)分组统计 + */ + @GetMapping("/security/responseAssess") + @ResponseBody + public Object responseAssess() { + //查询各危险级别权重、各类别权重,放入map,避免循环中多次查数据库 + HashMap hazardScoreMap = new HashMap<>(); + List caseHazardLevelList = hazardLevelMapper.getCaseHazardLevelList(null); + caseHazardLevelList.forEach(hazardLevel -> { + hazardScoreMap.put(hazardLevel.getCode(), hazardLevel.getWeight()); + }); + HashMap hashMap = new HashMap<>(); + //今天数据按小时分组统计 + List caseInfos = caseInfoMapper.selectListByToday3(); + caseInfos.forEach(caseInfo -> { + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + //扣分=事件级别权重*未解决小时数 + Date updateTime = DateUtil.parse(caseInfo.getUpdateTime()); + Date happenTime = DateUtil.parse(caseInfo.getHappenTime()); + long between = DateUtil.between(updateTime, happenTime, DateUnit.HOUR); + Double score = Double.valueOf(hazardWeight)*between; + String[] array = caseInfo.getHappenTime().split(":"); + String dayTime = array[0]; + BigDecimal preScore; + if(hashMap.containsKey(dayTime)){ + Double aDouble = hashMap.get(dayTime); + preScore = new BigDecimal(aDouble.toString()); + }else{ + preScore = new BigDecimal("100.0"); + } + BigDecimal nowScore = new BigDecimal(score.toString()); + hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); + }); + return ResponseData.success(hashMap); + } /** * 重点区域威胁事件类型统计,优先级2,统计近7天和近30天 @@ -224,7 +413,34 @@ } /** - * 设备状态计算系数和评判,优先级3,需确认设备恢复时间是否可以获取 + * 近30天/近一周安保人员到岗排行 */ + + /** + * 安保等级评估,发生离岗事件减1分 + */ + @GetMapping("/security/levelAssess") + @ResponseBody + public Object securityLevelAssess() { + //今天数据按小时分组统计 + List resultList = caseInfoMapper.selectListByType(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); + resultList.forEach(result -> { + BigDecimal deScore = new BigDecimal(result.getQuantity()); + BigDecimal preScore = new BigDecimal("100.0"); + result.setScore(preScore.subtract(deScore).doubleValue()); + }); + return ResponseData.success(resultList); + } + + /** + * 设备状态计算系数和评判,即设备维修管理查询(不分页) + */ + @PostMapping("/device/repairList") + @ResponseBody + public Object repairList(@RequestBody DeviceRepairRequest deviceRepairRequest) { + List deviceRepairLogDTOS = deviceInfoService.deviceRepairListPage(deviceRepairRequest); + return ResponseData.success(deviceRepairLogDTOS); + } + } 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 fbf8ab6..c71a15a 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 @@ -1,13 +1,12 @@ package com.casic.missiles.modular.controller.hik; +import cn.hutool.core.date.DateTime; +import cn.hutool.core.date.DateUtil; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.casic.missiles.model.response.ResponseData; import com.casic.missiles.modular.dao.HikFaceGroupInfoMapper; -import com.casic.missiles.modular.dto.hik.EventSubscribeRequest; -import com.casic.missiles.modular.dto.hik.FaceGroupAdditionRequest; -import com.casic.missiles.modular.dto.hik.HikRecvEvent; -import com.casic.missiles.modular.dto.hik.OrgBatchAdd; +import com.casic.missiles.modular.dto.hik.*; import com.casic.missiles.modular.enums.HikUri; import com.casic.missiles.modular.enums.SecurityEventType; import com.casic.missiles.modular.model.CaseInfo; @@ -18,16 +17,20 @@ import com.casic.missiles.modular.util.CaseInfoFactoryUtil; import com.casic.missiles.modular.util.HikUtil; import com.casic.missiles.modular.util.ThreadPoolUtil; +import com.casic.missiles.modular.util.WebSocket; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; -import org.springframework.web.bind.annotation.*; +import org.springframework.util.CollectionUtils; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.RestController; -import java.net.InetAddress; -import java.net.UnknownHostException; import java.util.ArrayList; +import java.util.Iterator; import java.util.List; import java.util.Objects; @@ -38,7 +41,6 @@ */ @Slf4j @RestController -@RequestMapping("/hik") public class HikController { @Autowired @@ -53,28 +55,37 @@ @Autowired private HikService hikService; + @Autowired + private HikFaceGroupInfoMapper hikFaceGroupInfoMapper; + + @Autowired + private WebSocket webSocket; + @Value("${server.port}") private int serverPort; - @Autowired - private HikFaceGroupInfoMapper hikFaceGroupInfoMapper; /** * 海康事件订阅 */ - @PostMapping("/event/subscribe") + @PostMapping("/hik/event/subscribe") @ResponseBody - public Object eventSubscribe() throws UnknownHostException { + public Object eventSubscribe() { EventSubscribeRequest eventSubscribeRequest = new EventSubscribeRequest(); ArrayList list = new ArrayList<>(); list.add(SecurityEventType.DEVICE_OFFLINE); + list.add(SecurityEventType.DEVICE_ONLINE); list.add(SecurityEventType.KEY_PERSONNEL_IDENTIFY_EVENT); list.add(SecurityEventType.MONITORING_POINT_OFFLINE); + list.add(SecurityEventType.MONITORING_POINT_ONLINE); list.add(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); list.add(SecurityEventType.PERSONNEL_GATHER_EVENT); - InetAddress localHost = InetAddress.getLocalHost(); + list.add(SecurityEventType.VISITOR_REGISTER); + list.add(SecurityEventType.VISITOR_CHECKOUT); + list.add(SecurityEventType.HIGH_ALTITUDE_PARABOLIC); +// InetAddress localHost = InetAddress.getLocalHost(); eventSubscribeRequest.setEventTypes(list); - eventSubscribeRequest.setEventDest("https://" + localHost + ":" + serverPort + "/eventRcv"); + eventSubscribeRequest.setEventDest("http://" + "192.168.10.6" + ":" + serverPort + "/eventRcv"); //订阅类型,0-订阅原始事件,1-联动事件,2-原始事件和联动事件,不填使用默认值0 eventSubscribeRequest.setSubType(0); /** @@ -92,19 +103,25 @@ } /** + * 查询事件订阅信息 + */ + @PostMapping("/hik/event/query") + @ResponseBody + public Object eventQuery() { + String result = HikUtil.hikApi(HikUri.EVENT_INFO, ""); + return result; + } + + /** * 海康事件接收 */ @PostMapping("/eventRcv") @ResponseBody public Object eventRcv(@RequestBody HikRecvEvent hikRecvEvent) { //1、接收所需事件类型 - Long eventType = hikRecvEvent.getEventType(); + Number eventType = hikRecvEvent.getEventType(); log.info("接收到安防事件类型为:{}", eventType); CaseInfo caseInfo = caseInfoFactoryUtil.getCaseInfo(eventType); - //接收到不关心事件直接返回 - if(Objects.isNull(caseInfo)){ - return ResponseData.success(); - } //2、不同事件不同处理,caseInfoFactoryUtil已设置好事件基础定义信息 // 再为事件添加状态、设备编码、设备名称、位置、区域、时间 // 异步处理事件 @@ -114,19 +131,23 @@ caseHandle(hikRecvEvent, eventType, caseInfo); } })); +// caseHandle(hikRecvEvent, eventType, caseInfo); - return null; + return ResponseData.success(); } - private void caseHandle(HikRecvEvent hikRecvEvent, Long eventType, CaseInfo caseInfo) { + private void caseHandle(HikRecvEvent hikRecvEvent, Number eventType, CaseInfo caseInfo) { JSONArray eventArray = hikRecvEvent.getEventArray(); List caseInfos = new ArrayList<>(); - while (eventArray.stream().iterator().hasNext()) { + Iterator iterator = eventArray.iterator(); + while (iterator.hasNext()) { CaseInfo caseInfo1 = new CaseInfo(); - BeanUtils.copyProperties(caseInfo, caseInfo1); - JSONObject event = (JSONObject) eventArray.stream().iterator().next(); + if(!Objects.isNull(caseInfo)){ + BeanUtils.copyProperties(caseInfo, caseInfo1); + } + JSONObject event = (JSONObject) iterator.next(); //5种事件进行不同处理 - if(SecurityEventType.KEY_PERSONNEL_IDENTIFY_EVENT == eventType){ + if (SecurityEventType.KEY_PERSONNEL_IDENTIFY_EVENT.equals(eventType)) { //判断所属人脸分组 JSONObject data = (JSONObject) event.get("data"); JSONObject faceRecognitionResult = (JSONObject) data.get("faceRecognitionResult"); @@ -142,52 +163,101 @@ if (faceGroupCode.equals(blackListGroup.getFaceGroupCode())) { //黑名单分组处理 caseInfo1 = hikService.blackListHandle(event, caseInfo1); - }else if(faceGroupCode.equals(propertyPersonnelGroup.getFaceGroupCode())){ + } else if (faceGroupCode.equals(propertyPersonnelGroup.getFaceGroupCode())) { //考勤分组处理-物业人员,添加到考勤表 hikService.propertyAttendanceHandle(event); - }else if(faceGroupCode.equals(securityPersonnelGroup.getFaceGroupCode())){ + } else if (faceGroupCode.equals(securityPersonnelGroup.getFaceGroupCode())) { //考勤分组处理-安保人员,添加到考勤表 hikService.securityPersonnelHandle(event); - }else { + } else { return; } - }else if(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT == eventType){ + } else if (SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT.equals(eventType)) { //离岗事件处理 caseInfo1 = hikService.demobilizedHandle(event, caseInfo1); - }else if(SecurityEventType.PERSONNEL_GATHER_EVENT == eventType){ + } else if (SecurityEventType.PERSONNEL_GATHER_EVENT.equals(eventType)) { //人员聚集事件处理 caseInfo1 = hikService.personGatherHandle(event, caseInfo1); - }else if(SecurityEventType.MONITORING_POINT_OFFLINE == eventType){ + } else if (SecurityEventType.MONITORING_POINT_OFFLINE.equals(eventType)) { //监控点离线事件处理 caseInfo1 = hikService.monitorPointOfflineHandle(event, caseInfo1); - }else if(SecurityEventType.DEVICE_OFFLINE == eventType){ + } else if (SecurityEventType.MONITORING_POINT_ONLINE.equals(eventType)) { + //监控点上线事件处理 + hikService.monitorPointOnlineHandle(event); + } else if (SecurityEventType.DEVICE_OFFLINE.equals(eventType)) { //装置离线事件处理 caseInfo1 = hikService.deviceOfflineHandle(event, caseInfo1); - }else if(SecurityEventType.VISITOR_REGISTER == eventType){ + } else if (SecurityEventType.DEVICE_ONLINE.equals(eventType)) { + //装置上线处理 + hikService.deviceOnlineHandle(event); + } else if (SecurityEventType.VISITOR_REGISTER.equals(eventType)) { //记录访客登记记录,添加到访客记录表 hikService.visitorRegisterHandler(event); - }else if(SecurityEventType.VISITOR_CHECKOUT == eventType){ + } else if (SecurityEventType.VISITOR_CHECKOUT.equals(eventType)) { //记录访客签离记录 hikService.visitorCheckOutHandler(event); } - if(!Objects.isNull(caseInfo1) && !StringUtils.isEmpty(caseInfo1.getHappenTime())){ + if (!Objects.isNull(caseInfo1) && !StringUtils.isEmpty(caseInfo1.getHappenTime())) { caseInfos.add(caseInfo1); } } //3、安防事件入库 - if(!caseInfoService.insertCaseInfoBatch(caseInfos)){ - log.error("安防事件批量入库异常"); + if (!CollectionUtils.isEmpty(caseInfos) && !caseInfoService.insertCaseInfoBatch(caseInfos)) { + log.error("安防事件批量入库异常!"); } // TODO: 2022/8/15 webSocket推送 + if (CollectionUtils.isEmpty(caseInfos)) { + log.info("webSocket事件推送"); + webSocket.sendAllMessage(JSONObject.toJSONString(caseInfos)); + } return; } /** + * 以图搜图,前端用于轨迹追踪 + */ + @PostMapping("/hik/search/picture") + @ResponseBody + public Object searchPictures(@RequestBody SearchPicturesRequest searchPicturesRequest) { + DateTime startDateTime = DateUtil.parse(searchPicturesRequest.getStartTime()); + DateTime endDateTime = DateUtil.parse(searchPicturesRequest.getEndTime()); + String startTime = DateUtil.format(startDateTime, "yyyy-MM-dd'T'HH:mm:ss.SSSXXX"); + String endTime = DateUtil.format(endDateTime, "yyyy-MM-dd'T'HH:mm:ss.SSSXXX"); + searchPicturesRequest.setStartTime(startTime); + searchPicturesRequest.setEndTime(endTime); + String body = JSONObject.toJSONString(searchPicturesRequest); + String resultStr = HikUtil.hikApi(HikUri.SEARCH_PICTURES, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (!"0".equals(resultJson.get("code"))) { + log.error("请求海康,以图搜图失败,海康response:{}", resultStr); + return ResponseData.error("以图搜图失败"); + } + return ResponseData.success(resultJson); + } + + + /** + * 海康事件取消订阅 + */ + @PostMapping("/hik/event/cancel") + @ResponseBody + public Object eventCancelSubscribe(@RequestBody CancelSubscribeRequest cancelSubscribeRequest) { + String body = JSONObject.toJSONString(cancelSubscribeRequest); + String resultStr = HikUtil.hikApi(HikUri.EVENT_CANCEL, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (!"0".equals(resultJson.get("code"))) { + log.error("请求海康,取消订阅失败,海康response:{}", resultStr); + return ResponseData.error("取消订阅失败"); + } + return ResponseData.success(resultJson); + } + + /** * 单个添加海康人脸分组 * api->hik单个添加人脸分组api->response->mysql */ - @PostMapping("/faceGroup/single/add") + @PostMapping("/hik/faceGroup/single/add") @ResponseBody public Object faceGroupAddition(@RequestBody FaceGroupAdditionRequest faceGroupAdditionRequest) { String body = JSONObject.toJSONString(faceGroupAdditionRequest); @@ -212,7 +282,7 @@ * 批量添加海康组织 * api->hik批量添加组织api->response */ - @PostMapping("/org/batch/add") + @PostMapping("/hik/org/batch/add") @ResponseBody public Object orgBatchAdd(@RequestBody List orgBatchAddRequest) { String body = JSONObject.toJSONString(orgBatchAddRequest); @@ -232,4 +302,62 @@ return ResponseData.error("批量添加组织失败"); } + /** + * 获取人员列表 + */ + @PostMapping("/hik/person/personList") + @ResponseBody + public Object personList() { + PersonListRequest request = new PersonListRequest(); + request.setPageNo(1); + request.setPageSize(100); + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi("/api/resource/v2/person/personList", body); + return resultStr; + } + + /** + * 获取组织列表 + */ + @PostMapping("/hik/org/orgList") + @ResponseBody + public Object orgList() { + PersonListRequest request = new PersonListRequest(); + request.setPageNo(1); + request.setPageSize(100); + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi("/api/resource/v1/org/orgList", body); + return resultStr; + } + + /** + * 查询访客权限下载记录 + */ + @PostMapping("/hik/auth/result") + @ResponseBody + public Object authResult() { + PersonListRequest request = new PersonListRequest(); + request.setPageNo(1); + request.setPageSize(100); + request.setOrderId("ba101db6246711edaea66f7939a13638"); + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi("/api/visitor/v1/auth/result", body); + return resultStr; + } + + /** + * 人脸图片获取 + */ + @PostMapping("/hik/face/picture") + @ResponseBody + public Object facePicture() { + FaceRequest request = new FaceRequest(); +// List list = new ArrayList<>(); +// list.add(""); + request.setCertificateNum("wanggong"); + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi("/api/frs/v1/face", body); + return resultStr; + } + } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/AssetInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/AssetInfoMapper.java index 4f64e83..c0684ee 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/AssetInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/AssetInfoMapper.java @@ -17,6 +17,6 @@ @Mapper public interface AssetInfoMapper extends BaseMapper { - List getAssetInfoListPage(@Param("page") Page page, AssetInfoRequest assetInfoRequest); + List getAssetInfoListPage(@Param("page") Page page, @Param("assetInfoRequest") AssetInfoRequest assetInfoRequest); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/AttendanceInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/AttendanceInfoMapper.java index f9e793e..ec87e46 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/AttendanceInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/AttendanceInfoMapper.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.statistics.AttendanceNumberDTO; import com.casic.missiles.modular.dto.statistics.AttendanceRatioDTO; import com.casic.missiles.modular.model.AttendanceInfo; import org.apache.ibatis.annotations.Mapper; @@ -17,7 +18,7 @@ */ @Mapper public interface AttendanceInfoMapper extends BaseMapper { - List getAttendanceInfoListPage(@Param("page") Page page, StaffInfoRequest attendanceInfoRequest); + List getAttendanceInfoListPage(@Param("page") Page page, @Param("attendanceInfoRequest") StaffInfoRequest attendanceInfoRequest); AttendanceInfo selectByCodeAndDate(@Param("staffCode") String staffCode); @@ -26,4 +27,8 @@ List getCountByTypeAndDateForMonth(@Param("staffType")String staffType); List getCountByTypeAndDateForYear(@Param("staffType")String staffType); + + List getCountForWeek(); + + List getCountForDay(); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java index ce94b8f..6137a7d 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java @@ -17,5 +17,5 @@ @Mapper public interface BlackInfoMapper extends BaseMapper { - List getBlackInfoListPage(@Param("page") Page page, BlackInfoRequest blackInfoRequest); + List getBlackInfoListPage(@Param("page") Page page, @Param("blackInfoRequest") BlackInfoRequest blackInfoRequest); } 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 efda6b3..50aaa6f 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 @@ -20,7 +20,7 @@ List getCaseInfoListPage(@Param("page") Page page, @Param("caseInfoRequest") CaseInfoRequest caseInfoRequest); - int updateStatusById(CaseInfoRequest caseInfoRequest); + int updateStatusById(@Param("caseInfoRequest") CaseInfoRequest caseInfoRequest); List selectByLevelAndMonth(@Param("year") String year); @@ -47,4 +47,20 @@ List selectPreWeekCountByThirtyDay(); List selectPreDayCountBySevenDay(); + + Integer selectDemobilizedCount(@Param("eventType") Number personnelDemobilizedEvent); + + List selectPreMonthCount(); + + List selectListBySevenDay(); + + List selectListByToday(); + + List selectListByToday2(); + + List selectListByToday3(); + + List selectListByType(@Param("eventType") Number eventType); + + List selectDemobilizedCountByHour(@Param("eventType") Number eventType); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/CategoryLevelMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/CategoryLevelMapper.java index 52fc714..afe1650 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/CategoryLevelMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/CategoryLevelMapper.java @@ -17,9 +17,9 @@ @Mapper public interface CategoryLevelMapper extends BaseMapper { - List getCaseCategoryLevelListPage(@Param("page") Page page, CategoryLevelRequest categoryLevelRequest); + List getCaseCategoryLevelListPage(@Param("page") Page page, @Param("categoryLevelRequest") CategoryLevelRequest categoryLevelRequest); - List getCaseCategoryLevelList(CategoryLevelRequest categoryLevelRequest); + List getCaseCategoryLevelList(@Param("categoryLevelRequest") CategoryLevelRequest categoryLevelRequest); CaseCategoryLevel getCaseCategoryLevel(@Param("categoryLevelCode") String categoryLevelCode); 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 66353b1..2555a09 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 @@ -19,7 +19,7 @@ @Mapper public interface DeviceInfoMapper extends BaseMapper { - List getDeviceInfoListPage(@Param("page") Page page, DeviceInfoRequest deviceInfoRequest); + List getDeviceInfoListPage(@Param("page") Page page, @Param("deviceInfoRequest") DeviceInfoRequest deviceInfoRequest); List getDeviceInfoList(@Param("deviceInfoRequest") DeviceInfoRequest deviceInfoRequest); @@ -27,6 +27,8 @@ DeviceInfo getByIndexCode(@Param("srcIndex") String srcIndex); + DeviceInfo getByIp(@Param("ip") String ip); + List selectIndexCodesByCodes(@Param("deviceCodes") List deviceCodes); List selectByType(@Param("devType") String devType); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java index 41dd0af..5bfaf63 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java @@ -5,6 +5,7 @@ import com.casic.missiles.modular.dto.DeviceRepairRequest; import com.casic.missiles.modular.model.DeviceRepairLog; import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; import java.util.List; @@ -16,7 +17,7 @@ @Mapper public interface DeviceRepairLogMapper extends BaseMapper { - List getDeviceRepairListPage(Page page, DeviceRepairRequest deviceRepairRequest); + List getDeviceRepairListPage(@Param("page") Page page, @Param("deviceRepairRequest")DeviceRepairRequest deviceRepairRequest); - List getDeviceRepairList(DeviceRepairRequest deviceRepairRequest); + List getDeviceRepairList(@Param("deviceRepairRequest") DeviceRepairRequest deviceRepairRequest); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java index 9035c47..4823ac1 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java @@ -18,7 +18,7 @@ @Mapper public interface FireEquipInfoMapper extends BaseMapper { - List getFireEquipInfoListPage(@Param("page") Page page, FireEquipRequest fireEquipRequest); + List getFireEquipInfoListPage(@Param("page") Page page, @Param("fireEquipRequest") FireEquipRequest fireEquipRequest); FireEquipInfo getFireEquipInfo(@Param("equipCode") String equipCode); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/GateGroupMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/GateGroupMapper.java index d8c330d..977a427 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/GateGroupMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/GateGroupMapper.java @@ -17,7 +17,7 @@ */ @Mapper public interface GateGroupMapper extends BaseMapper { - List getGateGroupListPage(@Param("page") Page page, GateGroupRequest gateGroupRequest); + List getGateGroupListPage(@Param("page") Page page, @Param("gateGroupRequest") GateGroupRequest gateGroupRequest); GateGroup getGateGroupByName(@Param("groupName") String groupName); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/HazardLevelMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/HazardLevelMapper.java index 8957780..dcf47bb 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/HazardLevelMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/HazardLevelMapper.java @@ -17,11 +17,13 @@ @Mapper public interface HazardLevelMapper extends BaseMapper { - List getCaseHazardLevelListPage(@Param("page") Page page, HazardLevelRequest hazardLevelRequest); + List getCaseHazardLevelListPage(@Param("page") Page page, @Param("hazardLevelRequest") HazardLevelRequest hazardLevelRequest); - List getCaseHazardLevelList(HazardLevelRequest hazardLevelRequest); + List getCaseHazardLevelList(@Param("hazardLevelRequest") HazardLevelRequest hazardLevelRequest); CaseHazardLevel getCaseHazardLevel(@Param("hazardLevelCode") String hazardLevelCode); List selectHazardName(); + + String selectHazardNameByCode(@Param("hazardLevelCode") String hazardLevelCode); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/HikCaseDefineMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/HikCaseDefineMapper.java index 0dc47d1..f162fef 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/HikCaseDefineMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/HikCaseDefineMapper.java @@ -12,5 +12,5 @@ */ @Mapper public interface HikCaseDefineMapper extends BaseMapper { - HikCaseDefine getHikCaseDefine(@Param("caseTypeCode") Long caseTypeCode); + HikCaseDefine getHikCaseDefine(@Param("caseTypeCode") Number caseTypeCode); } 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 f8a674c..fe5afc2 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 @@ -17,11 +17,13 @@ @Mapper public interface StaffInfoMapper extends BaseMapper { - List getStaffInfoListPage(@Param("page") Page page, StaffInfoRequest staffInfoRequest); + List getStaffInfoListPage(@Param("page") Page page, @Param("staffInfoRequest") StaffInfoRequest staffInfoRequest); StaffInfo selectByCode(@Param("staffCode") String staffCode); - List getStaffInfoList(StaffInfoRequest staffInfoRequest); + List getStaffInfoList(@Param("staffInfoRequest") StaffInfoRequest staffInfoRequest); - List selectBatchCodes(List list); + List selectBatchCodes(@Param("list") List list); + + int updateByCodeForCard(@Param("staffCode") String staffCode, @Param("cardNo") String cardNo); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitInfoMapper.java index b1217c5..6c52542 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitInfoMapper.java @@ -16,7 +16,7 @@ */ @Mapper public interface VisitInfoMapper extends BaseMapper { - List getVisitInfoListPage(@Param("page") Page page, VisitorRequest visitorRequest); + List getVisitInfoListPage(@Param("page") Page page, @Param("visitorRequest") VisitorRequest visitorRequest); VisitInfo selectByOrderId(@Param("orderId") String orderId); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitorApplyMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitorApplyMapper.java index c09f3c0..6ea55bd 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitorApplyMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitorApplyMapper.java @@ -18,7 +18,7 @@ @Mapper public interface VisitorApplyMapper extends BaseMapper { - List getVisitorApplyListPage(@Param("page") Page page, VisitorApplyRequest visitorApplyRequest); + List getVisitorApplyListPage(@Param("page") Page page, @Param("visitorApplyRequest") VisitorApplyRequest visitorApplyRequest); List selectByVisitReason(); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/AttendanceInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/AttendanceInfoMapper.xml index b2ece71..f8bdd6e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/AttendanceInfoMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/AttendanceInfoMapper.xml @@ -43,7 +43,8 @@ and staff_type = #{staffType} - and YEARWEEK(date_format(atte_date, '%Y-%m-%d'), 1) = YEARWEEK(now(),1); + AND DATE_SUB(CURDATE(), INTERVAL 7 DAY) <= DATE(atte_date) + GROUP BY DATE_FORMAT(atte_date, '%Y-%m-%d') @@ -69,4 +70,20 @@ GROUP BY DATE_FORMAT(atte_date, '%Y-%m') + + + \ No newline at end of file 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 2b6953f..06ec0a8 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 @@ -28,7 +28,9 @@ @@ -87,7 +89,8 @@ SELECT hazard_level_code as levelCode, count(id) as quantity FROM bus_case_info WHERE hazard_level_code is not null - AND DATE_SUB(CURDATE(), INTERVAL 7 DAY) <= date(happen_time); + AND is_key_area = 1 + AND DATE_SUB(CURDATE(), INTERVAL 7 DAY) <= date(happen_time) GROUP BY hazard_level_code @@ -95,7 +98,8 @@ SELECT hazard_level_code as levelCode, count(id) as quantity FROM bus_case_info WHERE hazard_level_code is not null - AND DATE_SUB(CURDATE(), INTERVAL 30 DAY) <= date(happen_time); + AND is_key_area = 1 + AND DATE_SUB(CURDATE(), INTERVAL 30 DAY) <= date(happen_time) GROUP BY hazard_level_code @@ -122,4 +126,71 @@ AND hazard_level_code is not null GROUP BY DATE_FORMAT(happen_time,'%Y-%m-%d') + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/CategoryLevelMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/CategoryLevelMapper.xml index 4670b1f..1d25cbd 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/CategoryLevelMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/CategoryLevelMapper.xml @@ -20,11 +20,11 @@ SELECT * FROM bus_case_category_level WHERE 1=1 - - and code = #{code} + + and code = #{categoryLevelRequest.code} - - and name = #{name} + + and name = #{categoryLevelRequest.name} ORDER by create_time DESC 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 9b66fd8..bfd84b7 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 @@ -98,4 +98,10 @@ #{item} + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceRepairLogMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceRepairLogMapper.xml index 078ed3c..cf1a481 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceRepairLogMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceRepairLogMapper.xml @@ -22,14 +22,14 @@ SELECT * FROM bus_device_repair_log WHERE 1=1 - - and device_code = #{devCode} + + and device_code = #{deviceRepairRequest.devCode} - - and device_name = #{devName} + + and device_name = #{deviceRepairRequest.devName} - - and DATE_FORMAT(create_time,"%y%m%d") = DATE_FORMAT(#{createTime},"%y%m%d") + + and DATE_FORMAT(create_time,"%y%m%d") = DATE_FORMAT(#{deviceRepairRequest.createTime},"%y%m%d") ORDER by create_time DESC diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/HazardLevelMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/HazardLevelMapper.xml index f16f2b9..458322b 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/HazardLevelMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/HazardLevelMapper.xml @@ -20,11 +20,11 @@ SELECT * FROM bus_case_hazard_level WHERE 1=1 - - and code = #{code} + + and code = #{hazardLevelRequest.code} - - and name = #{name} + + and name = #{hazardLevelRequest.name} ORDER by create_time DESC @@ -42,4 +42,10 @@ SELECT name FROM bus_case_hazard_level + + \ 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 557237e..b6a183a 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 @@ -50,4 +50,10 @@ + + + UPDATE bus_staff_info + SET card_no = #{cardNo} + WHERE staff_code = #{staffCode} + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitInfoMapper.xml index 84aa84f..230529a 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitInfoMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitInfoMapper.xml @@ -27,5 +27,6 @@ SELECT * FROM bus_visit_info WHERE order_id = #{orderId} and DATE_FORMAT(in_time,'%Y-%m-%d') = CURRENT_DATE + limit 1 \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/BlackPictureRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/BlackPictureRequest.java new file mode 100644 index 0000000..fc92701 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/BlackPictureRequest.java @@ -0,0 +1,14 @@ +package com.casic.missiles.modular.dto; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/29 19:26 + */ +@Data +public class BlackPictureRequest { + private String picUri; + private String serverIndexCode; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/BlackListController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/BlackListController.java index a27f9f8..0c06661 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/BlackListController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/BlackListController.java @@ -1,13 +1,18 @@ package com.casic.missiles.modular.controller; +import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.base.controller.ExportController; import com.casic.missiles.core.page.PageFactory; import com.casic.missiles.model.response.ResponseData; import com.casic.missiles.modular.dto.BlackInfoRequest; +import com.casic.missiles.modular.dto.BlackPictureRequest; +import com.casic.missiles.modular.dto.hik.PersonInfoRequest; +import com.casic.missiles.modular.enums.HikUri; import com.casic.missiles.modular.enums.OperateTypeEnum; import com.casic.missiles.modular.model.BlackInfo; import com.casic.missiles.modular.service.BlackInfoService; +import com.casic.missiles.modular.util.HikUtil; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; @@ -56,4 +61,22 @@ return null; } + /** + * 黑名单人员照片 + */ + @PostMapping("/personPicture") + @ResponseBody + public Object personPicture(@RequestBody BlackPictureRequest blackPictureRequest){ + //获取照片 + String picUri = blackPictureRequest.getPicUri(); + String serverIndexCode = blackPictureRequest.getServerIndexCode(); + PersonInfoRequest picRequest = new PersonInfoRequest(); + picRequest.setPicUri(picUri); + picRequest.setServerIndexCode(serverIndexCode); + String reBody = JSONObject.toJSONString(picRequest); + //重定向地址获取 + String url = HikUtil.hikApiFor302(HikUri.PERSON_PICTURE, reBody); + return ResponseData.success(url); + } + } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/DeviceController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/DeviceController.java index e1c4eba..666bbee 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/DeviceController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/DeviceController.java @@ -107,7 +107,7 @@ } /** - * 设备维修管理查询(分页),需计算MTTR=总维修时间/故障次数 + * 设备状态计算与评判/设备维修管理查询(分页),需计算MTTR=总维修时间/故障次数 */ @PostMapping("/repair/listPage") @ResponseBody @@ -211,7 +211,7 @@ //需根据设备编号获取到对应的门禁点唯一标识 doorControlRequest.setDoorIndexCodes(indexCodes); doorControlRequest.setControlType(Integer.valueOf(gateGroupDTO.getStatus())); - String body = JSONObject.toJSONString(deviceCodes); + String body = JSONObject.toJSONString(doorControlRequest); String resultStr = HikUtil.hikApi(HikUri.DOOR_CONTROL, body); JSONObject resultJson = (JSONObject)JSONObject.parse(resultStr); if (!"0".equals(resultJson.get("code"))) { diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/StaffController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/StaffController.java index b58ccab..704093c 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/StaffController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/StaffController.java @@ -2,15 +2,21 @@ import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.util.StrUtil; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.base.controller.ExportController; import com.casic.missiles.core.page.PageFactory; import com.casic.missiles.model.response.ErrorResponseData; import com.casic.missiles.model.response.ResponseData; import com.casic.missiles.modular.dto.StaffInfoRequest; +import com.casic.missiles.modular.dto.hik.PersonInfoRequest; +import com.casic.missiles.modular.dto.hik.StaffCardRequest; +import com.casic.missiles.modular.enums.HikUri; import com.casic.missiles.modular.enums.OperateTypeEnum; import com.casic.missiles.modular.model.StaffInfo; import com.casic.missiles.modular.service.StaffInfoService; +import com.casic.missiles.modular.util.HikUtil; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; @@ -110,4 +116,60 @@ } return ResponseData.success(); } + + /** + * 批量开卡,添加人员之后调用,若在一个接口中添加人员成功开卡失败则第二次添加时会有问题 + */ + @PostMapping("/cardBinding") + @ResponseBody + public Object cardBinding(@RequestBody StaffCardRequest staffCardRequest) { + String body = JSONObject.toJSONString(staffCardRequest); + String resultStr = HikUtil.hikApi(HikUri.CARD_BINDING, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (!"0".equals(resultJson.get("code"))) { + log.error("请求海康,批量开卡失败,海康response:{}", resultStr); + return ResponseData.error("批量开卡失败"); + } + //保存卡号 + if(staffInfoService.saveCardInfo(staffCardRequest) > 0){ + return ResponseData.success(); + } + return ResponseData.error("批量开卡失败"); + } + + /** + * 获取员工照片,海康存储 + */ + @PostMapping("/personPicture/{staffCode}") + @ResponseBody + public Object personPicture(@PathVariable("staffCode") String staffCode){ + //获取员工详细信息,含图片服务器、uri + PersonInfoRequest request = new PersonInfoRequest(); + List list = new ArrayList<>(); + list.add(staffCode); + request.setParamName("personId"); + request.setParamValue(list); + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi(HikUri.PERSON_INFO, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (!"0".equals(resultJson.get("code"))) { + log.error("请求海康,根据人员唯一字段获取人员详细信息失败,海康response:{}", resultStr); + return ResponseData.error("获取员工照片失败"); + } + //获取照片 + JSONObject data = (JSONObject) resultJson.get("data"); + JSONArray dataArray = (JSONArray) data.get("list"); + JSONObject jsonObject = (JSONObject) dataArray.get(0); + JSONArray personPhoto = (JSONArray) jsonObject.get("personPhoto"); + JSONObject photo = (JSONObject) personPhoto.get(0); + String picUri = photo.getString("picUri"); + String serverIndexCode = photo.getString("serverIndexCode"); + PersonInfoRequest picRequest = new PersonInfoRequest(); + picRequest.setPicUri(picUri); + picRequest.setServerIndexCode(serverIndexCode); + String reBody = JSONObject.toJSONString(picRequest); + //重定向地址获取 + String url = HikUtil.hikApiFor302(HikUri.PERSON_PICTURE, reBody); + return ResponseData.success(url); + } } 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 4a07dd9..7b1dcf6 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 @@ -16,6 +16,7 @@ import com.casic.missiles.modular.redis.key.CacheKeys; import com.casic.missiles.modular.service.CockpitService; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.util.CollectionUtils; import org.springframework.web.bind.annotation.*; @@ -24,10 +25,7 @@ import java.text.NumberFormat; import java.time.LocalDateTime; import java.time.temporal.ChronoUnit; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.util.*; import java.util.stream.Collectors; /** @@ -73,6 +71,9 @@ private StatisticNumberMapper numberMapper; @Autowired + private HazardLevelMapper hazardLevelMapper; + + @Autowired private AccessGroupConfig accessGroupConfig; /** @@ -104,8 +105,24 @@ public Object buildingNumberPerHour(){ //当天按小时分组的人数 List list = numberMapper.selectListByTime(); - Map> collect = list.stream().collect(Collectors.groupingBy(BuildingNumberDTO::getStatisticPosition)); - return ResponseData.success(collect); + Map> collect = list.stream().collect(Collectors.groupingBy(BuildingNumberDTO::getStatisticTime)); + //定时任务中已将每小时三栋楼人数存到数据库 + //将一期主楼和录制楼人数合并,二期单算 + List> resultList = new ArrayList<>(); + collect.keySet().forEach(key -> { + List buildingNumberDTOS = collect.get(key); + BuildingNumberDTO mainBuildingOne = buildingNumberDTOS.get(0); + BuildingNumberDTO mainBuildingTwo = buildingNumberDTOS.get(1); + BuildingNumberDTO recordingBuilding = buildingNumberDTOS.get(2); + HashMap resultMap = new HashMap<>(); + Integer oneQuantity = Integer.valueOf(mainBuildingOne.getStatisticQuantity()); + Integer recordingQuantity = Integer.valueOf(recordingBuilding.getStatisticQuantity()); + resultMap.put("staticTime", mainBuildingOne.getStatisticTime()); + resultMap.put(mainBuildingOne.getStatisticPositionName()+"、"+recordingBuilding.getStatisticPositionName(), String.valueOf(oneQuantity+recordingQuantity)); + resultMap.put(mainBuildingTwo.getStatisticPositionName(), mainBuildingTwo.getStatisticQuantity()); + resultList.add(resultMap); + }); + return ResponseData.success(resultList); } /** @@ -151,12 +168,11 @@ public Object securityNumber() { QueryWrapper wrapper = new QueryWrapper<>(); wrapper.eq("staff_type", 2); + // TODO: 2022/9/2 后续使用产品确定的每天出勤的安保人员的数量 Integer total = staffInfoMapper.selectCount(wrapper); - //当日离岗事件个数 - QueryWrapper wrapper1 = new QueryWrapper<>(); - wrapper1.eq("hik_event_type", SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); - wrapper1.apply("date_format(now(),'%Y-%m-%d') = date_format(happen_time,'%Y-%m-%d')"); - Integer leave = caseInfoMapper.selectCount(wrapper1); + //当日离岗事件按设备去重后的个数 + // TODO: 2022/9/2 目前相当于24小时内的计算,之后看需要可改成自定义小时数计算离岗率,即离岗+6小时内仅一次离岗则恢复为100%,多次则累加离岗次数计算离岗率 + Integer leave = caseInfoMapper.selectDemobilizedCount(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); NumberFormat numberFormat = NumberFormat.getInstance(); // 设置精确到小数点后2位 numberFormat.setMaximumFractionDigits(2); @@ -179,7 +195,6 @@ @ResponseBody public Object visitorApplyDetail() { List reasonGroup = applyMapper.selectByVisitReason(); - HashMap resultMap = new HashMap<>(); NumberFormat numberFormat = NumberFormat.getInstance(); // 设置精确到小数点后2位 numberFormat.setMaximumFractionDigits(2); @@ -187,12 +202,17 @@ if(0 == sum){ return ResponseData.success(); } + List resultList = new ArrayList<>(); reasonGroup.forEach(group -> { String reasonName = dictService.getDictNameByCode(SecurityEventDict.VISIT_REASON, group.getVisitReason()); String result = numberFormat.format((float) group.getQuantity() / (float) sum * 100); - resultMap.put(reasonName, result+"%"); + ApplyReasonGroupDTO applyReasonGroupDTO = new ApplyReasonGroupDTO(); + applyReasonGroupDTO.setQuantity(group.getQuantity()); + applyReasonGroupDTO.setVisitReason(reasonName); + applyReasonGroupDTO.setRatio(result+"%"); + resultList.add(applyReasonGroupDTO); }); - return ResponseData.success(resultMap); + return ResponseData.success(resultList); } /** @@ -247,6 +267,32 @@ } /** + * 机动力量实时在岗率,在岗人数除以总应在岗人数,用离岗+6小时内恢复为100%,6小时外再计算 + */ + @GetMapping("/staff/beOnDutyRatio") + @ResponseBody + public Object beOnDutyRatio() { + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("staff_type", 2); + // TODO: 2022/9/2 后续使用产品确定的每天出勤的安保人员的数量 + Integer total = staffInfoMapper.selectCount(wrapper); + if(0 == total){ + return ResponseData.success(null); + } + //当日离岗事件按设备去重后的个数 + // TODO: 2022/9/2 目前相当于24小时内的计算,之后看需要可改成自定义小时数计算离岗率,即离岗+6小时内仅一次离岗则恢复为100%,多次则累加离岗次数计算离岗率 + List onDutyRatioDTOS = caseInfoMapper.selectDemobilizedCountByHour(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); + onDutyRatioDTOS.forEach(dto -> { + NumberFormat numberFormat = NumberFormat.getInstance(); + // 设置精确到小数点后2位 + numberFormat.setMaximumFractionDigits(2); + String result = numberFormat.format(100 - Float.valueOf(dto.getQuantity()) / (float) total * 100); + dto.setRatio(result+"%"); + }); + return ResponseData.success(onDutyRatioDTOS); + } + + /** * 闸机速通门统计-设备状态分组计算数量,devType传闸机字典key * 视频频监控摄像机统计-设备状态分组计算数量,devType传摄像头字典key */ @@ -262,12 +308,17 @@ if(sum <= 0){ return ResponseData.error("无该类设备信息"); } + List resultList = new ArrayList<>(); gateStatusGroup.forEach(group -> { String devStatus = dictService.getDictNameByCode(SecurityEventDict.DEVICE_STATUS, group.getStatus()); String result = numberFormat.format((float) group.getQuantity() / (float) sum * 100); - resultMap.put(devStatus, result+"%"); + GateStatusGroupResponse gateStatusGroupResponse = new GateStatusGroupResponse(); + gateStatusGroupResponse.setStatus(devStatus); + gateStatusGroupResponse.setRatio(result+"%"); + resultList.add(gateStatusGroupResponse); }); - resultMap.put("总", sum); + resultMap.put("total", sum); + resultMap.put("list", resultList); return ResponseData.success(resultMap); } @@ -282,17 +333,38 @@ String position = securityScoreDTO.getPosition(); List caseInfos = caseInfoMapper.selectByPosition(position); //查询各危险级别权重、各类别权重,放入map,避免循环中多次查数据库 - + HashMap hazardScoreMap = new HashMap<>(); + List caseHazardLevelList = hazardLevelMapper.getCaseHazardLevelList(null); + caseHazardLevelList.forEach(hazardLevel -> { + hazardScoreMap.put(hazardLevel.getCode(), hazardLevel.getWeight()); + }); + HashMap categoryScoreMap = new HashMap<>(); + List categoryLevelList = categoryLevelMapper.getCaseCategoryLevelList(null); + categoryLevelList.forEach(categoryLevel -> { + categoryScoreMap.put(categoryLevel.getCode(), categoryLevel.getWeight()); + }); + //事件按楼层分组,计算 List securityScoreDTOs = new ArrayList<>(); caseInfos.forEach(caseInfo -> { SecurityScoreDTO securityScoreDTO1 = new SecurityScoreDTO(); + securityScoreDTO1.setPosition(caseInfo.getPosition()); securityScoreDTO1.setArea(caseInfo.getArea()); - // TODO: 2022/8/4 楼层评分计算根据产品定义调整 -// caseInfo.get -// securityScoreDTO1.setScore(); + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); + Double score = 100 - Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + securityScoreDTO1.setScore(score); + securityScoreDTOs.add(securityScoreDTO1); }); - - return null; + 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); + }); + return ResponseData.success(securityScoreDTOs); } /** @@ -303,9 +375,13 @@ public Object SecurityFrequency(@RequestBody SecurityFrequencyDTO securityFrequencyDTO) { String year = securityFrequencyDTO.getYear(); String month = securityFrequencyDTO.getMonth(); - Integer quantity = caseInfoMapper.selectCountByMonth(year, month); - securityFrequencyDTO.setQuantity(quantity); - return ResponseData.success(securityFrequencyDTO); + if(!StringUtils.isEmpty(year) && StringUtils.isEmpty(month)){ + Integer quantity = caseInfoMapper.selectCountByMonth(year, month); + securityFrequencyDTO.setQuantity(quantity); + return ResponseData.success(securityFrequencyDTO); + } + List list = caseInfoMapper.selectPreMonthCount(); + return ResponseData.success(list); } } 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 ae4d770..f4f075c 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 @@ -1,20 +1,25 @@ package com.casic.missiles.modular.controller.cockpit; +import cn.hutool.core.date.DateUnit; import cn.hutool.core.date.DateUtil; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.casic.missiles.model.response.ResponseData; -import com.casic.missiles.modular.dao.AttendanceInfoMapper; -import com.casic.missiles.modular.dao.CaseInfoMapper; -import com.casic.missiles.modular.dao.HazardLevelMapper; -import com.casic.missiles.modular.dao.StaffInfoMapper; +import com.casic.missiles.modular.dao.*; +import com.casic.missiles.modular.dto.DeviceRepairLogDTO; +import com.casic.missiles.modular.dto.DeviceRepairRequest; import com.casic.missiles.modular.dto.statistics.*; +import com.casic.missiles.modular.enums.SecurityEventType; +import com.casic.missiles.modular.model.CaseCategoryLevel; import com.casic.missiles.modular.model.CaseHazardLevel; +import com.casic.missiles.modular.model.CaseInfo; import com.casic.missiles.modular.model.StaffInfo; +import com.casic.missiles.modular.service.DeviceInfoService; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.util.CollectionUtils; import org.springframework.web.bind.annotation.*; +import java.math.BigDecimal; import java.text.NumberFormat; import java.util.*; import java.util.stream.Collectors; @@ -40,6 +45,12 @@ @Autowired private HazardLevelMapper hazardLevelMapper; + @Autowired + private CategoryLevelMapper categoryLevelMapper; + + @Autowired + private DeviceInfoService deviceInfoService; + /** * 安防事件时域频次统计,每月的每天安防事件个数(原方案) * 月维度:展示每个月的每天的数据 @@ -89,15 +100,17 @@ List monthList = caseInfoMapper.selectPreMonthCountByYear(year); Map> collect = monthList.stream().collect(Collectors.groupingBy(PreMonthOrWeekCaseDTO::getHazardLevelCode)); HashMap strAvgMap = new HashMap<>(); + List resultList = new ArrayList<>(); for (String key : collect.keySet()) { List preMonthOrWeekCaseDTOS = collect.get(key); int sum = preMonthOrWeekCaseDTOS.stream().mapToInt(PreMonthOrWeekCaseDTO::getQuantity).sum(); //若年份是本年,则使用个安防级别数量/当前月份数 //若不是本年,除数为12 MonthAndWeekDTO monthAndWeekDTO = new MonthAndWeekDTO(); + String hazardName = hazardLevelMapper.selectHazardNameByCode(key); + monthAndWeekDTO.setLevelName(hazardName); if(year.equals(String.valueOf(DateUtil.thisYear()))){ monthAndWeekDTO.setMonthQuantity(sum / DateUtil.thisMonth()); -// monthAndWeekDTO.setLevelName(); strAvgMap.put(key, monthAndWeekDTO); }else{ monthAndWeekDTO.setMonthQuantity(sum / 12); @@ -113,27 +126,37 @@ if(year.equals(String.valueOf(DateUtil.thisYear()))){ if(!Objects.isNull(strAvgMap.get(key))){ MonthAndWeekDTO monthAndWeekDTO = strAvgMap.get(key); + String hazardName = hazardLevelMapper.selectHazardNameByCode(key); + monthAndWeekDTO.setLevelName(hazardName); monthAndWeekDTO.setWeekQuantity(sum / DateUtil.thisWeekOfYear()); strAvgMap.put(key, monthAndWeekDTO); }else{ MonthAndWeekDTO monthAndWeekDTO = new MonthAndWeekDTO(); + String hazardName = hazardLevelMapper.selectHazardNameByCode(key); + monthAndWeekDTO.setLevelName(hazardName); monthAndWeekDTO.setWeekQuantity(sum / DateUtil.thisWeekOfYear()); strAvgMap.put(key, monthAndWeekDTO); } }else{ if(!Objects.isNull(strAvgMap.get(key))){ MonthAndWeekDTO monthAndWeekDTO = strAvgMap.get(key); + String hazardName = hazardLevelMapper.selectHazardNameByCode(key); + monthAndWeekDTO.setLevelName(hazardName); monthAndWeekDTO.setWeekQuantity(sum / 52); strAvgMap.put(key, monthAndWeekDTO); }else{ MonthAndWeekDTO monthAndWeekDTO = new MonthAndWeekDTO(); + String hazardName = hazardLevelMapper.selectHazardNameByCode(key); + monthAndWeekDTO.setLevelName(hazardName); monthAndWeekDTO.setWeekQuantity(sum / 52); strAvgMap.put(key, monthAndWeekDTO); } } } - avgMonthAndWeekGroupDTO.setMap(strAvgMap); - return ResponseData.success(avgMonthAndWeekGroupDTO); + strAvgMap.keySet().forEach(key -> { + resultList.add(strAvgMap.get(key)); + }); + return ResponseData.success(resultList); } /** @@ -181,12 +204,178 @@ } /** - * 员工考勤人数变化,功能待定 + * 员工考勤人数变化,统计当天(横坐标为时)及近7天(横坐标为天)的考勤人数变化,只要发生一次考勤识别,次数的基数就正常增加(没有上班下班区分) */ + @PostMapping("/staff/attendanceNumber/{dimension}") + @ResponseBody + public Object attendanceNumber(@PathVariable("dimension") String dimension) { + List attendanceNumberDTOs = null; + List> resultList = new ArrayList<>(); + if("week".equals(dimension)){ + //近7天数据按天分组统计 + attendanceNumberDTOs = attendanceInfoMapper.getCountForWeek(); + }else if("day".equals(dimension)) { + //今天数据按小时分组统计 + attendanceNumberDTOs = attendanceInfoMapper.getCountForDay(); + } + if(CollectionUtils.isEmpty(attendanceNumberDTOs)){ + return ResponseData.error("该查询条件下,无员工出勤数据!"); + } + Map> collect = attendanceNumberDTOs.stream().collect(Collectors.groupingBy(AttendanceNumberDTO::getDate)); + collect.keySet().forEach(key -> { + List attendanceNumberDTOS = collect.get(key); + AttendanceNumberDTO attendanceNumberDTO = attendanceNumberDTOS.get(0); + AttendanceNumberDTO attendanceNumberDTO2 = attendanceNumberDTOS.get(1); + Map resultMap = new HashMap<>(); + resultMap.put(attendanceNumberDTO.getStaffType(), attendanceNumberDTO.getQuantity()); + resultMap.put(attendanceNumberDTO2.getStaffType(), attendanceNumberDTO2.getQuantity()); + resultMap.put("staticTime", attendanceNumberDTO.getDate()); + resultList.add(resultMap); + }); + return ResponseData.success(resultList); + } /** - * 近30天/近一周安保人员到岗排行 + * 早晚高峰区域安防评估 */ + @PostMapping("/security/assessment/{dimension}") + @ResponseBody + public Object securityAssessment(@PathVariable("dimension") String dimension) { + //查询各危险级别权重、各类别权重,放入map,避免循环中多次查数据库 + HashMap hazardScoreMap = new HashMap<>(); + List caseHazardLevelList = hazardLevelMapper.getCaseHazardLevelList(null); + caseHazardLevelList.forEach(hazardLevel -> { + hazardScoreMap.put(hazardLevel.getCode(), hazardLevel.getWeight()); + }); + HashMap categoryScoreMap = new HashMap<>(); + List categoryLevelList = categoryLevelMapper.getCaseCategoryLevelList(null); + categoryLevelList.forEach(categoryLevel -> { + categoryScoreMap.put(categoryLevel.getCode(), categoryLevel.getWeight()); + }); + HashMap hashMap = new HashMap<>(); + if("week".equals(dimension)){ + //近7天早晚高峰数据 + List caseInfos = caseInfoMapper.selectListBySevenDay(); + //按时间(天)进行分组 + caseInfos.forEach(caseInfo -> { + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); + Double score = Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + String[] array = caseInfo.getHappenTime().split(" "); + String dayTime = array[0]; + BigDecimal preScore; + if(hashMap.containsKey(dayTime)){ + Double aDouble = hashMap.get(dayTime); + preScore = new BigDecimal(aDouble.toString()); + + }else{ + preScore = new BigDecimal("100.0"); + } + BigDecimal nowScore = new BigDecimal(score.toString()); + hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); + }); + return ResponseData.success(hashMap); + }else if("day".equals(dimension)) { + //今天数据按小时分组统计 + List caseInfos = caseInfoMapper.selectListByToday(); + caseInfos.forEach(caseInfo -> { + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); + Double score = Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + String[] array = caseInfo.getHappenTime().split(":"); + String dayTime = array[0]; + BigDecimal preScore; + if(hashMap.containsKey(dayTime)){ + Double aDouble = hashMap.get(dayTime); + preScore = new BigDecimal(aDouble.toString()); + + }else{ + preScore = new BigDecimal("100.0"); + } + BigDecimal nowScore = new BigDecimal(score.toString()); + hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); + }); + return ResponseData.success(hashMap); + } + return null; + } + + /** + * 重点区域安防事态评估,统计重点区域6:00-23:00按小时分组数据 + */ + @GetMapping("/security/keyAreaStatistic") + @ResponseBody + public Object keyAreaStatistic() { + //查询各危险级别权重、各类别权重,放入map,避免循环中多次查数据库 + HashMap hazardScoreMap = new HashMap<>(); + List caseHazardLevelList = hazardLevelMapper.getCaseHazardLevelList(null); + caseHazardLevelList.forEach(hazardLevel -> { + hazardScoreMap.put(hazardLevel.getCode(), hazardLevel.getWeight()); + }); + HashMap categoryScoreMap = new HashMap<>(); + List categoryLevelList = categoryLevelMapper.getCaseCategoryLevelList(null); + categoryLevelList.forEach(categoryLevel -> { + categoryScoreMap.put(categoryLevel.getCode(), categoryLevel.getWeight()); + }); + HashMap hashMap = new HashMap<>(); + //今天数据按小时分组统计 + List caseInfos = caseInfoMapper.selectListByToday2(); + caseInfos.forEach(caseInfo -> { + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); + Double score = Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + String[] array = caseInfo.getHappenTime().split(":"); + String dayTime = array[0]; + BigDecimal preScore; + if(hashMap.containsKey(dayTime)){ + Double aDouble = hashMap.get(dayTime); + preScore = new BigDecimal(aDouble.toString()); + + }else{ + preScore = new BigDecimal("100.0"); + } + BigDecimal nowScore = new BigDecimal(score.toString()); + hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); + }); + return ResponseData.success(hashMap); + } + + /** + * 安防机动支援力量调配响应评估,根据事件已解决状态及已解决时间-发送时间,按时间(小时)分组统计 + */ + @GetMapping("/security/responseAssess") + @ResponseBody + public Object responseAssess() { + //查询各危险级别权重、各类别权重,放入map,避免循环中多次查数据库 + HashMap hazardScoreMap = new HashMap<>(); + List caseHazardLevelList = hazardLevelMapper.getCaseHazardLevelList(null); + caseHazardLevelList.forEach(hazardLevel -> { + hazardScoreMap.put(hazardLevel.getCode(), hazardLevel.getWeight()); + }); + HashMap hashMap = new HashMap<>(); + //今天数据按小时分组统计 + List caseInfos = caseInfoMapper.selectListByToday3(); + caseInfos.forEach(caseInfo -> { + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + //扣分=事件级别权重*未解决小时数 + Date updateTime = DateUtil.parse(caseInfo.getUpdateTime()); + Date happenTime = DateUtil.parse(caseInfo.getHappenTime()); + long between = DateUtil.between(updateTime, happenTime, DateUnit.HOUR); + Double score = Double.valueOf(hazardWeight)*between; + String[] array = caseInfo.getHappenTime().split(":"); + String dayTime = array[0]; + BigDecimal preScore; + if(hashMap.containsKey(dayTime)){ + Double aDouble = hashMap.get(dayTime); + preScore = new BigDecimal(aDouble.toString()); + }else{ + preScore = new BigDecimal("100.0"); + } + BigDecimal nowScore = new BigDecimal(score.toString()); + hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); + }); + return ResponseData.success(hashMap); + } /** * 重点区域威胁事件类型统计,优先级2,统计近7天和近30天 @@ -224,7 +413,34 @@ } /** - * 设备状态计算系数和评判,优先级3,需确认设备恢复时间是否可以获取 + * 近30天/近一周安保人员到岗排行 */ + + /** + * 安保等级评估,发生离岗事件减1分 + */ + @GetMapping("/security/levelAssess") + @ResponseBody + public Object securityLevelAssess() { + //今天数据按小时分组统计 + List resultList = caseInfoMapper.selectListByType(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); + resultList.forEach(result -> { + BigDecimal deScore = new BigDecimal(result.getQuantity()); + BigDecimal preScore = new BigDecimal("100.0"); + result.setScore(preScore.subtract(deScore).doubleValue()); + }); + return ResponseData.success(resultList); + } + + /** + * 设备状态计算系数和评判,即设备维修管理查询(不分页) + */ + @PostMapping("/device/repairList") + @ResponseBody + public Object repairList(@RequestBody DeviceRepairRequest deviceRepairRequest) { + List deviceRepairLogDTOS = deviceInfoService.deviceRepairListPage(deviceRepairRequest); + return ResponseData.success(deviceRepairLogDTOS); + } + } 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 fbf8ab6..c71a15a 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 @@ -1,13 +1,12 @@ package com.casic.missiles.modular.controller.hik; +import cn.hutool.core.date.DateTime; +import cn.hutool.core.date.DateUtil; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.casic.missiles.model.response.ResponseData; import com.casic.missiles.modular.dao.HikFaceGroupInfoMapper; -import com.casic.missiles.modular.dto.hik.EventSubscribeRequest; -import com.casic.missiles.modular.dto.hik.FaceGroupAdditionRequest; -import com.casic.missiles.modular.dto.hik.HikRecvEvent; -import com.casic.missiles.modular.dto.hik.OrgBatchAdd; +import com.casic.missiles.modular.dto.hik.*; import com.casic.missiles.modular.enums.HikUri; import com.casic.missiles.modular.enums.SecurityEventType; import com.casic.missiles.modular.model.CaseInfo; @@ -18,16 +17,20 @@ import com.casic.missiles.modular.util.CaseInfoFactoryUtil; import com.casic.missiles.modular.util.HikUtil; import com.casic.missiles.modular.util.ThreadPoolUtil; +import com.casic.missiles.modular.util.WebSocket; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; -import org.springframework.web.bind.annotation.*; +import org.springframework.util.CollectionUtils; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.RestController; -import java.net.InetAddress; -import java.net.UnknownHostException; import java.util.ArrayList; +import java.util.Iterator; import java.util.List; import java.util.Objects; @@ -38,7 +41,6 @@ */ @Slf4j @RestController -@RequestMapping("/hik") public class HikController { @Autowired @@ -53,28 +55,37 @@ @Autowired private HikService hikService; + @Autowired + private HikFaceGroupInfoMapper hikFaceGroupInfoMapper; + + @Autowired + private WebSocket webSocket; + @Value("${server.port}") private int serverPort; - @Autowired - private HikFaceGroupInfoMapper hikFaceGroupInfoMapper; /** * 海康事件订阅 */ - @PostMapping("/event/subscribe") + @PostMapping("/hik/event/subscribe") @ResponseBody - public Object eventSubscribe() throws UnknownHostException { + public Object eventSubscribe() { EventSubscribeRequest eventSubscribeRequest = new EventSubscribeRequest(); ArrayList list = new ArrayList<>(); list.add(SecurityEventType.DEVICE_OFFLINE); + list.add(SecurityEventType.DEVICE_ONLINE); list.add(SecurityEventType.KEY_PERSONNEL_IDENTIFY_EVENT); list.add(SecurityEventType.MONITORING_POINT_OFFLINE); + list.add(SecurityEventType.MONITORING_POINT_ONLINE); list.add(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); list.add(SecurityEventType.PERSONNEL_GATHER_EVENT); - InetAddress localHost = InetAddress.getLocalHost(); + list.add(SecurityEventType.VISITOR_REGISTER); + list.add(SecurityEventType.VISITOR_CHECKOUT); + list.add(SecurityEventType.HIGH_ALTITUDE_PARABOLIC); +// InetAddress localHost = InetAddress.getLocalHost(); eventSubscribeRequest.setEventTypes(list); - eventSubscribeRequest.setEventDest("https://" + localHost + ":" + serverPort + "/eventRcv"); + eventSubscribeRequest.setEventDest("http://" + "192.168.10.6" + ":" + serverPort + "/eventRcv"); //订阅类型,0-订阅原始事件,1-联动事件,2-原始事件和联动事件,不填使用默认值0 eventSubscribeRequest.setSubType(0); /** @@ -92,19 +103,25 @@ } /** + * 查询事件订阅信息 + */ + @PostMapping("/hik/event/query") + @ResponseBody + public Object eventQuery() { + String result = HikUtil.hikApi(HikUri.EVENT_INFO, ""); + return result; + } + + /** * 海康事件接收 */ @PostMapping("/eventRcv") @ResponseBody public Object eventRcv(@RequestBody HikRecvEvent hikRecvEvent) { //1、接收所需事件类型 - Long eventType = hikRecvEvent.getEventType(); + Number eventType = hikRecvEvent.getEventType(); log.info("接收到安防事件类型为:{}", eventType); CaseInfo caseInfo = caseInfoFactoryUtil.getCaseInfo(eventType); - //接收到不关心事件直接返回 - if(Objects.isNull(caseInfo)){ - return ResponseData.success(); - } //2、不同事件不同处理,caseInfoFactoryUtil已设置好事件基础定义信息 // 再为事件添加状态、设备编码、设备名称、位置、区域、时间 // 异步处理事件 @@ -114,19 +131,23 @@ caseHandle(hikRecvEvent, eventType, caseInfo); } })); +// caseHandle(hikRecvEvent, eventType, caseInfo); - return null; + return ResponseData.success(); } - private void caseHandle(HikRecvEvent hikRecvEvent, Long eventType, CaseInfo caseInfo) { + private void caseHandle(HikRecvEvent hikRecvEvent, Number eventType, CaseInfo caseInfo) { JSONArray eventArray = hikRecvEvent.getEventArray(); List caseInfos = new ArrayList<>(); - while (eventArray.stream().iterator().hasNext()) { + Iterator iterator = eventArray.iterator(); + while (iterator.hasNext()) { CaseInfo caseInfo1 = new CaseInfo(); - BeanUtils.copyProperties(caseInfo, caseInfo1); - JSONObject event = (JSONObject) eventArray.stream().iterator().next(); + if(!Objects.isNull(caseInfo)){ + BeanUtils.copyProperties(caseInfo, caseInfo1); + } + JSONObject event = (JSONObject) iterator.next(); //5种事件进行不同处理 - if(SecurityEventType.KEY_PERSONNEL_IDENTIFY_EVENT == eventType){ + if (SecurityEventType.KEY_PERSONNEL_IDENTIFY_EVENT.equals(eventType)) { //判断所属人脸分组 JSONObject data = (JSONObject) event.get("data"); JSONObject faceRecognitionResult = (JSONObject) data.get("faceRecognitionResult"); @@ -142,52 +163,101 @@ if (faceGroupCode.equals(blackListGroup.getFaceGroupCode())) { //黑名单分组处理 caseInfo1 = hikService.blackListHandle(event, caseInfo1); - }else if(faceGroupCode.equals(propertyPersonnelGroup.getFaceGroupCode())){ + } else if (faceGroupCode.equals(propertyPersonnelGroup.getFaceGroupCode())) { //考勤分组处理-物业人员,添加到考勤表 hikService.propertyAttendanceHandle(event); - }else if(faceGroupCode.equals(securityPersonnelGroup.getFaceGroupCode())){ + } else if (faceGroupCode.equals(securityPersonnelGroup.getFaceGroupCode())) { //考勤分组处理-安保人员,添加到考勤表 hikService.securityPersonnelHandle(event); - }else { + } else { return; } - }else if(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT == eventType){ + } else if (SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT.equals(eventType)) { //离岗事件处理 caseInfo1 = hikService.demobilizedHandle(event, caseInfo1); - }else if(SecurityEventType.PERSONNEL_GATHER_EVENT == eventType){ + } else if (SecurityEventType.PERSONNEL_GATHER_EVENT.equals(eventType)) { //人员聚集事件处理 caseInfo1 = hikService.personGatherHandle(event, caseInfo1); - }else if(SecurityEventType.MONITORING_POINT_OFFLINE == eventType){ + } else if (SecurityEventType.MONITORING_POINT_OFFLINE.equals(eventType)) { //监控点离线事件处理 caseInfo1 = hikService.monitorPointOfflineHandle(event, caseInfo1); - }else if(SecurityEventType.DEVICE_OFFLINE == eventType){ + } else if (SecurityEventType.MONITORING_POINT_ONLINE.equals(eventType)) { + //监控点上线事件处理 + hikService.monitorPointOnlineHandle(event); + } else if (SecurityEventType.DEVICE_OFFLINE.equals(eventType)) { //装置离线事件处理 caseInfo1 = hikService.deviceOfflineHandle(event, caseInfo1); - }else if(SecurityEventType.VISITOR_REGISTER == eventType){ + } else if (SecurityEventType.DEVICE_ONLINE.equals(eventType)) { + //装置上线处理 + hikService.deviceOnlineHandle(event); + } else if (SecurityEventType.VISITOR_REGISTER.equals(eventType)) { //记录访客登记记录,添加到访客记录表 hikService.visitorRegisterHandler(event); - }else if(SecurityEventType.VISITOR_CHECKOUT == eventType){ + } else if (SecurityEventType.VISITOR_CHECKOUT.equals(eventType)) { //记录访客签离记录 hikService.visitorCheckOutHandler(event); } - if(!Objects.isNull(caseInfo1) && !StringUtils.isEmpty(caseInfo1.getHappenTime())){ + if (!Objects.isNull(caseInfo1) && !StringUtils.isEmpty(caseInfo1.getHappenTime())) { caseInfos.add(caseInfo1); } } //3、安防事件入库 - if(!caseInfoService.insertCaseInfoBatch(caseInfos)){ - log.error("安防事件批量入库异常"); + if (!CollectionUtils.isEmpty(caseInfos) && !caseInfoService.insertCaseInfoBatch(caseInfos)) { + log.error("安防事件批量入库异常!"); } // TODO: 2022/8/15 webSocket推送 + if (CollectionUtils.isEmpty(caseInfos)) { + log.info("webSocket事件推送"); + webSocket.sendAllMessage(JSONObject.toJSONString(caseInfos)); + } return; } /** + * 以图搜图,前端用于轨迹追踪 + */ + @PostMapping("/hik/search/picture") + @ResponseBody + public Object searchPictures(@RequestBody SearchPicturesRequest searchPicturesRequest) { + DateTime startDateTime = DateUtil.parse(searchPicturesRequest.getStartTime()); + DateTime endDateTime = DateUtil.parse(searchPicturesRequest.getEndTime()); + String startTime = DateUtil.format(startDateTime, "yyyy-MM-dd'T'HH:mm:ss.SSSXXX"); + String endTime = DateUtil.format(endDateTime, "yyyy-MM-dd'T'HH:mm:ss.SSSXXX"); + searchPicturesRequest.setStartTime(startTime); + searchPicturesRequest.setEndTime(endTime); + String body = JSONObject.toJSONString(searchPicturesRequest); + String resultStr = HikUtil.hikApi(HikUri.SEARCH_PICTURES, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (!"0".equals(resultJson.get("code"))) { + log.error("请求海康,以图搜图失败,海康response:{}", resultStr); + return ResponseData.error("以图搜图失败"); + } + return ResponseData.success(resultJson); + } + + + /** + * 海康事件取消订阅 + */ + @PostMapping("/hik/event/cancel") + @ResponseBody + public Object eventCancelSubscribe(@RequestBody CancelSubscribeRequest cancelSubscribeRequest) { + String body = JSONObject.toJSONString(cancelSubscribeRequest); + String resultStr = HikUtil.hikApi(HikUri.EVENT_CANCEL, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (!"0".equals(resultJson.get("code"))) { + log.error("请求海康,取消订阅失败,海康response:{}", resultStr); + return ResponseData.error("取消订阅失败"); + } + return ResponseData.success(resultJson); + } + + /** * 单个添加海康人脸分组 * api->hik单个添加人脸分组api->response->mysql */ - @PostMapping("/faceGroup/single/add") + @PostMapping("/hik/faceGroup/single/add") @ResponseBody public Object faceGroupAddition(@RequestBody FaceGroupAdditionRequest faceGroupAdditionRequest) { String body = JSONObject.toJSONString(faceGroupAdditionRequest); @@ -212,7 +282,7 @@ * 批量添加海康组织 * api->hik批量添加组织api->response */ - @PostMapping("/org/batch/add") + @PostMapping("/hik/org/batch/add") @ResponseBody public Object orgBatchAdd(@RequestBody List orgBatchAddRequest) { String body = JSONObject.toJSONString(orgBatchAddRequest); @@ -232,4 +302,62 @@ return ResponseData.error("批量添加组织失败"); } + /** + * 获取人员列表 + */ + @PostMapping("/hik/person/personList") + @ResponseBody + public Object personList() { + PersonListRequest request = new PersonListRequest(); + request.setPageNo(1); + request.setPageSize(100); + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi("/api/resource/v2/person/personList", body); + return resultStr; + } + + /** + * 获取组织列表 + */ + @PostMapping("/hik/org/orgList") + @ResponseBody + public Object orgList() { + PersonListRequest request = new PersonListRequest(); + request.setPageNo(1); + request.setPageSize(100); + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi("/api/resource/v1/org/orgList", body); + return resultStr; + } + + /** + * 查询访客权限下载记录 + */ + @PostMapping("/hik/auth/result") + @ResponseBody + public Object authResult() { + PersonListRequest request = new PersonListRequest(); + request.setPageNo(1); + request.setPageSize(100); + request.setOrderId("ba101db6246711edaea66f7939a13638"); + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi("/api/visitor/v1/auth/result", body); + return resultStr; + } + + /** + * 人脸图片获取 + */ + @PostMapping("/hik/face/picture") + @ResponseBody + public Object facePicture() { + FaceRequest request = new FaceRequest(); +// List list = new ArrayList<>(); +// list.add(""); + request.setCertificateNum("wanggong"); + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi("/api/frs/v1/face", body); + return resultStr; + } + } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/AssetInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/AssetInfoMapper.java index 4f64e83..c0684ee 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/AssetInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/AssetInfoMapper.java @@ -17,6 +17,6 @@ @Mapper public interface AssetInfoMapper extends BaseMapper { - List getAssetInfoListPage(@Param("page") Page page, AssetInfoRequest assetInfoRequest); + List getAssetInfoListPage(@Param("page") Page page, @Param("assetInfoRequest") AssetInfoRequest assetInfoRequest); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/AttendanceInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/AttendanceInfoMapper.java index f9e793e..ec87e46 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/AttendanceInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/AttendanceInfoMapper.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.statistics.AttendanceNumberDTO; import com.casic.missiles.modular.dto.statistics.AttendanceRatioDTO; import com.casic.missiles.modular.model.AttendanceInfo; import org.apache.ibatis.annotations.Mapper; @@ -17,7 +18,7 @@ */ @Mapper public interface AttendanceInfoMapper extends BaseMapper { - List getAttendanceInfoListPage(@Param("page") Page page, StaffInfoRequest attendanceInfoRequest); + List getAttendanceInfoListPage(@Param("page") Page page, @Param("attendanceInfoRequest") StaffInfoRequest attendanceInfoRequest); AttendanceInfo selectByCodeAndDate(@Param("staffCode") String staffCode); @@ -26,4 +27,8 @@ List getCountByTypeAndDateForMonth(@Param("staffType")String staffType); List getCountByTypeAndDateForYear(@Param("staffType")String staffType); + + List getCountForWeek(); + + List getCountForDay(); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java index ce94b8f..6137a7d 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java @@ -17,5 +17,5 @@ @Mapper public interface BlackInfoMapper extends BaseMapper { - List getBlackInfoListPage(@Param("page") Page page, BlackInfoRequest blackInfoRequest); + List getBlackInfoListPage(@Param("page") Page page, @Param("blackInfoRequest") BlackInfoRequest blackInfoRequest); } 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 efda6b3..50aaa6f 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 @@ -20,7 +20,7 @@ List getCaseInfoListPage(@Param("page") Page page, @Param("caseInfoRequest") CaseInfoRequest caseInfoRequest); - int updateStatusById(CaseInfoRequest caseInfoRequest); + int updateStatusById(@Param("caseInfoRequest") CaseInfoRequest caseInfoRequest); List selectByLevelAndMonth(@Param("year") String year); @@ -47,4 +47,20 @@ List selectPreWeekCountByThirtyDay(); List selectPreDayCountBySevenDay(); + + Integer selectDemobilizedCount(@Param("eventType") Number personnelDemobilizedEvent); + + List selectPreMonthCount(); + + List selectListBySevenDay(); + + List selectListByToday(); + + List selectListByToday2(); + + List selectListByToday3(); + + List selectListByType(@Param("eventType") Number eventType); + + List selectDemobilizedCountByHour(@Param("eventType") Number eventType); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/CategoryLevelMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/CategoryLevelMapper.java index 52fc714..afe1650 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/CategoryLevelMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/CategoryLevelMapper.java @@ -17,9 +17,9 @@ @Mapper public interface CategoryLevelMapper extends BaseMapper { - List getCaseCategoryLevelListPage(@Param("page") Page page, CategoryLevelRequest categoryLevelRequest); + List getCaseCategoryLevelListPage(@Param("page") Page page, @Param("categoryLevelRequest") CategoryLevelRequest categoryLevelRequest); - List getCaseCategoryLevelList(CategoryLevelRequest categoryLevelRequest); + List getCaseCategoryLevelList(@Param("categoryLevelRequest") CategoryLevelRequest categoryLevelRequest); CaseCategoryLevel getCaseCategoryLevel(@Param("categoryLevelCode") String categoryLevelCode); 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 66353b1..2555a09 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 @@ -19,7 +19,7 @@ @Mapper public interface DeviceInfoMapper extends BaseMapper { - List getDeviceInfoListPage(@Param("page") Page page, DeviceInfoRequest deviceInfoRequest); + List getDeviceInfoListPage(@Param("page") Page page, @Param("deviceInfoRequest") DeviceInfoRequest deviceInfoRequest); List getDeviceInfoList(@Param("deviceInfoRequest") DeviceInfoRequest deviceInfoRequest); @@ -27,6 +27,8 @@ DeviceInfo getByIndexCode(@Param("srcIndex") String srcIndex); + DeviceInfo getByIp(@Param("ip") String ip); + List selectIndexCodesByCodes(@Param("deviceCodes") List deviceCodes); List selectByType(@Param("devType") String devType); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java index 41dd0af..5bfaf63 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java @@ -5,6 +5,7 @@ import com.casic.missiles.modular.dto.DeviceRepairRequest; import com.casic.missiles.modular.model.DeviceRepairLog; import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; import java.util.List; @@ -16,7 +17,7 @@ @Mapper public interface DeviceRepairLogMapper extends BaseMapper { - List getDeviceRepairListPage(Page page, DeviceRepairRequest deviceRepairRequest); + List getDeviceRepairListPage(@Param("page") Page page, @Param("deviceRepairRequest")DeviceRepairRequest deviceRepairRequest); - List getDeviceRepairList(DeviceRepairRequest deviceRepairRequest); + List getDeviceRepairList(@Param("deviceRepairRequest") DeviceRepairRequest deviceRepairRequest); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java index 9035c47..4823ac1 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java @@ -18,7 +18,7 @@ @Mapper public interface FireEquipInfoMapper extends BaseMapper { - List getFireEquipInfoListPage(@Param("page") Page page, FireEquipRequest fireEquipRequest); + List getFireEquipInfoListPage(@Param("page") Page page, @Param("fireEquipRequest") FireEquipRequest fireEquipRequest); FireEquipInfo getFireEquipInfo(@Param("equipCode") String equipCode); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/GateGroupMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/GateGroupMapper.java index d8c330d..977a427 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/GateGroupMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/GateGroupMapper.java @@ -17,7 +17,7 @@ */ @Mapper public interface GateGroupMapper extends BaseMapper { - List getGateGroupListPage(@Param("page") Page page, GateGroupRequest gateGroupRequest); + List getGateGroupListPage(@Param("page") Page page, @Param("gateGroupRequest") GateGroupRequest gateGroupRequest); GateGroup getGateGroupByName(@Param("groupName") String groupName); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/HazardLevelMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/HazardLevelMapper.java index 8957780..dcf47bb 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/HazardLevelMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/HazardLevelMapper.java @@ -17,11 +17,13 @@ @Mapper public interface HazardLevelMapper extends BaseMapper { - List getCaseHazardLevelListPage(@Param("page") Page page, HazardLevelRequest hazardLevelRequest); + List getCaseHazardLevelListPage(@Param("page") Page page, @Param("hazardLevelRequest") HazardLevelRequest hazardLevelRequest); - List getCaseHazardLevelList(HazardLevelRequest hazardLevelRequest); + List getCaseHazardLevelList(@Param("hazardLevelRequest") HazardLevelRequest hazardLevelRequest); CaseHazardLevel getCaseHazardLevel(@Param("hazardLevelCode") String hazardLevelCode); List selectHazardName(); + + String selectHazardNameByCode(@Param("hazardLevelCode") String hazardLevelCode); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/HikCaseDefineMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/HikCaseDefineMapper.java index 0dc47d1..f162fef 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/HikCaseDefineMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/HikCaseDefineMapper.java @@ -12,5 +12,5 @@ */ @Mapper public interface HikCaseDefineMapper extends BaseMapper { - HikCaseDefine getHikCaseDefine(@Param("caseTypeCode") Long caseTypeCode); + HikCaseDefine getHikCaseDefine(@Param("caseTypeCode") Number caseTypeCode); } 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 f8a674c..fe5afc2 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 @@ -17,11 +17,13 @@ @Mapper public interface StaffInfoMapper extends BaseMapper { - List getStaffInfoListPage(@Param("page") Page page, StaffInfoRequest staffInfoRequest); + List getStaffInfoListPage(@Param("page") Page page, @Param("staffInfoRequest") StaffInfoRequest staffInfoRequest); StaffInfo selectByCode(@Param("staffCode") String staffCode); - List getStaffInfoList(StaffInfoRequest staffInfoRequest); + List getStaffInfoList(@Param("staffInfoRequest") StaffInfoRequest staffInfoRequest); - List selectBatchCodes(List list); + List selectBatchCodes(@Param("list") List list); + + int updateByCodeForCard(@Param("staffCode") String staffCode, @Param("cardNo") String cardNo); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitInfoMapper.java index b1217c5..6c52542 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitInfoMapper.java @@ -16,7 +16,7 @@ */ @Mapper public interface VisitInfoMapper extends BaseMapper { - List getVisitInfoListPage(@Param("page") Page page, VisitorRequest visitorRequest); + List getVisitInfoListPage(@Param("page") Page page, @Param("visitorRequest") VisitorRequest visitorRequest); VisitInfo selectByOrderId(@Param("orderId") String orderId); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitorApplyMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitorApplyMapper.java index c09f3c0..6ea55bd 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitorApplyMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitorApplyMapper.java @@ -18,7 +18,7 @@ @Mapper public interface VisitorApplyMapper extends BaseMapper { - List getVisitorApplyListPage(@Param("page") Page page, VisitorApplyRequest visitorApplyRequest); + List getVisitorApplyListPage(@Param("page") Page page, @Param("visitorApplyRequest") VisitorApplyRequest visitorApplyRequest); List selectByVisitReason(); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/AttendanceInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/AttendanceInfoMapper.xml index b2ece71..f8bdd6e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/AttendanceInfoMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/AttendanceInfoMapper.xml @@ -43,7 +43,8 @@ and staff_type = #{staffType} - and YEARWEEK(date_format(atte_date, '%Y-%m-%d'), 1) = YEARWEEK(now(),1); + AND DATE_SUB(CURDATE(), INTERVAL 7 DAY) <= DATE(atte_date) + GROUP BY DATE_FORMAT(atte_date, '%Y-%m-%d') @@ -69,4 +70,20 @@ GROUP BY DATE_FORMAT(atte_date, '%Y-%m') + + + \ No newline at end of file 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 2b6953f..06ec0a8 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 @@ -28,7 +28,9 @@ @@ -87,7 +89,8 @@ SELECT hazard_level_code as levelCode, count(id) as quantity FROM bus_case_info WHERE hazard_level_code is not null - AND DATE_SUB(CURDATE(), INTERVAL 7 DAY) <= date(happen_time); + AND is_key_area = 1 + AND DATE_SUB(CURDATE(), INTERVAL 7 DAY) <= date(happen_time) GROUP BY hazard_level_code @@ -95,7 +98,8 @@ SELECT hazard_level_code as levelCode, count(id) as quantity FROM bus_case_info WHERE hazard_level_code is not null - AND DATE_SUB(CURDATE(), INTERVAL 30 DAY) <= date(happen_time); + AND is_key_area = 1 + AND DATE_SUB(CURDATE(), INTERVAL 30 DAY) <= date(happen_time) GROUP BY hazard_level_code @@ -122,4 +126,71 @@ AND hazard_level_code is not null GROUP BY DATE_FORMAT(happen_time,'%Y-%m-%d') + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/CategoryLevelMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/CategoryLevelMapper.xml index 4670b1f..1d25cbd 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/CategoryLevelMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/CategoryLevelMapper.xml @@ -20,11 +20,11 @@ SELECT * FROM bus_case_category_level WHERE 1=1 - - and code = #{code} + + and code = #{categoryLevelRequest.code} - - and name = #{name} + + and name = #{categoryLevelRequest.name} ORDER by create_time DESC 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 9b66fd8..bfd84b7 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 @@ -98,4 +98,10 @@ #{item} + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceRepairLogMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceRepairLogMapper.xml index 078ed3c..cf1a481 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceRepairLogMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceRepairLogMapper.xml @@ -22,14 +22,14 @@ SELECT * FROM bus_device_repair_log WHERE 1=1 - - and device_code = #{devCode} + + and device_code = #{deviceRepairRequest.devCode} - - and device_name = #{devName} + + and device_name = #{deviceRepairRequest.devName} - - and DATE_FORMAT(create_time,"%y%m%d") = DATE_FORMAT(#{createTime},"%y%m%d") + + and DATE_FORMAT(create_time,"%y%m%d") = DATE_FORMAT(#{deviceRepairRequest.createTime},"%y%m%d") ORDER by create_time DESC diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/HazardLevelMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/HazardLevelMapper.xml index f16f2b9..458322b 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/HazardLevelMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/HazardLevelMapper.xml @@ -20,11 +20,11 @@ SELECT * FROM bus_case_hazard_level WHERE 1=1 - - and code = #{code} + + and code = #{hazardLevelRequest.code} - - and name = #{name} + + and name = #{hazardLevelRequest.name} ORDER by create_time DESC @@ -42,4 +42,10 @@ SELECT name FROM bus_case_hazard_level + + \ 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 557237e..b6a183a 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 @@ -50,4 +50,10 @@ + + + UPDATE bus_staff_info + SET card_no = #{cardNo} + WHERE staff_code = #{staffCode} + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitInfoMapper.xml index 84aa84f..230529a 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitInfoMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitInfoMapper.xml @@ -27,5 +27,6 @@ SELECT * FROM bus_visit_info WHERE order_id = #{orderId} and DATE_FORMAT(in_time,'%Y-%m-%d') = CURRENT_DATE + limit 1 \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/BlackPictureRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/BlackPictureRequest.java new file mode 100644 index 0000000..fc92701 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/BlackPictureRequest.java @@ -0,0 +1,14 @@ +package com.casic.missiles.modular.dto; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/29 19:26 + */ +@Data +public class BlackPictureRequest { + private String picUri; + private String serverIndexCode; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/CancelSubscribeRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/CancelSubscribeRequest.java new file mode 100644 index 0000000..e2d390a --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/CancelSubscribeRequest.java @@ -0,0 +1,15 @@ +package com.casic.missiles.modular.dto.hik; + +import lombok.Data; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/24 15:14 + */ +@Data +public class CancelSubscribeRequest { + private List eventTypes; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/BlackListController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/BlackListController.java index a27f9f8..0c06661 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/BlackListController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/BlackListController.java @@ -1,13 +1,18 @@ package com.casic.missiles.modular.controller; +import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.base.controller.ExportController; import com.casic.missiles.core.page.PageFactory; import com.casic.missiles.model.response.ResponseData; import com.casic.missiles.modular.dto.BlackInfoRequest; +import com.casic.missiles.modular.dto.BlackPictureRequest; +import com.casic.missiles.modular.dto.hik.PersonInfoRequest; +import com.casic.missiles.modular.enums.HikUri; import com.casic.missiles.modular.enums.OperateTypeEnum; import com.casic.missiles.modular.model.BlackInfo; import com.casic.missiles.modular.service.BlackInfoService; +import com.casic.missiles.modular.util.HikUtil; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; @@ -56,4 +61,22 @@ return null; } + /** + * 黑名单人员照片 + */ + @PostMapping("/personPicture") + @ResponseBody + public Object personPicture(@RequestBody BlackPictureRequest blackPictureRequest){ + //获取照片 + String picUri = blackPictureRequest.getPicUri(); + String serverIndexCode = blackPictureRequest.getServerIndexCode(); + PersonInfoRequest picRequest = new PersonInfoRequest(); + picRequest.setPicUri(picUri); + picRequest.setServerIndexCode(serverIndexCode); + String reBody = JSONObject.toJSONString(picRequest); + //重定向地址获取 + String url = HikUtil.hikApiFor302(HikUri.PERSON_PICTURE, reBody); + return ResponseData.success(url); + } + } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/DeviceController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/DeviceController.java index e1c4eba..666bbee 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/DeviceController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/DeviceController.java @@ -107,7 +107,7 @@ } /** - * 设备维修管理查询(分页),需计算MTTR=总维修时间/故障次数 + * 设备状态计算与评判/设备维修管理查询(分页),需计算MTTR=总维修时间/故障次数 */ @PostMapping("/repair/listPage") @ResponseBody @@ -211,7 +211,7 @@ //需根据设备编号获取到对应的门禁点唯一标识 doorControlRequest.setDoorIndexCodes(indexCodes); doorControlRequest.setControlType(Integer.valueOf(gateGroupDTO.getStatus())); - String body = JSONObject.toJSONString(deviceCodes); + String body = JSONObject.toJSONString(doorControlRequest); String resultStr = HikUtil.hikApi(HikUri.DOOR_CONTROL, body); JSONObject resultJson = (JSONObject)JSONObject.parse(resultStr); if (!"0".equals(resultJson.get("code"))) { diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/StaffController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/StaffController.java index b58ccab..704093c 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/StaffController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/StaffController.java @@ -2,15 +2,21 @@ import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.util.StrUtil; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.base.controller.ExportController; import com.casic.missiles.core.page.PageFactory; import com.casic.missiles.model.response.ErrorResponseData; import com.casic.missiles.model.response.ResponseData; import com.casic.missiles.modular.dto.StaffInfoRequest; +import com.casic.missiles.modular.dto.hik.PersonInfoRequest; +import com.casic.missiles.modular.dto.hik.StaffCardRequest; +import com.casic.missiles.modular.enums.HikUri; import com.casic.missiles.modular.enums.OperateTypeEnum; import com.casic.missiles.modular.model.StaffInfo; import com.casic.missiles.modular.service.StaffInfoService; +import com.casic.missiles.modular.util.HikUtil; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; @@ -110,4 +116,60 @@ } return ResponseData.success(); } + + /** + * 批量开卡,添加人员之后调用,若在一个接口中添加人员成功开卡失败则第二次添加时会有问题 + */ + @PostMapping("/cardBinding") + @ResponseBody + public Object cardBinding(@RequestBody StaffCardRequest staffCardRequest) { + String body = JSONObject.toJSONString(staffCardRequest); + String resultStr = HikUtil.hikApi(HikUri.CARD_BINDING, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (!"0".equals(resultJson.get("code"))) { + log.error("请求海康,批量开卡失败,海康response:{}", resultStr); + return ResponseData.error("批量开卡失败"); + } + //保存卡号 + if(staffInfoService.saveCardInfo(staffCardRequest) > 0){ + return ResponseData.success(); + } + return ResponseData.error("批量开卡失败"); + } + + /** + * 获取员工照片,海康存储 + */ + @PostMapping("/personPicture/{staffCode}") + @ResponseBody + public Object personPicture(@PathVariable("staffCode") String staffCode){ + //获取员工详细信息,含图片服务器、uri + PersonInfoRequest request = new PersonInfoRequest(); + List list = new ArrayList<>(); + list.add(staffCode); + request.setParamName("personId"); + request.setParamValue(list); + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi(HikUri.PERSON_INFO, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (!"0".equals(resultJson.get("code"))) { + log.error("请求海康,根据人员唯一字段获取人员详细信息失败,海康response:{}", resultStr); + return ResponseData.error("获取员工照片失败"); + } + //获取照片 + JSONObject data = (JSONObject) resultJson.get("data"); + JSONArray dataArray = (JSONArray) data.get("list"); + JSONObject jsonObject = (JSONObject) dataArray.get(0); + JSONArray personPhoto = (JSONArray) jsonObject.get("personPhoto"); + JSONObject photo = (JSONObject) personPhoto.get(0); + String picUri = photo.getString("picUri"); + String serverIndexCode = photo.getString("serverIndexCode"); + PersonInfoRequest picRequest = new PersonInfoRequest(); + picRequest.setPicUri(picUri); + picRequest.setServerIndexCode(serverIndexCode); + String reBody = JSONObject.toJSONString(picRequest); + //重定向地址获取 + String url = HikUtil.hikApiFor302(HikUri.PERSON_PICTURE, reBody); + return ResponseData.success(url); + } } 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 4a07dd9..7b1dcf6 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 @@ -16,6 +16,7 @@ import com.casic.missiles.modular.redis.key.CacheKeys; import com.casic.missiles.modular.service.CockpitService; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.util.CollectionUtils; import org.springframework.web.bind.annotation.*; @@ -24,10 +25,7 @@ import java.text.NumberFormat; import java.time.LocalDateTime; import java.time.temporal.ChronoUnit; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.util.*; import java.util.stream.Collectors; /** @@ -73,6 +71,9 @@ private StatisticNumberMapper numberMapper; @Autowired + private HazardLevelMapper hazardLevelMapper; + + @Autowired private AccessGroupConfig accessGroupConfig; /** @@ -104,8 +105,24 @@ public Object buildingNumberPerHour(){ //当天按小时分组的人数 List list = numberMapper.selectListByTime(); - Map> collect = list.stream().collect(Collectors.groupingBy(BuildingNumberDTO::getStatisticPosition)); - return ResponseData.success(collect); + Map> collect = list.stream().collect(Collectors.groupingBy(BuildingNumberDTO::getStatisticTime)); + //定时任务中已将每小时三栋楼人数存到数据库 + //将一期主楼和录制楼人数合并,二期单算 + List> resultList = new ArrayList<>(); + collect.keySet().forEach(key -> { + List buildingNumberDTOS = collect.get(key); + BuildingNumberDTO mainBuildingOne = buildingNumberDTOS.get(0); + BuildingNumberDTO mainBuildingTwo = buildingNumberDTOS.get(1); + BuildingNumberDTO recordingBuilding = buildingNumberDTOS.get(2); + HashMap resultMap = new HashMap<>(); + Integer oneQuantity = Integer.valueOf(mainBuildingOne.getStatisticQuantity()); + Integer recordingQuantity = Integer.valueOf(recordingBuilding.getStatisticQuantity()); + resultMap.put("staticTime", mainBuildingOne.getStatisticTime()); + resultMap.put(mainBuildingOne.getStatisticPositionName()+"、"+recordingBuilding.getStatisticPositionName(), String.valueOf(oneQuantity+recordingQuantity)); + resultMap.put(mainBuildingTwo.getStatisticPositionName(), mainBuildingTwo.getStatisticQuantity()); + resultList.add(resultMap); + }); + return ResponseData.success(resultList); } /** @@ -151,12 +168,11 @@ public Object securityNumber() { QueryWrapper wrapper = new QueryWrapper<>(); wrapper.eq("staff_type", 2); + // TODO: 2022/9/2 后续使用产品确定的每天出勤的安保人员的数量 Integer total = staffInfoMapper.selectCount(wrapper); - //当日离岗事件个数 - QueryWrapper wrapper1 = new QueryWrapper<>(); - wrapper1.eq("hik_event_type", SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); - wrapper1.apply("date_format(now(),'%Y-%m-%d') = date_format(happen_time,'%Y-%m-%d')"); - Integer leave = caseInfoMapper.selectCount(wrapper1); + //当日离岗事件按设备去重后的个数 + // TODO: 2022/9/2 目前相当于24小时内的计算,之后看需要可改成自定义小时数计算离岗率,即离岗+6小时内仅一次离岗则恢复为100%,多次则累加离岗次数计算离岗率 + Integer leave = caseInfoMapper.selectDemobilizedCount(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); NumberFormat numberFormat = NumberFormat.getInstance(); // 设置精确到小数点后2位 numberFormat.setMaximumFractionDigits(2); @@ -179,7 +195,6 @@ @ResponseBody public Object visitorApplyDetail() { List reasonGroup = applyMapper.selectByVisitReason(); - HashMap resultMap = new HashMap<>(); NumberFormat numberFormat = NumberFormat.getInstance(); // 设置精确到小数点后2位 numberFormat.setMaximumFractionDigits(2); @@ -187,12 +202,17 @@ if(0 == sum){ return ResponseData.success(); } + List resultList = new ArrayList<>(); reasonGroup.forEach(group -> { String reasonName = dictService.getDictNameByCode(SecurityEventDict.VISIT_REASON, group.getVisitReason()); String result = numberFormat.format((float) group.getQuantity() / (float) sum * 100); - resultMap.put(reasonName, result+"%"); + ApplyReasonGroupDTO applyReasonGroupDTO = new ApplyReasonGroupDTO(); + applyReasonGroupDTO.setQuantity(group.getQuantity()); + applyReasonGroupDTO.setVisitReason(reasonName); + applyReasonGroupDTO.setRatio(result+"%"); + resultList.add(applyReasonGroupDTO); }); - return ResponseData.success(resultMap); + return ResponseData.success(resultList); } /** @@ -247,6 +267,32 @@ } /** + * 机动力量实时在岗率,在岗人数除以总应在岗人数,用离岗+6小时内恢复为100%,6小时外再计算 + */ + @GetMapping("/staff/beOnDutyRatio") + @ResponseBody + public Object beOnDutyRatio() { + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("staff_type", 2); + // TODO: 2022/9/2 后续使用产品确定的每天出勤的安保人员的数量 + Integer total = staffInfoMapper.selectCount(wrapper); + if(0 == total){ + return ResponseData.success(null); + } + //当日离岗事件按设备去重后的个数 + // TODO: 2022/9/2 目前相当于24小时内的计算,之后看需要可改成自定义小时数计算离岗率,即离岗+6小时内仅一次离岗则恢复为100%,多次则累加离岗次数计算离岗率 + List onDutyRatioDTOS = caseInfoMapper.selectDemobilizedCountByHour(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); + onDutyRatioDTOS.forEach(dto -> { + NumberFormat numberFormat = NumberFormat.getInstance(); + // 设置精确到小数点后2位 + numberFormat.setMaximumFractionDigits(2); + String result = numberFormat.format(100 - Float.valueOf(dto.getQuantity()) / (float) total * 100); + dto.setRatio(result+"%"); + }); + return ResponseData.success(onDutyRatioDTOS); + } + + /** * 闸机速通门统计-设备状态分组计算数量,devType传闸机字典key * 视频频监控摄像机统计-设备状态分组计算数量,devType传摄像头字典key */ @@ -262,12 +308,17 @@ if(sum <= 0){ return ResponseData.error("无该类设备信息"); } + List resultList = new ArrayList<>(); gateStatusGroup.forEach(group -> { String devStatus = dictService.getDictNameByCode(SecurityEventDict.DEVICE_STATUS, group.getStatus()); String result = numberFormat.format((float) group.getQuantity() / (float) sum * 100); - resultMap.put(devStatus, result+"%"); + GateStatusGroupResponse gateStatusGroupResponse = new GateStatusGroupResponse(); + gateStatusGroupResponse.setStatus(devStatus); + gateStatusGroupResponse.setRatio(result+"%"); + resultList.add(gateStatusGroupResponse); }); - resultMap.put("总", sum); + resultMap.put("total", sum); + resultMap.put("list", resultList); return ResponseData.success(resultMap); } @@ -282,17 +333,38 @@ String position = securityScoreDTO.getPosition(); List caseInfos = caseInfoMapper.selectByPosition(position); //查询各危险级别权重、各类别权重,放入map,避免循环中多次查数据库 - + HashMap hazardScoreMap = new HashMap<>(); + List caseHazardLevelList = hazardLevelMapper.getCaseHazardLevelList(null); + caseHazardLevelList.forEach(hazardLevel -> { + hazardScoreMap.put(hazardLevel.getCode(), hazardLevel.getWeight()); + }); + HashMap categoryScoreMap = new HashMap<>(); + List categoryLevelList = categoryLevelMapper.getCaseCategoryLevelList(null); + categoryLevelList.forEach(categoryLevel -> { + categoryScoreMap.put(categoryLevel.getCode(), categoryLevel.getWeight()); + }); + //事件按楼层分组,计算 List securityScoreDTOs = new ArrayList<>(); caseInfos.forEach(caseInfo -> { SecurityScoreDTO securityScoreDTO1 = new SecurityScoreDTO(); + securityScoreDTO1.setPosition(caseInfo.getPosition()); securityScoreDTO1.setArea(caseInfo.getArea()); - // TODO: 2022/8/4 楼层评分计算根据产品定义调整 -// caseInfo.get -// securityScoreDTO1.setScore(); + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); + Double score = 100 - Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + securityScoreDTO1.setScore(score); + securityScoreDTOs.add(securityScoreDTO1); }); - - return null; + 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); + }); + return ResponseData.success(securityScoreDTOs); } /** @@ -303,9 +375,13 @@ public Object SecurityFrequency(@RequestBody SecurityFrequencyDTO securityFrequencyDTO) { String year = securityFrequencyDTO.getYear(); String month = securityFrequencyDTO.getMonth(); - Integer quantity = caseInfoMapper.selectCountByMonth(year, month); - securityFrequencyDTO.setQuantity(quantity); - return ResponseData.success(securityFrequencyDTO); + if(!StringUtils.isEmpty(year) && StringUtils.isEmpty(month)){ + Integer quantity = caseInfoMapper.selectCountByMonth(year, month); + securityFrequencyDTO.setQuantity(quantity); + return ResponseData.success(securityFrequencyDTO); + } + List list = caseInfoMapper.selectPreMonthCount(); + return ResponseData.success(list); } } 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 ae4d770..f4f075c 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 @@ -1,20 +1,25 @@ package com.casic.missiles.modular.controller.cockpit; +import cn.hutool.core.date.DateUnit; import cn.hutool.core.date.DateUtil; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.casic.missiles.model.response.ResponseData; -import com.casic.missiles.modular.dao.AttendanceInfoMapper; -import com.casic.missiles.modular.dao.CaseInfoMapper; -import com.casic.missiles.modular.dao.HazardLevelMapper; -import com.casic.missiles.modular.dao.StaffInfoMapper; +import com.casic.missiles.modular.dao.*; +import com.casic.missiles.modular.dto.DeviceRepairLogDTO; +import com.casic.missiles.modular.dto.DeviceRepairRequest; import com.casic.missiles.modular.dto.statistics.*; +import com.casic.missiles.modular.enums.SecurityEventType; +import com.casic.missiles.modular.model.CaseCategoryLevel; import com.casic.missiles.modular.model.CaseHazardLevel; +import com.casic.missiles.modular.model.CaseInfo; import com.casic.missiles.modular.model.StaffInfo; +import com.casic.missiles.modular.service.DeviceInfoService; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.util.CollectionUtils; import org.springframework.web.bind.annotation.*; +import java.math.BigDecimal; import java.text.NumberFormat; import java.util.*; import java.util.stream.Collectors; @@ -40,6 +45,12 @@ @Autowired private HazardLevelMapper hazardLevelMapper; + @Autowired + private CategoryLevelMapper categoryLevelMapper; + + @Autowired + private DeviceInfoService deviceInfoService; + /** * 安防事件时域频次统计,每月的每天安防事件个数(原方案) * 月维度:展示每个月的每天的数据 @@ -89,15 +100,17 @@ List monthList = caseInfoMapper.selectPreMonthCountByYear(year); Map> collect = monthList.stream().collect(Collectors.groupingBy(PreMonthOrWeekCaseDTO::getHazardLevelCode)); HashMap strAvgMap = new HashMap<>(); + List resultList = new ArrayList<>(); for (String key : collect.keySet()) { List preMonthOrWeekCaseDTOS = collect.get(key); int sum = preMonthOrWeekCaseDTOS.stream().mapToInt(PreMonthOrWeekCaseDTO::getQuantity).sum(); //若年份是本年,则使用个安防级别数量/当前月份数 //若不是本年,除数为12 MonthAndWeekDTO monthAndWeekDTO = new MonthAndWeekDTO(); + String hazardName = hazardLevelMapper.selectHazardNameByCode(key); + monthAndWeekDTO.setLevelName(hazardName); if(year.equals(String.valueOf(DateUtil.thisYear()))){ monthAndWeekDTO.setMonthQuantity(sum / DateUtil.thisMonth()); -// monthAndWeekDTO.setLevelName(); strAvgMap.put(key, monthAndWeekDTO); }else{ monthAndWeekDTO.setMonthQuantity(sum / 12); @@ -113,27 +126,37 @@ if(year.equals(String.valueOf(DateUtil.thisYear()))){ if(!Objects.isNull(strAvgMap.get(key))){ MonthAndWeekDTO monthAndWeekDTO = strAvgMap.get(key); + String hazardName = hazardLevelMapper.selectHazardNameByCode(key); + monthAndWeekDTO.setLevelName(hazardName); monthAndWeekDTO.setWeekQuantity(sum / DateUtil.thisWeekOfYear()); strAvgMap.put(key, monthAndWeekDTO); }else{ MonthAndWeekDTO monthAndWeekDTO = new MonthAndWeekDTO(); + String hazardName = hazardLevelMapper.selectHazardNameByCode(key); + monthAndWeekDTO.setLevelName(hazardName); monthAndWeekDTO.setWeekQuantity(sum / DateUtil.thisWeekOfYear()); strAvgMap.put(key, monthAndWeekDTO); } }else{ if(!Objects.isNull(strAvgMap.get(key))){ MonthAndWeekDTO monthAndWeekDTO = strAvgMap.get(key); + String hazardName = hazardLevelMapper.selectHazardNameByCode(key); + monthAndWeekDTO.setLevelName(hazardName); monthAndWeekDTO.setWeekQuantity(sum / 52); strAvgMap.put(key, monthAndWeekDTO); }else{ MonthAndWeekDTO monthAndWeekDTO = new MonthAndWeekDTO(); + String hazardName = hazardLevelMapper.selectHazardNameByCode(key); + monthAndWeekDTO.setLevelName(hazardName); monthAndWeekDTO.setWeekQuantity(sum / 52); strAvgMap.put(key, monthAndWeekDTO); } } } - avgMonthAndWeekGroupDTO.setMap(strAvgMap); - return ResponseData.success(avgMonthAndWeekGroupDTO); + strAvgMap.keySet().forEach(key -> { + resultList.add(strAvgMap.get(key)); + }); + return ResponseData.success(resultList); } /** @@ -181,12 +204,178 @@ } /** - * 员工考勤人数变化,功能待定 + * 员工考勤人数变化,统计当天(横坐标为时)及近7天(横坐标为天)的考勤人数变化,只要发生一次考勤识别,次数的基数就正常增加(没有上班下班区分) */ + @PostMapping("/staff/attendanceNumber/{dimension}") + @ResponseBody + public Object attendanceNumber(@PathVariable("dimension") String dimension) { + List attendanceNumberDTOs = null; + List> resultList = new ArrayList<>(); + if("week".equals(dimension)){ + //近7天数据按天分组统计 + attendanceNumberDTOs = attendanceInfoMapper.getCountForWeek(); + }else if("day".equals(dimension)) { + //今天数据按小时分组统计 + attendanceNumberDTOs = attendanceInfoMapper.getCountForDay(); + } + if(CollectionUtils.isEmpty(attendanceNumberDTOs)){ + return ResponseData.error("该查询条件下,无员工出勤数据!"); + } + Map> collect = attendanceNumberDTOs.stream().collect(Collectors.groupingBy(AttendanceNumberDTO::getDate)); + collect.keySet().forEach(key -> { + List attendanceNumberDTOS = collect.get(key); + AttendanceNumberDTO attendanceNumberDTO = attendanceNumberDTOS.get(0); + AttendanceNumberDTO attendanceNumberDTO2 = attendanceNumberDTOS.get(1); + Map resultMap = new HashMap<>(); + resultMap.put(attendanceNumberDTO.getStaffType(), attendanceNumberDTO.getQuantity()); + resultMap.put(attendanceNumberDTO2.getStaffType(), attendanceNumberDTO2.getQuantity()); + resultMap.put("staticTime", attendanceNumberDTO.getDate()); + resultList.add(resultMap); + }); + return ResponseData.success(resultList); + } /** - * 近30天/近一周安保人员到岗排行 + * 早晚高峰区域安防评估 */ + @PostMapping("/security/assessment/{dimension}") + @ResponseBody + public Object securityAssessment(@PathVariable("dimension") String dimension) { + //查询各危险级别权重、各类别权重,放入map,避免循环中多次查数据库 + HashMap hazardScoreMap = new HashMap<>(); + List caseHazardLevelList = hazardLevelMapper.getCaseHazardLevelList(null); + caseHazardLevelList.forEach(hazardLevel -> { + hazardScoreMap.put(hazardLevel.getCode(), hazardLevel.getWeight()); + }); + HashMap categoryScoreMap = new HashMap<>(); + List categoryLevelList = categoryLevelMapper.getCaseCategoryLevelList(null); + categoryLevelList.forEach(categoryLevel -> { + categoryScoreMap.put(categoryLevel.getCode(), categoryLevel.getWeight()); + }); + HashMap hashMap = new HashMap<>(); + if("week".equals(dimension)){ + //近7天早晚高峰数据 + List caseInfos = caseInfoMapper.selectListBySevenDay(); + //按时间(天)进行分组 + caseInfos.forEach(caseInfo -> { + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); + Double score = Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + String[] array = caseInfo.getHappenTime().split(" "); + String dayTime = array[0]; + BigDecimal preScore; + if(hashMap.containsKey(dayTime)){ + Double aDouble = hashMap.get(dayTime); + preScore = new BigDecimal(aDouble.toString()); + + }else{ + preScore = new BigDecimal("100.0"); + } + BigDecimal nowScore = new BigDecimal(score.toString()); + hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); + }); + return ResponseData.success(hashMap); + }else if("day".equals(dimension)) { + //今天数据按小时分组统计 + List caseInfos = caseInfoMapper.selectListByToday(); + caseInfos.forEach(caseInfo -> { + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); + Double score = Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + String[] array = caseInfo.getHappenTime().split(":"); + String dayTime = array[0]; + BigDecimal preScore; + if(hashMap.containsKey(dayTime)){ + Double aDouble = hashMap.get(dayTime); + preScore = new BigDecimal(aDouble.toString()); + + }else{ + preScore = new BigDecimal("100.0"); + } + BigDecimal nowScore = new BigDecimal(score.toString()); + hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); + }); + return ResponseData.success(hashMap); + } + return null; + } + + /** + * 重点区域安防事态评估,统计重点区域6:00-23:00按小时分组数据 + */ + @GetMapping("/security/keyAreaStatistic") + @ResponseBody + public Object keyAreaStatistic() { + //查询各危险级别权重、各类别权重,放入map,避免循环中多次查数据库 + HashMap hazardScoreMap = new HashMap<>(); + List caseHazardLevelList = hazardLevelMapper.getCaseHazardLevelList(null); + caseHazardLevelList.forEach(hazardLevel -> { + hazardScoreMap.put(hazardLevel.getCode(), hazardLevel.getWeight()); + }); + HashMap categoryScoreMap = new HashMap<>(); + List categoryLevelList = categoryLevelMapper.getCaseCategoryLevelList(null); + categoryLevelList.forEach(categoryLevel -> { + categoryScoreMap.put(categoryLevel.getCode(), categoryLevel.getWeight()); + }); + HashMap hashMap = new HashMap<>(); + //今天数据按小时分组统计 + List caseInfos = caseInfoMapper.selectListByToday2(); + caseInfos.forEach(caseInfo -> { + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); + Double score = Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + String[] array = caseInfo.getHappenTime().split(":"); + String dayTime = array[0]; + BigDecimal preScore; + if(hashMap.containsKey(dayTime)){ + Double aDouble = hashMap.get(dayTime); + preScore = new BigDecimal(aDouble.toString()); + + }else{ + preScore = new BigDecimal("100.0"); + } + BigDecimal nowScore = new BigDecimal(score.toString()); + hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); + }); + return ResponseData.success(hashMap); + } + + /** + * 安防机动支援力量调配响应评估,根据事件已解决状态及已解决时间-发送时间,按时间(小时)分组统计 + */ + @GetMapping("/security/responseAssess") + @ResponseBody + public Object responseAssess() { + //查询各危险级别权重、各类别权重,放入map,避免循环中多次查数据库 + HashMap hazardScoreMap = new HashMap<>(); + List caseHazardLevelList = hazardLevelMapper.getCaseHazardLevelList(null); + caseHazardLevelList.forEach(hazardLevel -> { + hazardScoreMap.put(hazardLevel.getCode(), hazardLevel.getWeight()); + }); + HashMap hashMap = new HashMap<>(); + //今天数据按小时分组统计 + List caseInfos = caseInfoMapper.selectListByToday3(); + caseInfos.forEach(caseInfo -> { + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + //扣分=事件级别权重*未解决小时数 + Date updateTime = DateUtil.parse(caseInfo.getUpdateTime()); + Date happenTime = DateUtil.parse(caseInfo.getHappenTime()); + long between = DateUtil.between(updateTime, happenTime, DateUnit.HOUR); + Double score = Double.valueOf(hazardWeight)*between; + String[] array = caseInfo.getHappenTime().split(":"); + String dayTime = array[0]; + BigDecimal preScore; + if(hashMap.containsKey(dayTime)){ + Double aDouble = hashMap.get(dayTime); + preScore = new BigDecimal(aDouble.toString()); + }else{ + preScore = new BigDecimal("100.0"); + } + BigDecimal nowScore = new BigDecimal(score.toString()); + hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); + }); + return ResponseData.success(hashMap); + } /** * 重点区域威胁事件类型统计,优先级2,统计近7天和近30天 @@ -224,7 +413,34 @@ } /** - * 设备状态计算系数和评判,优先级3,需确认设备恢复时间是否可以获取 + * 近30天/近一周安保人员到岗排行 */ + + /** + * 安保等级评估,发生离岗事件减1分 + */ + @GetMapping("/security/levelAssess") + @ResponseBody + public Object securityLevelAssess() { + //今天数据按小时分组统计 + List resultList = caseInfoMapper.selectListByType(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); + resultList.forEach(result -> { + BigDecimal deScore = new BigDecimal(result.getQuantity()); + BigDecimal preScore = new BigDecimal("100.0"); + result.setScore(preScore.subtract(deScore).doubleValue()); + }); + return ResponseData.success(resultList); + } + + /** + * 设备状态计算系数和评判,即设备维修管理查询(不分页) + */ + @PostMapping("/device/repairList") + @ResponseBody + public Object repairList(@RequestBody DeviceRepairRequest deviceRepairRequest) { + List deviceRepairLogDTOS = deviceInfoService.deviceRepairListPage(deviceRepairRequest); + return ResponseData.success(deviceRepairLogDTOS); + } + } 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 fbf8ab6..c71a15a 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 @@ -1,13 +1,12 @@ package com.casic.missiles.modular.controller.hik; +import cn.hutool.core.date.DateTime; +import cn.hutool.core.date.DateUtil; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.casic.missiles.model.response.ResponseData; import com.casic.missiles.modular.dao.HikFaceGroupInfoMapper; -import com.casic.missiles.modular.dto.hik.EventSubscribeRequest; -import com.casic.missiles.modular.dto.hik.FaceGroupAdditionRequest; -import com.casic.missiles.modular.dto.hik.HikRecvEvent; -import com.casic.missiles.modular.dto.hik.OrgBatchAdd; +import com.casic.missiles.modular.dto.hik.*; import com.casic.missiles.modular.enums.HikUri; import com.casic.missiles.modular.enums.SecurityEventType; import com.casic.missiles.modular.model.CaseInfo; @@ -18,16 +17,20 @@ import com.casic.missiles.modular.util.CaseInfoFactoryUtil; import com.casic.missiles.modular.util.HikUtil; import com.casic.missiles.modular.util.ThreadPoolUtil; +import com.casic.missiles.modular.util.WebSocket; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; -import org.springframework.web.bind.annotation.*; +import org.springframework.util.CollectionUtils; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.RestController; -import java.net.InetAddress; -import java.net.UnknownHostException; import java.util.ArrayList; +import java.util.Iterator; import java.util.List; import java.util.Objects; @@ -38,7 +41,6 @@ */ @Slf4j @RestController -@RequestMapping("/hik") public class HikController { @Autowired @@ -53,28 +55,37 @@ @Autowired private HikService hikService; + @Autowired + private HikFaceGroupInfoMapper hikFaceGroupInfoMapper; + + @Autowired + private WebSocket webSocket; + @Value("${server.port}") private int serverPort; - @Autowired - private HikFaceGroupInfoMapper hikFaceGroupInfoMapper; /** * 海康事件订阅 */ - @PostMapping("/event/subscribe") + @PostMapping("/hik/event/subscribe") @ResponseBody - public Object eventSubscribe() throws UnknownHostException { + public Object eventSubscribe() { EventSubscribeRequest eventSubscribeRequest = new EventSubscribeRequest(); ArrayList list = new ArrayList<>(); list.add(SecurityEventType.DEVICE_OFFLINE); + list.add(SecurityEventType.DEVICE_ONLINE); list.add(SecurityEventType.KEY_PERSONNEL_IDENTIFY_EVENT); list.add(SecurityEventType.MONITORING_POINT_OFFLINE); + list.add(SecurityEventType.MONITORING_POINT_ONLINE); list.add(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); list.add(SecurityEventType.PERSONNEL_GATHER_EVENT); - InetAddress localHost = InetAddress.getLocalHost(); + list.add(SecurityEventType.VISITOR_REGISTER); + list.add(SecurityEventType.VISITOR_CHECKOUT); + list.add(SecurityEventType.HIGH_ALTITUDE_PARABOLIC); +// InetAddress localHost = InetAddress.getLocalHost(); eventSubscribeRequest.setEventTypes(list); - eventSubscribeRequest.setEventDest("https://" + localHost + ":" + serverPort + "/eventRcv"); + eventSubscribeRequest.setEventDest("http://" + "192.168.10.6" + ":" + serverPort + "/eventRcv"); //订阅类型,0-订阅原始事件,1-联动事件,2-原始事件和联动事件,不填使用默认值0 eventSubscribeRequest.setSubType(0); /** @@ -92,19 +103,25 @@ } /** + * 查询事件订阅信息 + */ + @PostMapping("/hik/event/query") + @ResponseBody + public Object eventQuery() { + String result = HikUtil.hikApi(HikUri.EVENT_INFO, ""); + return result; + } + + /** * 海康事件接收 */ @PostMapping("/eventRcv") @ResponseBody public Object eventRcv(@RequestBody HikRecvEvent hikRecvEvent) { //1、接收所需事件类型 - Long eventType = hikRecvEvent.getEventType(); + Number eventType = hikRecvEvent.getEventType(); log.info("接收到安防事件类型为:{}", eventType); CaseInfo caseInfo = caseInfoFactoryUtil.getCaseInfo(eventType); - //接收到不关心事件直接返回 - if(Objects.isNull(caseInfo)){ - return ResponseData.success(); - } //2、不同事件不同处理,caseInfoFactoryUtil已设置好事件基础定义信息 // 再为事件添加状态、设备编码、设备名称、位置、区域、时间 // 异步处理事件 @@ -114,19 +131,23 @@ caseHandle(hikRecvEvent, eventType, caseInfo); } })); +// caseHandle(hikRecvEvent, eventType, caseInfo); - return null; + return ResponseData.success(); } - private void caseHandle(HikRecvEvent hikRecvEvent, Long eventType, CaseInfo caseInfo) { + private void caseHandle(HikRecvEvent hikRecvEvent, Number eventType, CaseInfo caseInfo) { JSONArray eventArray = hikRecvEvent.getEventArray(); List caseInfos = new ArrayList<>(); - while (eventArray.stream().iterator().hasNext()) { + Iterator iterator = eventArray.iterator(); + while (iterator.hasNext()) { CaseInfo caseInfo1 = new CaseInfo(); - BeanUtils.copyProperties(caseInfo, caseInfo1); - JSONObject event = (JSONObject) eventArray.stream().iterator().next(); + if(!Objects.isNull(caseInfo)){ + BeanUtils.copyProperties(caseInfo, caseInfo1); + } + JSONObject event = (JSONObject) iterator.next(); //5种事件进行不同处理 - if(SecurityEventType.KEY_PERSONNEL_IDENTIFY_EVENT == eventType){ + if (SecurityEventType.KEY_PERSONNEL_IDENTIFY_EVENT.equals(eventType)) { //判断所属人脸分组 JSONObject data = (JSONObject) event.get("data"); JSONObject faceRecognitionResult = (JSONObject) data.get("faceRecognitionResult"); @@ -142,52 +163,101 @@ if (faceGroupCode.equals(blackListGroup.getFaceGroupCode())) { //黑名单分组处理 caseInfo1 = hikService.blackListHandle(event, caseInfo1); - }else if(faceGroupCode.equals(propertyPersonnelGroup.getFaceGroupCode())){ + } else if (faceGroupCode.equals(propertyPersonnelGroup.getFaceGroupCode())) { //考勤分组处理-物业人员,添加到考勤表 hikService.propertyAttendanceHandle(event); - }else if(faceGroupCode.equals(securityPersonnelGroup.getFaceGroupCode())){ + } else if (faceGroupCode.equals(securityPersonnelGroup.getFaceGroupCode())) { //考勤分组处理-安保人员,添加到考勤表 hikService.securityPersonnelHandle(event); - }else { + } else { return; } - }else if(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT == eventType){ + } else if (SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT.equals(eventType)) { //离岗事件处理 caseInfo1 = hikService.demobilizedHandle(event, caseInfo1); - }else if(SecurityEventType.PERSONNEL_GATHER_EVENT == eventType){ + } else if (SecurityEventType.PERSONNEL_GATHER_EVENT.equals(eventType)) { //人员聚集事件处理 caseInfo1 = hikService.personGatherHandle(event, caseInfo1); - }else if(SecurityEventType.MONITORING_POINT_OFFLINE == eventType){ + } else if (SecurityEventType.MONITORING_POINT_OFFLINE.equals(eventType)) { //监控点离线事件处理 caseInfo1 = hikService.monitorPointOfflineHandle(event, caseInfo1); - }else if(SecurityEventType.DEVICE_OFFLINE == eventType){ + } else if (SecurityEventType.MONITORING_POINT_ONLINE.equals(eventType)) { + //监控点上线事件处理 + hikService.monitorPointOnlineHandle(event); + } else if (SecurityEventType.DEVICE_OFFLINE.equals(eventType)) { //装置离线事件处理 caseInfo1 = hikService.deviceOfflineHandle(event, caseInfo1); - }else if(SecurityEventType.VISITOR_REGISTER == eventType){ + } else if (SecurityEventType.DEVICE_ONLINE.equals(eventType)) { + //装置上线处理 + hikService.deviceOnlineHandle(event); + } else if (SecurityEventType.VISITOR_REGISTER.equals(eventType)) { //记录访客登记记录,添加到访客记录表 hikService.visitorRegisterHandler(event); - }else if(SecurityEventType.VISITOR_CHECKOUT == eventType){ + } else if (SecurityEventType.VISITOR_CHECKOUT.equals(eventType)) { //记录访客签离记录 hikService.visitorCheckOutHandler(event); } - if(!Objects.isNull(caseInfo1) && !StringUtils.isEmpty(caseInfo1.getHappenTime())){ + if (!Objects.isNull(caseInfo1) && !StringUtils.isEmpty(caseInfo1.getHappenTime())) { caseInfos.add(caseInfo1); } } //3、安防事件入库 - if(!caseInfoService.insertCaseInfoBatch(caseInfos)){ - log.error("安防事件批量入库异常"); + if (!CollectionUtils.isEmpty(caseInfos) && !caseInfoService.insertCaseInfoBatch(caseInfos)) { + log.error("安防事件批量入库异常!"); } // TODO: 2022/8/15 webSocket推送 + if (CollectionUtils.isEmpty(caseInfos)) { + log.info("webSocket事件推送"); + webSocket.sendAllMessage(JSONObject.toJSONString(caseInfos)); + } return; } /** + * 以图搜图,前端用于轨迹追踪 + */ + @PostMapping("/hik/search/picture") + @ResponseBody + public Object searchPictures(@RequestBody SearchPicturesRequest searchPicturesRequest) { + DateTime startDateTime = DateUtil.parse(searchPicturesRequest.getStartTime()); + DateTime endDateTime = DateUtil.parse(searchPicturesRequest.getEndTime()); + String startTime = DateUtil.format(startDateTime, "yyyy-MM-dd'T'HH:mm:ss.SSSXXX"); + String endTime = DateUtil.format(endDateTime, "yyyy-MM-dd'T'HH:mm:ss.SSSXXX"); + searchPicturesRequest.setStartTime(startTime); + searchPicturesRequest.setEndTime(endTime); + String body = JSONObject.toJSONString(searchPicturesRequest); + String resultStr = HikUtil.hikApi(HikUri.SEARCH_PICTURES, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (!"0".equals(resultJson.get("code"))) { + log.error("请求海康,以图搜图失败,海康response:{}", resultStr); + return ResponseData.error("以图搜图失败"); + } + return ResponseData.success(resultJson); + } + + + /** + * 海康事件取消订阅 + */ + @PostMapping("/hik/event/cancel") + @ResponseBody + public Object eventCancelSubscribe(@RequestBody CancelSubscribeRequest cancelSubscribeRequest) { + String body = JSONObject.toJSONString(cancelSubscribeRequest); + String resultStr = HikUtil.hikApi(HikUri.EVENT_CANCEL, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (!"0".equals(resultJson.get("code"))) { + log.error("请求海康,取消订阅失败,海康response:{}", resultStr); + return ResponseData.error("取消订阅失败"); + } + return ResponseData.success(resultJson); + } + + /** * 单个添加海康人脸分组 * api->hik单个添加人脸分组api->response->mysql */ - @PostMapping("/faceGroup/single/add") + @PostMapping("/hik/faceGroup/single/add") @ResponseBody public Object faceGroupAddition(@RequestBody FaceGroupAdditionRequest faceGroupAdditionRequest) { String body = JSONObject.toJSONString(faceGroupAdditionRequest); @@ -212,7 +282,7 @@ * 批量添加海康组织 * api->hik批量添加组织api->response */ - @PostMapping("/org/batch/add") + @PostMapping("/hik/org/batch/add") @ResponseBody public Object orgBatchAdd(@RequestBody List orgBatchAddRequest) { String body = JSONObject.toJSONString(orgBatchAddRequest); @@ -232,4 +302,62 @@ return ResponseData.error("批量添加组织失败"); } + /** + * 获取人员列表 + */ + @PostMapping("/hik/person/personList") + @ResponseBody + public Object personList() { + PersonListRequest request = new PersonListRequest(); + request.setPageNo(1); + request.setPageSize(100); + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi("/api/resource/v2/person/personList", body); + return resultStr; + } + + /** + * 获取组织列表 + */ + @PostMapping("/hik/org/orgList") + @ResponseBody + public Object orgList() { + PersonListRequest request = new PersonListRequest(); + request.setPageNo(1); + request.setPageSize(100); + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi("/api/resource/v1/org/orgList", body); + return resultStr; + } + + /** + * 查询访客权限下载记录 + */ + @PostMapping("/hik/auth/result") + @ResponseBody + public Object authResult() { + PersonListRequest request = new PersonListRequest(); + request.setPageNo(1); + request.setPageSize(100); + request.setOrderId("ba101db6246711edaea66f7939a13638"); + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi("/api/visitor/v1/auth/result", body); + return resultStr; + } + + /** + * 人脸图片获取 + */ + @PostMapping("/hik/face/picture") + @ResponseBody + public Object facePicture() { + FaceRequest request = new FaceRequest(); +// List list = new ArrayList<>(); +// list.add(""); + request.setCertificateNum("wanggong"); + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi("/api/frs/v1/face", body); + return resultStr; + } + } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/AssetInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/AssetInfoMapper.java index 4f64e83..c0684ee 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/AssetInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/AssetInfoMapper.java @@ -17,6 +17,6 @@ @Mapper public interface AssetInfoMapper extends BaseMapper { - List getAssetInfoListPage(@Param("page") Page page, AssetInfoRequest assetInfoRequest); + List getAssetInfoListPage(@Param("page") Page page, @Param("assetInfoRequest") AssetInfoRequest assetInfoRequest); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/AttendanceInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/AttendanceInfoMapper.java index f9e793e..ec87e46 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/AttendanceInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/AttendanceInfoMapper.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.statistics.AttendanceNumberDTO; import com.casic.missiles.modular.dto.statistics.AttendanceRatioDTO; import com.casic.missiles.modular.model.AttendanceInfo; import org.apache.ibatis.annotations.Mapper; @@ -17,7 +18,7 @@ */ @Mapper public interface AttendanceInfoMapper extends BaseMapper { - List getAttendanceInfoListPage(@Param("page") Page page, StaffInfoRequest attendanceInfoRequest); + List getAttendanceInfoListPage(@Param("page") Page page, @Param("attendanceInfoRequest") StaffInfoRequest attendanceInfoRequest); AttendanceInfo selectByCodeAndDate(@Param("staffCode") String staffCode); @@ -26,4 +27,8 @@ List getCountByTypeAndDateForMonth(@Param("staffType")String staffType); List getCountByTypeAndDateForYear(@Param("staffType")String staffType); + + List getCountForWeek(); + + List getCountForDay(); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java index ce94b8f..6137a7d 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java @@ -17,5 +17,5 @@ @Mapper public interface BlackInfoMapper extends BaseMapper { - List getBlackInfoListPage(@Param("page") Page page, BlackInfoRequest blackInfoRequest); + List getBlackInfoListPage(@Param("page") Page page, @Param("blackInfoRequest") BlackInfoRequest blackInfoRequest); } 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 efda6b3..50aaa6f 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 @@ -20,7 +20,7 @@ List getCaseInfoListPage(@Param("page") Page page, @Param("caseInfoRequest") CaseInfoRequest caseInfoRequest); - int updateStatusById(CaseInfoRequest caseInfoRequest); + int updateStatusById(@Param("caseInfoRequest") CaseInfoRequest caseInfoRequest); List selectByLevelAndMonth(@Param("year") String year); @@ -47,4 +47,20 @@ List selectPreWeekCountByThirtyDay(); List selectPreDayCountBySevenDay(); + + Integer selectDemobilizedCount(@Param("eventType") Number personnelDemobilizedEvent); + + List selectPreMonthCount(); + + List selectListBySevenDay(); + + List selectListByToday(); + + List selectListByToday2(); + + List selectListByToday3(); + + List selectListByType(@Param("eventType") Number eventType); + + List selectDemobilizedCountByHour(@Param("eventType") Number eventType); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/CategoryLevelMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/CategoryLevelMapper.java index 52fc714..afe1650 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/CategoryLevelMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/CategoryLevelMapper.java @@ -17,9 +17,9 @@ @Mapper public interface CategoryLevelMapper extends BaseMapper { - List getCaseCategoryLevelListPage(@Param("page") Page page, CategoryLevelRequest categoryLevelRequest); + List getCaseCategoryLevelListPage(@Param("page") Page page, @Param("categoryLevelRequest") CategoryLevelRequest categoryLevelRequest); - List getCaseCategoryLevelList(CategoryLevelRequest categoryLevelRequest); + List getCaseCategoryLevelList(@Param("categoryLevelRequest") CategoryLevelRequest categoryLevelRequest); CaseCategoryLevel getCaseCategoryLevel(@Param("categoryLevelCode") String categoryLevelCode); 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 66353b1..2555a09 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 @@ -19,7 +19,7 @@ @Mapper public interface DeviceInfoMapper extends BaseMapper { - List getDeviceInfoListPage(@Param("page") Page page, DeviceInfoRequest deviceInfoRequest); + List getDeviceInfoListPage(@Param("page") Page page, @Param("deviceInfoRequest") DeviceInfoRequest deviceInfoRequest); List getDeviceInfoList(@Param("deviceInfoRequest") DeviceInfoRequest deviceInfoRequest); @@ -27,6 +27,8 @@ DeviceInfo getByIndexCode(@Param("srcIndex") String srcIndex); + DeviceInfo getByIp(@Param("ip") String ip); + List selectIndexCodesByCodes(@Param("deviceCodes") List deviceCodes); List selectByType(@Param("devType") String devType); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java index 41dd0af..5bfaf63 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java @@ -5,6 +5,7 @@ import com.casic.missiles.modular.dto.DeviceRepairRequest; import com.casic.missiles.modular.model.DeviceRepairLog; import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; import java.util.List; @@ -16,7 +17,7 @@ @Mapper public interface DeviceRepairLogMapper extends BaseMapper { - List getDeviceRepairListPage(Page page, DeviceRepairRequest deviceRepairRequest); + List getDeviceRepairListPage(@Param("page") Page page, @Param("deviceRepairRequest")DeviceRepairRequest deviceRepairRequest); - List getDeviceRepairList(DeviceRepairRequest deviceRepairRequest); + List getDeviceRepairList(@Param("deviceRepairRequest") DeviceRepairRequest deviceRepairRequest); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java index 9035c47..4823ac1 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java @@ -18,7 +18,7 @@ @Mapper public interface FireEquipInfoMapper extends BaseMapper { - List getFireEquipInfoListPage(@Param("page") Page page, FireEquipRequest fireEquipRequest); + List getFireEquipInfoListPage(@Param("page") Page page, @Param("fireEquipRequest") FireEquipRequest fireEquipRequest); FireEquipInfo getFireEquipInfo(@Param("equipCode") String equipCode); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/GateGroupMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/GateGroupMapper.java index d8c330d..977a427 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/GateGroupMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/GateGroupMapper.java @@ -17,7 +17,7 @@ */ @Mapper public interface GateGroupMapper extends BaseMapper { - List getGateGroupListPage(@Param("page") Page page, GateGroupRequest gateGroupRequest); + List getGateGroupListPage(@Param("page") Page page, @Param("gateGroupRequest") GateGroupRequest gateGroupRequest); GateGroup getGateGroupByName(@Param("groupName") String groupName); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/HazardLevelMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/HazardLevelMapper.java index 8957780..dcf47bb 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/HazardLevelMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/HazardLevelMapper.java @@ -17,11 +17,13 @@ @Mapper public interface HazardLevelMapper extends BaseMapper { - List getCaseHazardLevelListPage(@Param("page") Page page, HazardLevelRequest hazardLevelRequest); + List getCaseHazardLevelListPage(@Param("page") Page page, @Param("hazardLevelRequest") HazardLevelRequest hazardLevelRequest); - List getCaseHazardLevelList(HazardLevelRequest hazardLevelRequest); + List getCaseHazardLevelList(@Param("hazardLevelRequest") HazardLevelRequest hazardLevelRequest); CaseHazardLevel getCaseHazardLevel(@Param("hazardLevelCode") String hazardLevelCode); List selectHazardName(); + + String selectHazardNameByCode(@Param("hazardLevelCode") String hazardLevelCode); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/HikCaseDefineMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/HikCaseDefineMapper.java index 0dc47d1..f162fef 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/HikCaseDefineMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/HikCaseDefineMapper.java @@ -12,5 +12,5 @@ */ @Mapper public interface HikCaseDefineMapper extends BaseMapper { - HikCaseDefine getHikCaseDefine(@Param("caseTypeCode") Long caseTypeCode); + HikCaseDefine getHikCaseDefine(@Param("caseTypeCode") Number caseTypeCode); } 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 f8a674c..fe5afc2 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 @@ -17,11 +17,13 @@ @Mapper public interface StaffInfoMapper extends BaseMapper { - List getStaffInfoListPage(@Param("page") Page page, StaffInfoRequest staffInfoRequest); + List getStaffInfoListPage(@Param("page") Page page, @Param("staffInfoRequest") StaffInfoRequest staffInfoRequest); StaffInfo selectByCode(@Param("staffCode") String staffCode); - List getStaffInfoList(StaffInfoRequest staffInfoRequest); + List getStaffInfoList(@Param("staffInfoRequest") StaffInfoRequest staffInfoRequest); - List selectBatchCodes(List list); + List selectBatchCodes(@Param("list") List list); + + int updateByCodeForCard(@Param("staffCode") String staffCode, @Param("cardNo") String cardNo); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitInfoMapper.java index b1217c5..6c52542 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitInfoMapper.java @@ -16,7 +16,7 @@ */ @Mapper public interface VisitInfoMapper extends BaseMapper { - List getVisitInfoListPage(@Param("page") Page page, VisitorRequest visitorRequest); + List getVisitInfoListPage(@Param("page") Page page, @Param("visitorRequest") VisitorRequest visitorRequest); VisitInfo selectByOrderId(@Param("orderId") String orderId); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitorApplyMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitorApplyMapper.java index c09f3c0..6ea55bd 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitorApplyMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitorApplyMapper.java @@ -18,7 +18,7 @@ @Mapper public interface VisitorApplyMapper extends BaseMapper { - List getVisitorApplyListPage(@Param("page") Page page, VisitorApplyRequest visitorApplyRequest); + List getVisitorApplyListPage(@Param("page") Page page, @Param("visitorApplyRequest") VisitorApplyRequest visitorApplyRequest); List selectByVisitReason(); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/AttendanceInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/AttendanceInfoMapper.xml index b2ece71..f8bdd6e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/AttendanceInfoMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/AttendanceInfoMapper.xml @@ -43,7 +43,8 @@ and staff_type = #{staffType} - and YEARWEEK(date_format(atte_date, '%Y-%m-%d'), 1) = YEARWEEK(now(),1); + AND DATE_SUB(CURDATE(), INTERVAL 7 DAY) <= DATE(atte_date) + GROUP BY DATE_FORMAT(atte_date, '%Y-%m-%d') @@ -69,4 +70,20 @@ GROUP BY DATE_FORMAT(atte_date, '%Y-%m') + + + \ No newline at end of file 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 2b6953f..06ec0a8 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 @@ -28,7 +28,9 @@ @@ -87,7 +89,8 @@ SELECT hazard_level_code as levelCode, count(id) as quantity FROM bus_case_info WHERE hazard_level_code is not null - AND DATE_SUB(CURDATE(), INTERVAL 7 DAY) <= date(happen_time); + AND is_key_area = 1 + AND DATE_SUB(CURDATE(), INTERVAL 7 DAY) <= date(happen_time) GROUP BY hazard_level_code @@ -95,7 +98,8 @@ SELECT hazard_level_code as levelCode, count(id) as quantity FROM bus_case_info WHERE hazard_level_code is not null - AND DATE_SUB(CURDATE(), INTERVAL 30 DAY) <= date(happen_time); + AND is_key_area = 1 + AND DATE_SUB(CURDATE(), INTERVAL 30 DAY) <= date(happen_time) GROUP BY hazard_level_code @@ -122,4 +126,71 @@ AND hazard_level_code is not null GROUP BY DATE_FORMAT(happen_time,'%Y-%m-%d') + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/CategoryLevelMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/CategoryLevelMapper.xml index 4670b1f..1d25cbd 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/CategoryLevelMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/CategoryLevelMapper.xml @@ -20,11 +20,11 @@ SELECT * FROM bus_case_category_level WHERE 1=1 - - and code = #{code} + + and code = #{categoryLevelRequest.code} - - and name = #{name} + + and name = #{categoryLevelRequest.name} ORDER by create_time DESC 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 9b66fd8..bfd84b7 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 @@ -98,4 +98,10 @@ #{item} + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceRepairLogMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceRepairLogMapper.xml index 078ed3c..cf1a481 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceRepairLogMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceRepairLogMapper.xml @@ -22,14 +22,14 @@ SELECT * FROM bus_device_repair_log WHERE 1=1 - - and device_code = #{devCode} + + and device_code = #{deviceRepairRequest.devCode} - - and device_name = #{devName} + + and device_name = #{deviceRepairRequest.devName} - - and DATE_FORMAT(create_time,"%y%m%d") = DATE_FORMAT(#{createTime},"%y%m%d") + + and DATE_FORMAT(create_time,"%y%m%d") = DATE_FORMAT(#{deviceRepairRequest.createTime},"%y%m%d") ORDER by create_time DESC diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/HazardLevelMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/HazardLevelMapper.xml index f16f2b9..458322b 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/HazardLevelMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/HazardLevelMapper.xml @@ -20,11 +20,11 @@ SELECT * FROM bus_case_hazard_level WHERE 1=1 - - and code = #{code} + + and code = #{hazardLevelRequest.code} - - and name = #{name} + + and name = #{hazardLevelRequest.name} ORDER by create_time DESC @@ -42,4 +42,10 @@ SELECT name FROM bus_case_hazard_level + + \ 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 557237e..b6a183a 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 @@ -50,4 +50,10 @@ + + + UPDATE bus_staff_info + SET card_no = #{cardNo} + WHERE staff_code = #{staffCode} + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitInfoMapper.xml index 84aa84f..230529a 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitInfoMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitInfoMapper.xml @@ -27,5 +27,6 @@ SELECT * FROM bus_visit_info WHERE order_id = #{orderId} and DATE_FORMAT(in_time,'%Y-%m-%d') = CURRENT_DATE + limit 1 \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/BlackPictureRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/BlackPictureRequest.java new file mode 100644 index 0000000..fc92701 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/BlackPictureRequest.java @@ -0,0 +1,14 @@ +package com.casic.missiles.modular.dto; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/29 19:26 + */ +@Data +public class BlackPictureRequest { + private String picUri; + private String serverIndexCode; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/CancelSubscribeRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/CancelSubscribeRequest.java new file mode 100644 index 0000000..e2d390a --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/CancelSubscribeRequest.java @@ -0,0 +1,15 @@ +package com.casic.missiles.modular.dto.hik; + +import lombok.Data; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/24 15:14 + */ +@Data +public class CancelSubscribeRequest { + private List eventTypes; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/CardInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/CardInfo.java new file mode 100644 index 0000000..341457d --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/CardInfo.java @@ -0,0 +1,24 @@ +package com.casic.missiles.modular.dto.hik; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/26 16:08 + */ +@Data +public class CardInfo { + //卡号,8~20个字符,支持数字和大写字母 + private String cardNo; + //人员ID,员工工号 + private String personId; + //人员所属组织IndexCode + private String orgIndexCode; + //卡片类型,默认是1:IC卡 + //1:IC卡 + //2:CPU卡 + //3:远距离卡 + //4:MIFARE卡 + private Number cardType; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/BlackListController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/BlackListController.java index a27f9f8..0c06661 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/BlackListController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/BlackListController.java @@ -1,13 +1,18 @@ package com.casic.missiles.modular.controller; +import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.base.controller.ExportController; import com.casic.missiles.core.page.PageFactory; import com.casic.missiles.model.response.ResponseData; import com.casic.missiles.modular.dto.BlackInfoRequest; +import com.casic.missiles.modular.dto.BlackPictureRequest; +import com.casic.missiles.modular.dto.hik.PersonInfoRequest; +import com.casic.missiles.modular.enums.HikUri; import com.casic.missiles.modular.enums.OperateTypeEnum; import com.casic.missiles.modular.model.BlackInfo; import com.casic.missiles.modular.service.BlackInfoService; +import com.casic.missiles.modular.util.HikUtil; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; @@ -56,4 +61,22 @@ return null; } + /** + * 黑名单人员照片 + */ + @PostMapping("/personPicture") + @ResponseBody + public Object personPicture(@RequestBody BlackPictureRequest blackPictureRequest){ + //获取照片 + String picUri = blackPictureRequest.getPicUri(); + String serverIndexCode = blackPictureRequest.getServerIndexCode(); + PersonInfoRequest picRequest = new PersonInfoRequest(); + picRequest.setPicUri(picUri); + picRequest.setServerIndexCode(serverIndexCode); + String reBody = JSONObject.toJSONString(picRequest); + //重定向地址获取 + String url = HikUtil.hikApiFor302(HikUri.PERSON_PICTURE, reBody); + return ResponseData.success(url); + } + } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/DeviceController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/DeviceController.java index e1c4eba..666bbee 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/DeviceController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/DeviceController.java @@ -107,7 +107,7 @@ } /** - * 设备维修管理查询(分页),需计算MTTR=总维修时间/故障次数 + * 设备状态计算与评判/设备维修管理查询(分页),需计算MTTR=总维修时间/故障次数 */ @PostMapping("/repair/listPage") @ResponseBody @@ -211,7 +211,7 @@ //需根据设备编号获取到对应的门禁点唯一标识 doorControlRequest.setDoorIndexCodes(indexCodes); doorControlRequest.setControlType(Integer.valueOf(gateGroupDTO.getStatus())); - String body = JSONObject.toJSONString(deviceCodes); + String body = JSONObject.toJSONString(doorControlRequest); String resultStr = HikUtil.hikApi(HikUri.DOOR_CONTROL, body); JSONObject resultJson = (JSONObject)JSONObject.parse(resultStr); if (!"0".equals(resultJson.get("code"))) { diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/StaffController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/StaffController.java index b58ccab..704093c 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/StaffController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/StaffController.java @@ -2,15 +2,21 @@ import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.util.StrUtil; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.base.controller.ExportController; import com.casic.missiles.core.page.PageFactory; import com.casic.missiles.model.response.ErrorResponseData; import com.casic.missiles.model.response.ResponseData; import com.casic.missiles.modular.dto.StaffInfoRequest; +import com.casic.missiles.modular.dto.hik.PersonInfoRequest; +import com.casic.missiles.modular.dto.hik.StaffCardRequest; +import com.casic.missiles.modular.enums.HikUri; import com.casic.missiles.modular.enums.OperateTypeEnum; import com.casic.missiles.modular.model.StaffInfo; import com.casic.missiles.modular.service.StaffInfoService; +import com.casic.missiles.modular.util.HikUtil; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; @@ -110,4 +116,60 @@ } return ResponseData.success(); } + + /** + * 批量开卡,添加人员之后调用,若在一个接口中添加人员成功开卡失败则第二次添加时会有问题 + */ + @PostMapping("/cardBinding") + @ResponseBody + public Object cardBinding(@RequestBody StaffCardRequest staffCardRequest) { + String body = JSONObject.toJSONString(staffCardRequest); + String resultStr = HikUtil.hikApi(HikUri.CARD_BINDING, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (!"0".equals(resultJson.get("code"))) { + log.error("请求海康,批量开卡失败,海康response:{}", resultStr); + return ResponseData.error("批量开卡失败"); + } + //保存卡号 + if(staffInfoService.saveCardInfo(staffCardRequest) > 0){ + return ResponseData.success(); + } + return ResponseData.error("批量开卡失败"); + } + + /** + * 获取员工照片,海康存储 + */ + @PostMapping("/personPicture/{staffCode}") + @ResponseBody + public Object personPicture(@PathVariable("staffCode") String staffCode){ + //获取员工详细信息,含图片服务器、uri + PersonInfoRequest request = new PersonInfoRequest(); + List list = new ArrayList<>(); + list.add(staffCode); + request.setParamName("personId"); + request.setParamValue(list); + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi(HikUri.PERSON_INFO, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (!"0".equals(resultJson.get("code"))) { + log.error("请求海康,根据人员唯一字段获取人员详细信息失败,海康response:{}", resultStr); + return ResponseData.error("获取员工照片失败"); + } + //获取照片 + JSONObject data = (JSONObject) resultJson.get("data"); + JSONArray dataArray = (JSONArray) data.get("list"); + JSONObject jsonObject = (JSONObject) dataArray.get(0); + JSONArray personPhoto = (JSONArray) jsonObject.get("personPhoto"); + JSONObject photo = (JSONObject) personPhoto.get(0); + String picUri = photo.getString("picUri"); + String serverIndexCode = photo.getString("serverIndexCode"); + PersonInfoRequest picRequest = new PersonInfoRequest(); + picRequest.setPicUri(picUri); + picRequest.setServerIndexCode(serverIndexCode); + String reBody = JSONObject.toJSONString(picRequest); + //重定向地址获取 + String url = HikUtil.hikApiFor302(HikUri.PERSON_PICTURE, reBody); + return ResponseData.success(url); + } } 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 4a07dd9..7b1dcf6 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 @@ -16,6 +16,7 @@ import com.casic.missiles.modular.redis.key.CacheKeys; import com.casic.missiles.modular.service.CockpitService; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.util.CollectionUtils; import org.springframework.web.bind.annotation.*; @@ -24,10 +25,7 @@ import java.text.NumberFormat; import java.time.LocalDateTime; import java.time.temporal.ChronoUnit; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.util.*; import java.util.stream.Collectors; /** @@ -73,6 +71,9 @@ private StatisticNumberMapper numberMapper; @Autowired + private HazardLevelMapper hazardLevelMapper; + + @Autowired private AccessGroupConfig accessGroupConfig; /** @@ -104,8 +105,24 @@ public Object buildingNumberPerHour(){ //当天按小时分组的人数 List list = numberMapper.selectListByTime(); - Map> collect = list.stream().collect(Collectors.groupingBy(BuildingNumberDTO::getStatisticPosition)); - return ResponseData.success(collect); + Map> collect = list.stream().collect(Collectors.groupingBy(BuildingNumberDTO::getStatisticTime)); + //定时任务中已将每小时三栋楼人数存到数据库 + //将一期主楼和录制楼人数合并,二期单算 + List> resultList = new ArrayList<>(); + collect.keySet().forEach(key -> { + List buildingNumberDTOS = collect.get(key); + BuildingNumberDTO mainBuildingOne = buildingNumberDTOS.get(0); + BuildingNumberDTO mainBuildingTwo = buildingNumberDTOS.get(1); + BuildingNumberDTO recordingBuilding = buildingNumberDTOS.get(2); + HashMap resultMap = new HashMap<>(); + Integer oneQuantity = Integer.valueOf(mainBuildingOne.getStatisticQuantity()); + Integer recordingQuantity = Integer.valueOf(recordingBuilding.getStatisticQuantity()); + resultMap.put("staticTime", mainBuildingOne.getStatisticTime()); + resultMap.put(mainBuildingOne.getStatisticPositionName()+"、"+recordingBuilding.getStatisticPositionName(), String.valueOf(oneQuantity+recordingQuantity)); + resultMap.put(mainBuildingTwo.getStatisticPositionName(), mainBuildingTwo.getStatisticQuantity()); + resultList.add(resultMap); + }); + return ResponseData.success(resultList); } /** @@ -151,12 +168,11 @@ public Object securityNumber() { QueryWrapper wrapper = new QueryWrapper<>(); wrapper.eq("staff_type", 2); + // TODO: 2022/9/2 后续使用产品确定的每天出勤的安保人员的数量 Integer total = staffInfoMapper.selectCount(wrapper); - //当日离岗事件个数 - QueryWrapper wrapper1 = new QueryWrapper<>(); - wrapper1.eq("hik_event_type", SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); - wrapper1.apply("date_format(now(),'%Y-%m-%d') = date_format(happen_time,'%Y-%m-%d')"); - Integer leave = caseInfoMapper.selectCount(wrapper1); + //当日离岗事件按设备去重后的个数 + // TODO: 2022/9/2 目前相当于24小时内的计算,之后看需要可改成自定义小时数计算离岗率,即离岗+6小时内仅一次离岗则恢复为100%,多次则累加离岗次数计算离岗率 + Integer leave = caseInfoMapper.selectDemobilizedCount(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); NumberFormat numberFormat = NumberFormat.getInstance(); // 设置精确到小数点后2位 numberFormat.setMaximumFractionDigits(2); @@ -179,7 +195,6 @@ @ResponseBody public Object visitorApplyDetail() { List reasonGroup = applyMapper.selectByVisitReason(); - HashMap resultMap = new HashMap<>(); NumberFormat numberFormat = NumberFormat.getInstance(); // 设置精确到小数点后2位 numberFormat.setMaximumFractionDigits(2); @@ -187,12 +202,17 @@ if(0 == sum){ return ResponseData.success(); } + List resultList = new ArrayList<>(); reasonGroup.forEach(group -> { String reasonName = dictService.getDictNameByCode(SecurityEventDict.VISIT_REASON, group.getVisitReason()); String result = numberFormat.format((float) group.getQuantity() / (float) sum * 100); - resultMap.put(reasonName, result+"%"); + ApplyReasonGroupDTO applyReasonGroupDTO = new ApplyReasonGroupDTO(); + applyReasonGroupDTO.setQuantity(group.getQuantity()); + applyReasonGroupDTO.setVisitReason(reasonName); + applyReasonGroupDTO.setRatio(result+"%"); + resultList.add(applyReasonGroupDTO); }); - return ResponseData.success(resultMap); + return ResponseData.success(resultList); } /** @@ -247,6 +267,32 @@ } /** + * 机动力量实时在岗率,在岗人数除以总应在岗人数,用离岗+6小时内恢复为100%,6小时外再计算 + */ + @GetMapping("/staff/beOnDutyRatio") + @ResponseBody + public Object beOnDutyRatio() { + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("staff_type", 2); + // TODO: 2022/9/2 后续使用产品确定的每天出勤的安保人员的数量 + Integer total = staffInfoMapper.selectCount(wrapper); + if(0 == total){ + return ResponseData.success(null); + } + //当日离岗事件按设备去重后的个数 + // TODO: 2022/9/2 目前相当于24小时内的计算,之后看需要可改成自定义小时数计算离岗率,即离岗+6小时内仅一次离岗则恢复为100%,多次则累加离岗次数计算离岗率 + List onDutyRatioDTOS = caseInfoMapper.selectDemobilizedCountByHour(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); + onDutyRatioDTOS.forEach(dto -> { + NumberFormat numberFormat = NumberFormat.getInstance(); + // 设置精确到小数点后2位 + numberFormat.setMaximumFractionDigits(2); + String result = numberFormat.format(100 - Float.valueOf(dto.getQuantity()) / (float) total * 100); + dto.setRatio(result+"%"); + }); + return ResponseData.success(onDutyRatioDTOS); + } + + /** * 闸机速通门统计-设备状态分组计算数量,devType传闸机字典key * 视频频监控摄像机统计-设备状态分组计算数量,devType传摄像头字典key */ @@ -262,12 +308,17 @@ if(sum <= 0){ return ResponseData.error("无该类设备信息"); } + List resultList = new ArrayList<>(); gateStatusGroup.forEach(group -> { String devStatus = dictService.getDictNameByCode(SecurityEventDict.DEVICE_STATUS, group.getStatus()); String result = numberFormat.format((float) group.getQuantity() / (float) sum * 100); - resultMap.put(devStatus, result+"%"); + GateStatusGroupResponse gateStatusGroupResponse = new GateStatusGroupResponse(); + gateStatusGroupResponse.setStatus(devStatus); + gateStatusGroupResponse.setRatio(result+"%"); + resultList.add(gateStatusGroupResponse); }); - resultMap.put("总", sum); + resultMap.put("total", sum); + resultMap.put("list", resultList); return ResponseData.success(resultMap); } @@ -282,17 +333,38 @@ String position = securityScoreDTO.getPosition(); List caseInfos = caseInfoMapper.selectByPosition(position); //查询各危险级别权重、各类别权重,放入map,避免循环中多次查数据库 - + HashMap hazardScoreMap = new HashMap<>(); + List caseHazardLevelList = hazardLevelMapper.getCaseHazardLevelList(null); + caseHazardLevelList.forEach(hazardLevel -> { + hazardScoreMap.put(hazardLevel.getCode(), hazardLevel.getWeight()); + }); + HashMap categoryScoreMap = new HashMap<>(); + List categoryLevelList = categoryLevelMapper.getCaseCategoryLevelList(null); + categoryLevelList.forEach(categoryLevel -> { + categoryScoreMap.put(categoryLevel.getCode(), categoryLevel.getWeight()); + }); + //事件按楼层分组,计算 List securityScoreDTOs = new ArrayList<>(); caseInfos.forEach(caseInfo -> { SecurityScoreDTO securityScoreDTO1 = new SecurityScoreDTO(); + securityScoreDTO1.setPosition(caseInfo.getPosition()); securityScoreDTO1.setArea(caseInfo.getArea()); - // TODO: 2022/8/4 楼层评分计算根据产品定义调整 -// caseInfo.get -// securityScoreDTO1.setScore(); + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); + Double score = 100 - Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + securityScoreDTO1.setScore(score); + securityScoreDTOs.add(securityScoreDTO1); }); - - return null; + 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); + }); + return ResponseData.success(securityScoreDTOs); } /** @@ -303,9 +375,13 @@ public Object SecurityFrequency(@RequestBody SecurityFrequencyDTO securityFrequencyDTO) { String year = securityFrequencyDTO.getYear(); String month = securityFrequencyDTO.getMonth(); - Integer quantity = caseInfoMapper.selectCountByMonth(year, month); - securityFrequencyDTO.setQuantity(quantity); - return ResponseData.success(securityFrequencyDTO); + if(!StringUtils.isEmpty(year) && StringUtils.isEmpty(month)){ + Integer quantity = caseInfoMapper.selectCountByMonth(year, month); + securityFrequencyDTO.setQuantity(quantity); + return ResponseData.success(securityFrequencyDTO); + } + List list = caseInfoMapper.selectPreMonthCount(); + return ResponseData.success(list); } } 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 ae4d770..f4f075c 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 @@ -1,20 +1,25 @@ package com.casic.missiles.modular.controller.cockpit; +import cn.hutool.core.date.DateUnit; import cn.hutool.core.date.DateUtil; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.casic.missiles.model.response.ResponseData; -import com.casic.missiles.modular.dao.AttendanceInfoMapper; -import com.casic.missiles.modular.dao.CaseInfoMapper; -import com.casic.missiles.modular.dao.HazardLevelMapper; -import com.casic.missiles.modular.dao.StaffInfoMapper; +import com.casic.missiles.modular.dao.*; +import com.casic.missiles.modular.dto.DeviceRepairLogDTO; +import com.casic.missiles.modular.dto.DeviceRepairRequest; import com.casic.missiles.modular.dto.statistics.*; +import com.casic.missiles.modular.enums.SecurityEventType; +import com.casic.missiles.modular.model.CaseCategoryLevel; import com.casic.missiles.modular.model.CaseHazardLevel; +import com.casic.missiles.modular.model.CaseInfo; import com.casic.missiles.modular.model.StaffInfo; +import com.casic.missiles.modular.service.DeviceInfoService; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.util.CollectionUtils; import org.springframework.web.bind.annotation.*; +import java.math.BigDecimal; import java.text.NumberFormat; import java.util.*; import java.util.stream.Collectors; @@ -40,6 +45,12 @@ @Autowired private HazardLevelMapper hazardLevelMapper; + @Autowired + private CategoryLevelMapper categoryLevelMapper; + + @Autowired + private DeviceInfoService deviceInfoService; + /** * 安防事件时域频次统计,每月的每天安防事件个数(原方案) * 月维度:展示每个月的每天的数据 @@ -89,15 +100,17 @@ List monthList = caseInfoMapper.selectPreMonthCountByYear(year); Map> collect = monthList.stream().collect(Collectors.groupingBy(PreMonthOrWeekCaseDTO::getHazardLevelCode)); HashMap strAvgMap = new HashMap<>(); + List resultList = new ArrayList<>(); for (String key : collect.keySet()) { List preMonthOrWeekCaseDTOS = collect.get(key); int sum = preMonthOrWeekCaseDTOS.stream().mapToInt(PreMonthOrWeekCaseDTO::getQuantity).sum(); //若年份是本年,则使用个安防级别数量/当前月份数 //若不是本年,除数为12 MonthAndWeekDTO monthAndWeekDTO = new MonthAndWeekDTO(); + String hazardName = hazardLevelMapper.selectHazardNameByCode(key); + monthAndWeekDTO.setLevelName(hazardName); if(year.equals(String.valueOf(DateUtil.thisYear()))){ monthAndWeekDTO.setMonthQuantity(sum / DateUtil.thisMonth()); -// monthAndWeekDTO.setLevelName(); strAvgMap.put(key, monthAndWeekDTO); }else{ monthAndWeekDTO.setMonthQuantity(sum / 12); @@ -113,27 +126,37 @@ if(year.equals(String.valueOf(DateUtil.thisYear()))){ if(!Objects.isNull(strAvgMap.get(key))){ MonthAndWeekDTO monthAndWeekDTO = strAvgMap.get(key); + String hazardName = hazardLevelMapper.selectHazardNameByCode(key); + monthAndWeekDTO.setLevelName(hazardName); monthAndWeekDTO.setWeekQuantity(sum / DateUtil.thisWeekOfYear()); strAvgMap.put(key, monthAndWeekDTO); }else{ MonthAndWeekDTO monthAndWeekDTO = new MonthAndWeekDTO(); + String hazardName = hazardLevelMapper.selectHazardNameByCode(key); + monthAndWeekDTO.setLevelName(hazardName); monthAndWeekDTO.setWeekQuantity(sum / DateUtil.thisWeekOfYear()); strAvgMap.put(key, monthAndWeekDTO); } }else{ if(!Objects.isNull(strAvgMap.get(key))){ MonthAndWeekDTO monthAndWeekDTO = strAvgMap.get(key); + String hazardName = hazardLevelMapper.selectHazardNameByCode(key); + monthAndWeekDTO.setLevelName(hazardName); monthAndWeekDTO.setWeekQuantity(sum / 52); strAvgMap.put(key, monthAndWeekDTO); }else{ MonthAndWeekDTO monthAndWeekDTO = new MonthAndWeekDTO(); + String hazardName = hazardLevelMapper.selectHazardNameByCode(key); + monthAndWeekDTO.setLevelName(hazardName); monthAndWeekDTO.setWeekQuantity(sum / 52); strAvgMap.put(key, monthAndWeekDTO); } } } - avgMonthAndWeekGroupDTO.setMap(strAvgMap); - return ResponseData.success(avgMonthAndWeekGroupDTO); + strAvgMap.keySet().forEach(key -> { + resultList.add(strAvgMap.get(key)); + }); + return ResponseData.success(resultList); } /** @@ -181,12 +204,178 @@ } /** - * 员工考勤人数变化,功能待定 + * 员工考勤人数变化,统计当天(横坐标为时)及近7天(横坐标为天)的考勤人数变化,只要发生一次考勤识别,次数的基数就正常增加(没有上班下班区分) */ + @PostMapping("/staff/attendanceNumber/{dimension}") + @ResponseBody + public Object attendanceNumber(@PathVariable("dimension") String dimension) { + List attendanceNumberDTOs = null; + List> resultList = new ArrayList<>(); + if("week".equals(dimension)){ + //近7天数据按天分组统计 + attendanceNumberDTOs = attendanceInfoMapper.getCountForWeek(); + }else if("day".equals(dimension)) { + //今天数据按小时分组统计 + attendanceNumberDTOs = attendanceInfoMapper.getCountForDay(); + } + if(CollectionUtils.isEmpty(attendanceNumberDTOs)){ + return ResponseData.error("该查询条件下,无员工出勤数据!"); + } + Map> collect = attendanceNumberDTOs.stream().collect(Collectors.groupingBy(AttendanceNumberDTO::getDate)); + collect.keySet().forEach(key -> { + List attendanceNumberDTOS = collect.get(key); + AttendanceNumberDTO attendanceNumberDTO = attendanceNumberDTOS.get(0); + AttendanceNumberDTO attendanceNumberDTO2 = attendanceNumberDTOS.get(1); + Map resultMap = new HashMap<>(); + resultMap.put(attendanceNumberDTO.getStaffType(), attendanceNumberDTO.getQuantity()); + resultMap.put(attendanceNumberDTO2.getStaffType(), attendanceNumberDTO2.getQuantity()); + resultMap.put("staticTime", attendanceNumberDTO.getDate()); + resultList.add(resultMap); + }); + return ResponseData.success(resultList); + } /** - * 近30天/近一周安保人员到岗排行 + * 早晚高峰区域安防评估 */ + @PostMapping("/security/assessment/{dimension}") + @ResponseBody + public Object securityAssessment(@PathVariable("dimension") String dimension) { + //查询各危险级别权重、各类别权重,放入map,避免循环中多次查数据库 + HashMap hazardScoreMap = new HashMap<>(); + List caseHazardLevelList = hazardLevelMapper.getCaseHazardLevelList(null); + caseHazardLevelList.forEach(hazardLevel -> { + hazardScoreMap.put(hazardLevel.getCode(), hazardLevel.getWeight()); + }); + HashMap categoryScoreMap = new HashMap<>(); + List categoryLevelList = categoryLevelMapper.getCaseCategoryLevelList(null); + categoryLevelList.forEach(categoryLevel -> { + categoryScoreMap.put(categoryLevel.getCode(), categoryLevel.getWeight()); + }); + HashMap hashMap = new HashMap<>(); + if("week".equals(dimension)){ + //近7天早晚高峰数据 + List caseInfos = caseInfoMapper.selectListBySevenDay(); + //按时间(天)进行分组 + caseInfos.forEach(caseInfo -> { + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); + Double score = Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + String[] array = caseInfo.getHappenTime().split(" "); + String dayTime = array[0]; + BigDecimal preScore; + if(hashMap.containsKey(dayTime)){ + Double aDouble = hashMap.get(dayTime); + preScore = new BigDecimal(aDouble.toString()); + + }else{ + preScore = new BigDecimal("100.0"); + } + BigDecimal nowScore = new BigDecimal(score.toString()); + hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); + }); + return ResponseData.success(hashMap); + }else if("day".equals(dimension)) { + //今天数据按小时分组统计 + List caseInfos = caseInfoMapper.selectListByToday(); + caseInfos.forEach(caseInfo -> { + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); + Double score = Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + String[] array = caseInfo.getHappenTime().split(":"); + String dayTime = array[0]; + BigDecimal preScore; + if(hashMap.containsKey(dayTime)){ + Double aDouble = hashMap.get(dayTime); + preScore = new BigDecimal(aDouble.toString()); + + }else{ + preScore = new BigDecimal("100.0"); + } + BigDecimal nowScore = new BigDecimal(score.toString()); + hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); + }); + return ResponseData.success(hashMap); + } + return null; + } + + /** + * 重点区域安防事态评估,统计重点区域6:00-23:00按小时分组数据 + */ + @GetMapping("/security/keyAreaStatistic") + @ResponseBody + public Object keyAreaStatistic() { + //查询各危险级别权重、各类别权重,放入map,避免循环中多次查数据库 + HashMap hazardScoreMap = new HashMap<>(); + List caseHazardLevelList = hazardLevelMapper.getCaseHazardLevelList(null); + caseHazardLevelList.forEach(hazardLevel -> { + hazardScoreMap.put(hazardLevel.getCode(), hazardLevel.getWeight()); + }); + HashMap categoryScoreMap = new HashMap<>(); + List categoryLevelList = categoryLevelMapper.getCaseCategoryLevelList(null); + categoryLevelList.forEach(categoryLevel -> { + categoryScoreMap.put(categoryLevel.getCode(), categoryLevel.getWeight()); + }); + HashMap hashMap = new HashMap<>(); + //今天数据按小时分组统计 + List caseInfos = caseInfoMapper.selectListByToday2(); + caseInfos.forEach(caseInfo -> { + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); + Double score = Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + String[] array = caseInfo.getHappenTime().split(":"); + String dayTime = array[0]; + BigDecimal preScore; + if(hashMap.containsKey(dayTime)){ + Double aDouble = hashMap.get(dayTime); + preScore = new BigDecimal(aDouble.toString()); + + }else{ + preScore = new BigDecimal("100.0"); + } + BigDecimal nowScore = new BigDecimal(score.toString()); + hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); + }); + return ResponseData.success(hashMap); + } + + /** + * 安防机动支援力量调配响应评估,根据事件已解决状态及已解决时间-发送时间,按时间(小时)分组统计 + */ + @GetMapping("/security/responseAssess") + @ResponseBody + public Object responseAssess() { + //查询各危险级别权重、各类别权重,放入map,避免循环中多次查数据库 + HashMap hazardScoreMap = new HashMap<>(); + List caseHazardLevelList = hazardLevelMapper.getCaseHazardLevelList(null); + caseHazardLevelList.forEach(hazardLevel -> { + hazardScoreMap.put(hazardLevel.getCode(), hazardLevel.getWeight()); + }); + HashMap hashMap = new HashMap<>(); + //今天数据按小时分组统计 + List caseInfos = caseInfoMapper.selectListByToday3(); + caseInfos.forEach(caseInfo -> { + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + //扣分=事件级别权重*未解决小时数 + Date updateTime = DateUtil.parse(caseInfo.getUpdateTime()); + Date happenTime = DateUtil.parse(caseInfo.getHappenTime()); + long between = DateUtil.between(updateTime, happenTime, DateUnit.HOUR); + Double score = Double.valueOf(hazardWeight)*between; + String[] array = caseInfo.getHappenTime().split(":"); + String dayTime = array[0]; + BigDecimal preScore; + if(hashMap.containsKey(dayTime)){ + Double aDouble = hashMap.get(dayTime); + preScore = new BigDecimal(aDouble.toString()); + }else{ + preScore = new BigDecimal("100.0"); + } + BigDecimal nowScore = new BigDecimal(score.toString()); + hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); + }); + return ResponseData.success(hashMap); + } /** * 重点区域威胁事件类型统计,优先级2,统计近7天和近30天 @@ -224,7 +413,34 @@ } /** - * 设备状态计算系数和评判,优先级3,需确认设备恢复时间是否可以获取 + * 近30天/近一周安保人员到岗排行 */ + + /** + * 安保等级评估,发生离岗事件减1分 + */ + @GetMapping("/security/levelAssess") + @ResponseBody + public Object securityLevelAssess() { + //今天数据按小时分组统计 + List resultList = caseInfoMapper.selectListByType(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); + resultList.forEach(result -> { + BigDecimal deScore = new BigDecimal(result.getQuantity()); + BigDecimal preScore = new BigDecimal("100.0"); + result.setScore(preScore.subtract(deScore).doubleValue()); + }); + return ResponseData.success(resultList); + } + + /** + * 设备状态计算系数和评判,即设备维修管理查询(不分页) + */ + @PostMapping("/device/repairList") + @ResponseBody + public Object repairList(@RequestBody DeviceRepairRequest deviceRepairRequest) { + List deviceRepairLogDTOS = deviceInfoService.deviceRepairListPage(deviceRepairRequest); + return ResponseData.success(deviceRepairLogDTOS); + } + } 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 fbf8ab6..c71a15a 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 @@ -1,13 +1,12 @@ package com.casic.missiles.modular.controller.hik; +import cn.hutool.core.date.DateTime; +import cn.hutool.core.date.DateUtil; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.casic.missiles.model.response.ResponseData; import com.casic.missiles.modular.dao.HikFaceGroupInfoMapper; -import com.casic.missiles.modular.dto.hik.EventSubscribeRequest; -import com.casic.missiles.modular.dto.hik.FaceGroupAdditionRequest; -import com.casic.missiles.modular.dto.hik.HikRecvEvent; -import com.casic.missiles.modular.dto.hik.OrgBatchAdd; +import com.casic.missiles.modular.dto.hik.*; import com.casic.missiles.modular.enums.HikUri; import com.casic.missiles.modular.enums.SecurityEventType; import com.casic.missiles.modular.model.CaseInfo; @@ -18,16 +17,20 @@ import com.casic.missiles.modular.util.CaseInfoFactoryUtil; import com.casic.missiles.modular.util.HikUtil; import com.casic.missiles.modular.util.ThreadPoolUtil; +import com.casic.missiles.modular.util.WebSocket; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; -import org.springframework.web.bind.annotation.*; +import org.springframework.util.CollectionUtils; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.RestController; -import java.net.InetAddress; -import java.net.UnknownHostException; import java.util.ArrayList; +import java.util.Iterator; import java.util.List; import java.util.Objects; @@ -38,7 +41,6 @@ */ @Slf4j @RestController -@RequestMapping("/hik") public class HikController { @Autowired @@ -53,28 +55,37 @@ @Autowired private HikService hikService; + @Autowired + private HikFaceGroupInfoMapper hikFaceGroupInfoMapper; + + @Autowired + private WebSocket webSocket; + @Value("${server.port}") private int serverPort; - @Autowired - private HikFaceGroupInfoMapper hikFaceGroupInfoMapper; /** * 海康事件订阅 */ - @PostMapping("/event/subscribe") + @PostMapping("/hik/event/subscribe") @ResponseBody - public Object eventSubscribe() throws UnknownHostException { + public Object eventSubscribe() { EventSubscribeRequest eventSubscribeRequest = new EventSubscribeRequest(); ArrayList list = new ArrayList<>(); list.add(SecurityEventType.DEVICE_OFFLINE); + list.add(SecurityEventType.DEVICE_ONLINE); list.add(SecurityEventType.KEY_PERSONNEL_IDENTIFY_EVENT); list.add(SecurityEventType.MONITORING_POINT_OFFLINE); + list.add(SecurityEventType.MONITORING_POINT_ONLINE); list.add(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); list.add(SecurityEventType.PERSONNEL_GATHER_EVENT); - InetAddress localHost = InetAddress.getLocalHost(); + list.add(SecurityEventType.VISITOR_REGISTER); + list.add(SecurityEventType.VISITOR_CHECKOUT); + list.add(SecurityEventType.HIGH_ALTITUDE_PARABOLIC); +// InetAddress localHost = InetAddress.getLocalHost(); eventSubscribeRequest.setEventTypes(list); - eventSubscribeRequest.setEventDest("https://" + localHost + ":" + serverPort + "/eventRcv"); + eventSubscribeRequest.setEventDest("http://" + "192.168.10.6" + ":" + serverPort + "/eventRcv"); //订阅类型,0-订阅原始事件,1-联动事件,2-原始事件和联动事件,不填使用默认值0 eventSubscribeRequest.setSubType(0); /** @@ -92,19 +103,25 @@ } /** + * 查询事件订阅信息 + */ + @PostMapping("/hik/event/query") + @ResponseBody + public Object eventQuery() { + String result = HikUtil.hikApi(HikUri.EVENT_INFO, ""); + return result; + } + + /** * 海康事件接收 */ @PostMapping("/eventRcv") @ResponseBody public Object eventRcv(@RequestBody HikRecvEvent hikRecvEvent) { //1、接收所需事件类型 - Long eventType = hikRecvEvent.getEventType(); + Number eventType = hikRecvEvent.getEventType(); log.info("接收到安防事件类型为:{}", eventType); CaseInfo caseInfo = caseInfoFactoryUtil.getCaseInfo(eventType); - //接收到不关心事件直接返回 - if(Objects.isNull(caseInfo)){ - return ResponseData.success(); - } //2、不同事件不同处理,caseInfoFactoryUtil已设置好事件基础定义信息 // 再为事件添加状态、设备编码、设备名称、位置、区域、时间 // 异步处理事件 @@ -114,19 +131,23 @@ caseHandle(hikRecvEvent, eventType, caseInfo); } })); +// caseHandle(hikRecvEvent, eventType, caseInfo); - return null; + return ResponseData.success(); } - private void caseHandle(HikRecvEvent hikRecvEvent, Long eventType, CaseInfo caseInfo) { + private void caseHandle(HikRecvEvent hikRecvEvent, Number eventType, CaseInfo caseInfo) { JSONArray eventArray = hikRecvEvent.getEventArray(); List caseInfos = new ArrayList<>(); - while (eventArray.stream().iterator().hasNext()) { + Iterator iterator = eventArray.iterator(); + while (iterator.hasNext()) { CaseInfo caseInfo1 = new CaseInfo(); - BeanUtils.copyProperties(caseInfo, caseInfo1); - JSONObject event = (JSONObject) eventArray.stream().iterator().next(); + if(!Objects.isNull(caseInfo)){ + BeanUtils.copyProperties(caseInfo, caseInfo1); + } + JSONObject event = (JSONObject) iterator.next(); //5种事件进行不同处理 - if(SecurityEventType.KEY_PERSONNEL_IDENTIFY_EVENT == eventType){ + if (SecurityEventType.KEY_PERSONNEL_IDENTIFY_EVENT.equals(eventType)) { //判断所属人脸分组 JSONObject data = (JSONObject) event.get("data"); JSONObject faceRecognitionResult = (JSONObject) data.get("faceRecognitionResult"); @@ -142,52 +163,101 @@ if (faceGroupCode.equals(blackListGroup.getFaceGroupCode())) { //黑名单分组处理 caseInfo1 = hikService.blackListHandle(event, caseInfo1); - }else if(faceGroupCode.equals(propertyPersonnelGroup.getFaceGroupCode())){ + } else if (faceGroupCode.equals(propertyPersonnelGroup.getFaceGroupCode())) { //考勤分组处理-物业人员,添加到考勤表 hikService.propertyAttendanceHandle(event); - }else if(faceGroupCode.equals(securityPersonnelGroup.getFaceGroupCode())){ + } else if (faceGroupCode.equals(securityPersonnelGroup.getFaceGroupCode())) { //考勤分组处理-安保人员,添加到考勤表 hikService.securityPersonnelHandle(event); - }else { + } else { return; } - }else if(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT == eventType){ + } else if (SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT.equals(eventType)) { //离岗事件处理 caseInfo1 = hikService.demobilizedHandle(event, caseInfo1); - }else if(SecurityEventType.PERSONNEL_GATHER_EVENT == eventType){ + } else if (SecurityEventType.PERSONNEL_GATHER_EVENT.equals(eventType)) { //人员聚集事件处理 caseInfo1 = hikService.personGatherHandle(event, caseInfo1); - }else if(SecurityEventType.MONITORING_POINT_OFFLINE == eventType){ + } else if (SecurityEventType.MONITORING_POINT_OFFLINE.equals(eventType)) { //监控点离线事件处理 caseInfo1 = hikService.monitorPointOfflineHandle(event, caseInfo1); - }else if(SecurityEventType.DEVICE_OFFLINE == eventType){ + } else if (SecurityEventType.MONITORING_POINT_ONLINE.equals(eventType)) { + //监控点上线事件处理 + hikService.monitorPointOnlineHandle(event); + } else if (SecurityEventType.DEVICE_OFFLINE.equals(eventType)) { //装置离线事件处理 caseInfo1 = hikService.deviceOfflineHandle(event, caseInfo1); - }else if(SecurityEventType.VISITOR_REGISTER == eventType){ + } else if (SecurityEventType.DEVICE_ONLINE.equals(eventType)) { + //装置上线处理 + hikService.deviceOnlineHandle(event); + } else if (SecurityEventType.VISITOR_REGISTER.equals(eventType)) { //记录访客登记记录,添加到访客记录表 hikService.visitorRegisterHandler(event); - }else if(SecurityEventType.VISITOR_CHECKOUT == eventType){ + } else if (SecurityEventType.VISITOR_CHECKOUT.equals(eventType)) { //记录访客签离记录 hikService.visitorCheckOutHandler(event); } - if(!Objects.isNull(caseInfo1) && !StringUtils.isEmpty(caseInfo1.getHappenTime())){ + if (!Objects.isNull(caseInfo1) && !StringUtils.isEmpty(caseInfo1.getHappenTime())) { caseInfos.add(caseInfo1); } } //3、安防事件入库 - if(!caseInfoService.insertCaseInfoBatch(caseInfos)){ - log.error("安防事件批量入库异常"); + if (!CollectionUtils.isEmpty(caseInfos) && !caseInfoService.insertCaseInfoBatch(caseInfos)) { + log.error("安防事件批量入库异常!"); } // TODO: 2022/8/15 webSocket推送 + if (CollectionUtils.isEmpty(caseInfos)) { + log.info("webSocket事件推送"); + webSocket.sendAllMessage(JSONObject.toJSONString(caseInfos)); + } return; } /** + * 以图搜图,前端用于轨迹追踪 + */ + @PostMapping("/hik/search/picture") + @ResponseBody + public Object searchPictures(@RequestBody SearchPicturesRequest searchPicturesRequest) { + DateTime startDateTime = DateUtil.parse(searchPicturesRequest.getStartTime()); + DateTime endDateTime = DateUtil.parse(searchPicturesRequest.getEndTime()); + String startTime = DateUtil.format(startDateTime, "yyyy-MM-dd'T'HH:mm:ss.SSSXXX"); + String endTime = DateUtil.format(endDateTime, "yyyy-MM-dd'T'HH:mm:ss.SSSXXX"); + searchPicturesRequest.setStartTime(startTime); + searchPicturesRequest.setEndTime(endTime); + String body = JSONObject.toJSONString(searchPicturesRequest); + String resultStr = HikUtil.hikApi(HikUri.SEARCH_PICTURES, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (!"0".equals(resultJson.get("code"))) { + log.error("请求海康,以图搜图失败,海康response:{}", resultStr); + return ResponseData.error("以图搜图失败"); + } + return ResponseData.success(resultJson); + } + + + /** + * 海康事件取消订阅 + */ + @PostMapping("/hik/event/cancel") + @ResponseBody + public Object eventCancelSubscribe(@RequestBody CancelSubscribeRequest cancelSubscribeRequest) { + String body = JSONObject.toJSONString(cancelSubscribeRequest); + String resultStr = HikUtil.hikApi(HikUri.EVENT_CANCEL, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (!"0".equals(resultJson.get("code"))) { + log.error("请求海康,取消订阅失败,海康response:{}", resultStr); + return ResponseData.error("取消订阅失败"); + } + return ResponseData.success(resultJson); + } + + /** * 单个添加海康人脸分组 * api->hik单个添加人脸分组api->response->mysql */ - @PostMapping("/faceGroup/single/add") + @PostMapping("/hik/faceGroup/single/add") @ResponseBody public Object faceGroupAddition(@RequestBody FaceGroupAdditionRequest faceGroupAdditionRequest) { String body = JSONObject.toJSONString(faceGroupAdditionRequest); @@ -212,7 +282,7 @@ * 批量添加海康组织 * api->hik批量添加组织api->response */ - @PostMapping("/org/batch/add") + @PostMapping("/hik/org/batch/add") @ResponseBody public Object orgBatchAdd(@RequestBody List orgBatchAddRequest) { String body = JSONObject.toJSONString(orgBatchAddRequest); @@ -232,4 +302,62 @@ return ResponseData.error("批量添加组织失败"); } + /** + * 获取人员列表 + */ + @PostMapping("/hik/person/personList") + @ResponseBody + public Object personList() { + PersonListRequest request = new PersonListRequest(); + request.setPageNo(1); + request.setPageSize(100); + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi("/api/resource/v2/person/personList", body); + return resultStr; + } + + /** + * 获取组织列表 + */ + @PostMapping("/hik/org/orgList") + @ResponseBody + public Object orgList() { + PersonListRequest request = new PersonListRequest(); + request.setPageNo(1); + request.setPageSize(100); + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi("/api/resource/v1/org/orgList", body); + return resultStr; + } + + /** + * 查询访客权限下载记录 + */ + @PostMapping("/hik/auth/result") + @ResponseBody + public Object authResult() { + PersonListRequest request = new PersonListRequest(); + request.setPageNo(1); + request.setPageSize(100); + request.setOrderId("ba101db6246711edaea66f7939a13638"); + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi("/api/visitor/v1/auth/result", body); + return resultStr; + } + + /** + * 人脸图片获取 + */ + @PostMapping("/hik/face/picture") + @ResponseBody + public Object facePicture() { + FaceRequest request = new FaceRequest(); +// List list = new ArrayList<>(); +// list.add(""); + request.setCertificateNum("wanggong"); + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi("/api/frs/v1/face", body); + return resultStr; + } + } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/AssetInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/AssetInfoMapper.java index 4f64e83..c0684ee 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/AssetInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/AssetInfoMapper.java @@ -17,6 +17,6 @@ @Mapper public interface AssetInfoMapper extends BaseMapper { - List getAssetInfoListPage(@Param("page") Page page, AssetInfoRequest assetInfoRequest); + List getAssetInfoListPage(@Param("page") Page page, @Param("assetInfoRequest") AssetInfoRequest assetInfoRequest); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/AttendanceInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/AttendanceInfoMapper.java index f9e793e..ec87e46 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/AttendanceInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/AttendanceInfoMapper.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.statistics.AttendanceNumberDTO; import com.casic.missiles.modular.dto.statistics.AttendanceRatioDTO; import com.casic.missiles.modular.model.AttendanceInfo; import org.apache.ibatis.annotations.Mapper; @@ -17,7 +18,7 @@ */ @Mapper public interface AttendanceInfoMapper extends BaseMapper { - List getAttendanceInfoListPage(@Param("page") Page page, StaffInfoRequest attendanceInfoRequest); + List getAttendanceInfoListPage(@Param("page") Page page, @Param("attendanceInfoRequest") StaffInfoRequest attendanceInfoRequest); AttendanceInfo selectByCodeAndDate(@Param("staffCode") String staffCode); @@ -26,4 +27,8 @@ List getCountByTypeAndDateForMonth(@Param("staffType")String staffType); List getCountByTypeAndDateForYear(@Param("staffType")String staffType); + + List getCountForWeek(); + + List getCountForDay(); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java index ce94b8f..6137a7d 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java @@ -17,5 +17,5 @@ @Mapper public interface BlackInfoMapper extends BaseMapper { - List getBlackInfoListPage(@Param("page") Page page, BlackInfoRequest blackInfoRequest); + List getBlackInfoListPage(@Param("page") Page page, @Param("blackInfoRequest") BlackInfoRequest blackInfoRequest); } 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 efda6b3..50aaa6f 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 @@ -20,7 +20,7 @@ List getCaseInfoListPage(@Param("page") Page page, @Param("caseInfoRequest") CaseInfoRequest caseInfoRequest); - int updateStatusById(CaseInfoRequest caseInfoRequest); + int updateStatusById(@Param("caseInfoRequest") CaseInfoRequest caseInfoRequest); List selectByLevelAndMonth(@Param("year") String year); @@ -47,4 +47,20 @@ List selectPreWeekCountByThirtyDay(); List selectPreDayCountBySevenDay(); + + Integer selectDemobilizedCount(@Param("eventType") Number personnelDemobilizedEvent); + + List selectPreMonthCount(); + + List selectListBySevenDay(); + + List selectListByToday(); + + List selectListByToday2(); + + List selectListByToday3(); + + List selectListByType(@Param("eventType") Number eventType); + + List selectDemobilizedCountByHour(@Param("eventType") Number eventType); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/CategoryLevelMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/CategoryLevelMapper.java index 52fc714..afe1650 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/CategoryLevelMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/CategoryLevelMapper.java @@ -17,9 +17,9 @@ @Mapper public interface CategoryLevelMapper extends BaseMapper { - List getCaseCategoryLevelListPage(@Param("page") Page page, CategoryLevelRequest categoryLevelRequest); + List getCaseCategoryLevelListPage(@Param("page") Page page, @Param("categoryLevelRequest") CategoryLevelRequest categoryLevelRequest); - List getCaseCategoryLevelList(CategoryLevelRequest categoryLevelRequest); + List getCaseCategoryLevelList(@Param("categoryLevelRequest") CategoryLevelRequest categoryLevelRequest); CaseCategoryLevel getCaseCategoryLevel(@Param("categoryLevelCode") String categoryLevelCode); 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 66353b1..2555a09 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 @@ -19,7 +19,7 @@ @Mapper public interface DeviceInfoMapper extends BaseMapper { - List getDeviceInfoListPage(@Param("page") Page page, DeviceInfoRequest deviceInfoRequest); + List getDeviceInfoListPage(@Param("page") Page page, @Param("deviceInfoRequest") DeviceInfoRequest deviceInfoRequest); List getDeviceInfoList(@Param("deviceInfoRequest") DeviceInfoRequest deviceInfoRequest); @@ -27,6 +27,8 @@ DeviceInfo getByIndexCode(@Param("srcIndex") String srcIndex); + DeviceInfo getByIp(@Param("ip") String ip); + List selectIndexCodesByCodes(@Param("deviceCodes") List deviceCodes); List selectByType(@Param("devType") String devType); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java index 41dd0af..5bfaf63 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java @@ -5,6 +5,7 @@ import com.casic.missiles.modular.dto.DeviceRepairRequest; import com.casic.missiles.modular.model.DeviceRepairLog; import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; import java.util.List; @@ -16,7 +17,7 @@ @Mapper public interface DeviceRepairLogMapper extends BaseMapper { - List getDeviceRepairListPage(Page page, DeviceRepairRequest deviceRepairRequest); + List getDeviceRepairListPage(@Param("page") Page page, @Param("deviceRepairRequest")DeviceRepairRequest deviceRepairRequest); - List getDeviceRepairList(DeviceRepairRequest deviceRepairRequest); + List getDeviceRepairList(@Param("deviceRepairRequest") DeviceRepairRequest deviceRepairRequest); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java index 9035c47..4823ac1 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java @@ -18,7 +18,7 @@ @Mapper public interface FireEquipInfoMapper extends BaseMapper { - List getFireEquipInfoListPage(@Param("page") Page page, FireEquipRequest fireEquipRequest); + List getFireEquipInfoListPage(@Param("page") Page page, @Param("fireEquipRequest") FireEquipRequest fireEquipRequest); FireEquipInfo getFireEquipInfo(@Param("equipCode") String equipCode); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/GateGroupMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/GateGroupMapper.java index d8c330d..977a427 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/GateGroupMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/GateGroupMapper.java @@ -17,7 +17,7 @@ */ @Mapper public interface GateGroupMapper extends BaseMapper { - List getGateGroupListPage(@Param("page") Page page, GateGroupRequest gateGroupRequest); + List getGateGroupListPage(@Param("page") Page page, @Param("gateGroupRequest") GateGroupRequest gateGroupRequest); GateGroup getGateGroupByName(@Param("groupName") String groupName); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/HazardLevelMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/HazardLevelMapper.java index 8957780..dcf47bb 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/HazardLevelMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/HazardLevelMapper.java @@ -17,11 +17,13 @@ @Mapper public interface HazardLevelMapper extends BaseMapper { - List getCaseHazardLevelListPage(@Param("page") Page page, HazardLevelRequest hazardLevelRequest); + List getCaseHazardLevelListPage(@Param("page") Page page, @Param("hazardLevelRequest") HazardLevelRequest hazardLevelRequest); - List getCaseHazardLevelList(HazardLevelRequest hazardLevelRequest); + List getCaseHazardLevelList(@Param("hazardLevelRequest") HazardLevelRequest hazardLevelRequest); CaseHazardLevel getCaseHazardLevel(@Param("hazardLevelCode") String hazardLevelCode); List selectHazardName(); + + String selectHazardNameByCode(@Param("hazardLevelCode") String hazardLevelCode); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/HikCaseDefineMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/HikCaseDefineMapper.java index 0dc47d1..f162fef 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/HikCaseDefineMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/HikCaseDefineMapper.java @@ -12,5 +12,5 @@ */ @Mapper public interface HikCaseDefineMapper extends BaseMapper { - HikCaseDefine getHikCaseDefine(@Param("caseTypeCode") Long caseTypeCode); + HikCaseDefine getHikCaseDefine(@Param("caseTypeCode") Number caseTypeCode); } 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 f8a674c..fe5afc2 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 @@ -17,11 +17,13 @@ @Mapper public interface StaffInfoMapper extends BaseMapper { - List getStaffInfoListPage(@Param("page") Page page, StaffInfoRequest staffInfoRequest); + List getStaffInfoListPage(@Param("page") Page page, @Param("staffInfoRequest") StaffInfoRequest staffInfoRequest); StaffInfo selectByCode(@Param("staffCode") String staffCode); - List getStaffInfoList(StaffInfoRequest staffInfoRequest); + List getStaffInfoList(@Param("staffInfoRequest") StaffInfoRequest staffInfoRequest); - List selectBatchCodes(List list); + List selectBatchCodes(@Param("list") List list); + + int updateByCodeForCard(@Param("staffCode") String staffCode, @Param("cardNo") String cardNo); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitInfoMapper.java index b1217c5..6c52542 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitInfoMapper.java @@ -16,7 +16,7 @@ */ @Mapper public interface VisitInfoMapper extends BaseMapper { - List getVisitInfoListPage(@Param("page") Page page, VisitorRequest visitorRequest); + List getVisitInfoListPage(@Param("page") Page page, @Param("visitorRequest") VisitorRequest visitorRequest); VisitInfo selectByOrderId(@Param("orderId") String orderId); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitorApplyMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitorApplyMapper.java index c09f3c0..6ea55bd 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitorApplyMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitorApplyMapper.java @@ -18,7 +18,7 @@ @Mapper public interface VisitorApplyMapper extends BaseMapper { - List getVisitorApplyListPage(@Param("page") Page page, VisitorApplyRequest visitorApplyRequest); + List getVisitorApplyListPage(@Param("page") Page page, @Param("visitorApplyRequest") VisitorApplyRequest visitorApplyRequest); List selectByVisitReason(); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/AttendanceInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/AttendanceInfoMapper.xml index b2ece71..f8bdd6e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/AttendanceInfoMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/AttendanceInfoMapper.xml @@ -43,7 +43,8 @@ and staff_type = #{staffType} - and YEARWEEK(date_format(atte_date, '%Y-%m-%d'), 1) = YEARWEEK(now(),1); + AND DATE_SUB(CURDATE(), INTERVAL 7 DAY) <= DATE(atte_date) + GROUP BY DATE_FORMAT(atte_date, '%Y-%m-%d') @@ -69,4 +70,20 @@ GROUP BY DATE_FORMAT(atte_date, '%Y-%m') + + + \ No newline at end of file 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 2b6953f..06ec0a8 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 @@ -28,7 +28,9 @@ @@ -87,7 +89,8 @@ SELECT hazard_level_code as levelCode, count(id) as quantity FROM bus_case_info WHERE hazard_level_code is not null - AND DATE_SUB(CURDATE(), INTERVAL 7 DAY) <= date(happen_time); + AND is_key_area = 1 + AND DATE_SUB(CURDATE(), INTERVAL 7 DAY) <= date(happen_time) GROUP BY hazard_level_code @@ -95,7 +98,8 @@ SELECT hazard_level_code as levelCode, count(id) as quantity FROM bus_case_info WHERE hazard_level_code is not null - AND DATE_SUB(CURDATE(), INTERVAL 30 DAY) <= date(happen_time); + AND is_key_area = 1 + AND DATE_SUB(CURDATE(), INTERVAL 30 DAY) <= date(happen_time) GROUP BY hazard_level_code @@ -122,4 +126,71 @@ AND hazard_level_code is not null GROUP BY DATE_FORMAT(happen_time,'%Y-%m-%d') + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/CategoryLevelMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/CategoryLevelMapper.xml index 4670b1f..1d25cbd 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/CategoryLevelMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/CategoryLevelMapper.xml @@ -20,11 +20,11 @@ SELECT * FROM bus_case_category_level WHERE 1=1 - - and code = #{code} + + and code = #{categoryLevelRequest.code} - - and name = #{name} + + and name = #{categoryLevelRequest.name} ORDER by create_time DESC 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 9b66fd8..bfd84b7 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 @@ -98,4 +98,10 @@ #{item} + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceRepairLogMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceRepairLogMapper.xml index 078ed3c..cf1a481 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceRepairLogMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceRepairLogMapper.xml @@ -22,14 +22,14 @@ SELECT * FROM bus_device_repair_log WHERE 1=1 - - and device_code = #{devCode} + + and device_code = #{deviceRepairRequest.devCode} - - and device_name = #{devName} + + and device_name = #{deviceRepairRequest.devName} - - and DATE_FORMAT(create_time,"%y%m%d") = DATE_FORMAT(#{createTime},"%y%m%d") + + and DATE_FORMAT(create_time,"%y%m%d") = DATE_FORMAT(#{deviceRepairRequest.createTime},"%y%m%d") ORDER by create_time DESC diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/HazardLevelMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/HazardLevelMapper.xml index f16f2b9..458322b 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/HazardLevelMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/HazardLevelMapper.xml @@ -20,11 +20,11 @@ SELECT * FROM bus_case_hazard_level WHERE 1=1 - - and code = #{code} + + and code = #{hazardLevelRequest.code} - - and name = #{name} + + and name = #{hazardLevelRequest.name} ORDER by create_time DESC @@ -42,4 +42,10 @@ SELECT name FROM bus_case_hazard_level + + \ 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 557237e..b6a183a 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 @@ -50,4 +50,10 @@ + + + UPDATE bus_staff_info + SET card_no = #{cardNo} + WHERE staff_code = #{staffCode} + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitInfoMapper.xml index 84aa84f..230529a 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitInfoMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitInfoMapper.xml @@ -27,5 +27,6 @@ SELECT * FROM bus_visit_info WHERE order_id = #{orderId} and DATE_FORMAT(in_time,'%Y-%m-%d') = CURRENT_DATE + limit 1 \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/BlackPictureRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/BlackPictureRequest.java new file mode 100644 index 0000000..fc92701 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/BlackPictureRequest.java @@ -0,0 +1,14 @@ +package com.casic.missiles.modular.dto; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/29 19:26 + */ +@Data +public class BlackPictureRequest { + private String picUri; + private String serverIndexCode; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/CancelSubscribeRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/CancelSubscribeRequest.java new file mode 100644 index 0000000..e2d390a --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/CancelSubscribeRequest.java @@ -0,0 +1,15 @@ +package com.casic.missiles.modular.dto.hik; + +import lombok.Data; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/24 15:14 + */ +@Data +public class CancelSubscribeRequest { + private List eventTypes; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/CardInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/CardInfo.java new file mode 100644 index 0000000..341457d --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/CardInfo.java @@ -0,0 +1,24 @@ +package com.casic.missiles.modular.dto.hik; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/26 16:08 + */ +@Data +public class CardInfo { + //卡号,8~20个字符,支持数字和大写字母 + private String cardNo; + //人员ID,员工工号 + private String personId; + //人员所属组织IndexCode + private String orgIndexCode; + //卡片类型,默认是1:IC卡 + //1:IC卡 + //2:CPU卡 + //3:远距离卡 + //4:MIFARE卡 + private Number cardType; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/FaceRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/FaceRequest.java new file mode 100644 index 0000000..edc04bf --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/FaceRequest.java @@ -0,0 +1,16 @@ +package com.casic.missiles.modular.dto.hik; + +import lombok.Data; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/25 16:53 + */ +@Data +public class FaceRequest { + private String certificateNum; + private List indexCodes; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/BlackListController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/BlackListController.java index a27f9f8..0c06661 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/BlackListController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/BlackListController.java @@ -1,13 +1,18 @@ package com.casic.missiles.modular.controller; +import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.base.controller.ExportController; import com.casic.missiles.core.page.PageFactory; import com.casic.missiles.model.response.ResponseData; import com.casic.missiles.modular.dto.BlackInfoRequest; +import com.casic.missiles.modular.dto.BlackPictureRequest; +import com.casic.missiles.modular.dto.hik.PersonInfoRequest; +import com.casic.missiles.modular.enums.HikUri; import com.casic.missiles.modular.enums.OperateTypeEnum; import com.casic.missiles.modular.model.BlackInfo; import com.casic.missiles.modular.service.BlackInfoService; +import com.casic.missiles.modular.util.HikUtil; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; @@ -56,4 +61,22 @@ return null; } + /** + * 黑名单人员照片 + */ + @PostMapping("/personPicture") + @ResponseBody + public Object personPicture(@RequestBody BlackPictureRequest blackPictureRequest){ + //获取照片 + String picUri = blackPictureRequest.getPicUri(); + String serverIndexCode = blackPictureRequest.getServerIndexCode(); + PersonInfoRequest picRequest = new PersonInfoRequest(); + picRequest.setPicUri(picUri); + picRequest.setServerIndexCode(serverIndexCode); + String reBody = JSONObject.toJSONString(picRequest); + //重定向地址获取 + String url = HikUtil.hikApiFor302(HikUri.PERSON_PICTURE, reBody); + return ResponseData.success(url); + } + } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/DeviceController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/DeviceController.java index e1c4eba..666bbee 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/DeviceController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/DeviceController.java @@ -107,7 +107,7 @@ } /** - * 设备维修管理查询(分页),需计算MTTR=总维修时间/故障次数 + * 设备状态计算与评判/设备维修管理查询(分页),需计算MTTR=总维修时间/故障次数 */ @PostMapping("/repair/listPage") @ResponseBody @@ -211,7 +211,7 @@ //需根据设备编号获取到对应的门禁点唯一标识 doorControlRequest.setDoorIndexCodes(indexCodes); doorControlRequest.setControlType(Integer.valueOf(gateGroupDTO.getStatus())); - String body = JSONObject.toJSONString(deviceCodes); + String body = JSONObject.toJSONString(doorControlRequest); String resultStr = HikUtil.hikApi(HikUri.DOOR_CONTROL, body); JSONObject resultJson = (JSONObject)JSONObject.parse(resultStr); if (!"0".equals(resultJson.get("code"))) { diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/StaffController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/StaffController.java index b58ccab..704093c 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/StaffController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/StaffController.java @@ -2,15 +2,21 @@ import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.util.StrUtil; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.base.controller.ExportController; import com.casic.missiles.core.page.PageFactory; import com.casic.missiles.model.response.ErrorResponseData; import com.casic.missiles.model.response.ResponseData; import com.casic.missiles.modular.dto.StaffInfoRequest; +import com.casic.missiles.modular.dto.hik.PersonInfoRequest; +import com.casic.missiles.modular.dto.hik.StaffCardRequest; +import com.casic.missiles.modular.enums.HikUri; import com.casic.missiles.modular.enums.OperateTypeEnum; import com.casic.missiles.modular.model.StaffInfo; import com.casic.missiles.modular.service.StaffInfoService; +import com.casic.missiles.modular.util.HikUtil; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; @@ -110,4 +116,60 @@ } return ResponseData.success(); } + + /** + * 批量开卡,添加人员之后调用,若在一个接口中添加人员成功开卡失败则第二次添加时会有问题 + */ + @PostMapping("/cardBinding") + @ResponseBody + public Object cardBinding(@RequestBody StaffCardRequest staffCardRequest) { + String body = JSONObject.toJSONString(staffCardRequest); + String resultStr = HikUtil.hikApi(HikUri.CARD_BINDING, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (!"0".equals(resultJson.get("code"))) { + log.error("请求海康,批量开卡失败,海康response:{}", resultStr); + return ResponseData.error("批量开卡失败"); + } + //保存卡号 + if(staffInfoService.saveCardInfo(staffCardRequest) > 0){ + return ResponseData.success(); + } + return ResponseData.error("批量开卡失败"); + } + + /** + * 获取员工照片,海康存储 + */ + @PostMapping("/personPicture/{staffCode}") + @ResponseBody + public Object personPicture(@PathVariable("staffCode") String staffCode){ + //获取员工详细信息,含图片服务器、uri + PersonInfoRequest request = new PersonInfoRequest(); + List list = new ArrayList<>(); + list.add(staffCode); + request.setParamName("personId"); + request.setParamValue(list); + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi(HikUri.PERSON_INFO, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (!"0".equals(resultJson.get("code"))) { + log.error("请求海康,根据人员唯一字段获取人员详细信息失败,海康response:{}", resultStr); + return ResponseData.error("获取员工照片失败"); + } + //获取照片 + JSONObject data = (JSONObject) resultJson.get("data"); + JSONArray dataArray = (JSONArray) data.get("list"); + JSONObject jsonObject = (JSONObject) dataArray.get(0); + JSONArray personPhoto = (JSONArray) jsonObject.get("personPhoto"); + JSONObject photo = (JSONObject) personPhoto.get(0); + String picUri = photo.getString("picUri"); + String serverIndexCode = photo.getString("serverIndexCode"); + PersonInfoRequest picRequest = new PersonInfoRequest(); + picRequest.setPicUri(picUri); + picRequest.setServerIndexCode(serverIndexCode); + String reBody = JSONObject.toJSONString(picRequest); + //重定向地址获取 + String url = HikUtil.hikApiFor302(HikUri.PERSON_PICTURE, reBody); + return ResponseData.success(url); + } } 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 4a07dd9..7b1dcf6 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 @@ -16,6 +16,7 @@ import com.casic.missiles.modular.redis.key.CacheKeys; import com.casic.missiles.modular.service.CockpitService; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.util.CollectionUtils; import org.springframework.web.bind.annotation.*; @@ -24,10 +25,7 @@ import java.text.NumberFormat; import java.time.LocalDateTime; import java.time.temporal.ChronoUnit; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.util.*; import java.util.stream.Collectors; /** @@ -73,6 +71,9 @@ private StatisticNumberMapper numberMapper; @Autowired + private HazardLevelMapper hazardLevelMapper; + + @Autowired private AccessGroupConfig accessGroupConfig; /** @@ -104,8 +105,24 @@ public Object buildingNumberPerHour(){ //当天按小时分组的人数 List list = numberMapper.selectListByTime(); - Map> collect = list.stream().collect(Collectors.groupingBy(BuildingNumberDTO::getStatisticPosition)); - return ResponseData.success(collect); + Map> collect = list.stream().collect(Collectors.groupingBy(BuildingNumberDTO::getStatisticTime)); + //定时任务中已将每小时三栋楼人数存到数据库 + //将一期主楼和录制楼人数合并,二期单算 + List> resultList = new ArrayList<>(); + collect.keySet().forEach(key -> { + List buildingNumberDTOS = collect.get(key); + BuildingNumberDTO mainBuildingOne = buildingNumberDTOS.get(0); + BuildingNumberDTO mainBuildingTwo = buildingNumberDTOS.get(1); + BuildingNumberDTO recordingBuilding = buildingNumberDTOS.get(2); + HashMap resultMap = new HashMap<>(); + Integer oneQuantity = Integer.valueOf(mainBuildingOne.getStatisticQuantity()); + Integer recordingQuantity = Integer.valueOf(recordingBuilding.getStatisticQuantity()); + resultMap.put("staticTime", mainBuildingOne.getStatisticTime()); + resultMap.put(mainBuildingOne.getStatisticPositionName()+"、"+recordingBuilding.getStatisticPositionName(), String.valueOf(oneQuantity+recordingQuantity)); + resultMap.put(mainBuildingTwo.getStatisticPositionName(), mainBuildingTwo.getStatisticQuantity()); + resultList.add(resultMap); + }); + return ResponseData.success(resultList); } /** @@ -151,12 +168,11 @@ public Object securityNumber() { QueryWrapper wrapper = new QueryWrapper<>(); wrapper.eq("staff_type", 2); + // TODO: 2022/9/2 后续使用产品确定的每天出勤的安保人员的数量 Integer total = staffInfoMapper.selectCount(wrapper); - //当日离岗事件个数 - QueryWrapper wrapper1 = new QueryWrapper<>(); - wrapper1.eq("hik_event_type", SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); - wrapper1.apply("date_format(now(),'%Y-%m-%d') = date_format(happen_time,'%Y-%m-%d')"); - Integer leave = caseInfoMapper.selectCount(wrapper1); + //当日离岗事件按设备去重后的个数 + // TODO: 2022/9/2 目前相当于24小时内的计算,之后看需要可改成自定义小时数计算离岗率,即离岗+6小时内仅一次离岗则恢复为100%,多次则累加离岗次数计算离岗率 + Integer leave = caseInfoMapper.selectDemobilizedCount(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); NumberFormat numberFormat = NumberFormat.getInstance(); // 设置精确到小数点后2位 numberFormat.setMaximumFractionDigits(2); @@ -179,7 +195,6 @@ @ResponseBody public Object visitorApplyDetail() { List reasonGroup = applyMapper.selectByVisitReason(); - HashMap resultMap = new HashMap<>(); NumberFormat numberFormat = NumberFormat.getInstance(); // 设置精确到小数点后2位 numberFormat.setMaximumFractionDigits(2); @@ -187,12 +202,17 @@ if(0 == sum){ return ResponseData.success(); } + List resultList = new ArrayList<>(); reasonGroup.forEach(group -> { String reasonName = dictService.getDictNameByCode(SecurityEventDict.VISIT_REASON, group.getVisitReason()); String result = numberFormat.format((float) group.getQuantity() / (float) sum * 100); - resultMap.put(reasonName, result+"%"); + ApplyReasonGroupDTO applyReasonGroupDTO = new ApplyReasonGroupDTO(); + applyReasonGroupDTO.setQuantity(group.getQuantity()); + applyReasonGroupDTO.setVisitReason(reasonName); + applyReasonGroupDTO.setRatio(result+"%"); + resultList.add(applyReasonGroupDTO); }); - return ResponseData.success(resultMap); + return ResponseData.success(resultList); } /** @@ -247,6 +267,32 @@ } /** + * 机动力量实时在岗率,在岗人数除以总应在岗人数,用离岗+6小时内恢复为100%,6小时外再计算 + */ + @GetMapping("/staff/beOnDutyRatio") + @ResponseBody + public Object beOnDutyRatio() { + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("staff_type", 2); + // TODO: 2022/9/2 后续使用产品确定的每天出勤的安保人员的数量 + Integer total = staffInfoMapper.selectCount(wrapper); + if(0 == total){ + return ResponseData.success(null); + } + //当日离岗事件按设备去重后的个数 + // TODO: 2022/9/2 目前相当于24小时内的计算,之后看需要可改成自定义小时数计算离岗率,即离岗+6小时内仅一次离岗则恢复为100%,多次则累加离岗次数计算离岗率 + List onDutyRatioDTOS = caseInfoMapper.selectDemobilizedCountByHour(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); + onDutyRatioDTOS.forEach(dto -> { + NumberFormat numberFormat = NumberFormat.getInstance(); + // 设置精确到小数点后2位 + numberFormat.setMaximumFractionDigits(2); + String result = numberFormat.format(100 - Float.valueOf(dto.getQuantity()) / (float) total * 100); + dto.setRatio(result+"%"); + }); + return ResponseData.success(onDutyRatioDTOS); + } + + /** * 闸机速通门统计-设备状态分组计算数量,devType传闸机字典key * 视频频监控摄像机统计-设备状态分组计算数量,devType传摄像头字典key */ @@ -262,12 +308,17 @@ if(sum <= 0){ return ResponseData.error("无该类设备信息"); } + List resultList = new ArrayList<>(); gateStatusGroup.forEach(group -> { String devStatus = dictService.getDictNameByCode(SecurityEventDict.DEVICE_STATUS, group.getStatus()); String result = numberFormat.format((float) group.getQuantity() / (float) sum * 100); - resultMap.put(devStatus, result+"%"); + GateStatusGroupResponse gateStatusGroupResponse = new GateStatusGroupResponse(); + gateStatusGroupResponse.setStatus(devStatus); + gateStatusGroupResponse.setRatio(result+"%"); + resultList.add(gateStatusGroupResponse); }); - resultMap.put("总", sum); + resultMap.put("total", sum); + resultMap.put("list", resultList); return ResponseData.success(resultMap); } @@ -282,17 +333,38 @@ String position = securityScoreDTO.getPosition(); List caseInfos = caseInfoMapper.selectByPosition(position); //查询各危险级别权重、各类别权重,放入map,避免循环中多次查数据库 - + HashMap hazardScoreMap = new HashMap<>(); + List caseHazardLevelList = hazardLevelMapper.getCaseHazardLevelList(null); + caseHazardLevelList.forEach(hazardLevel -> { + hazardScoreMap.put(hazardLevel.getCode(), hazardLevel.getWeight()); + }); + HashMap categoryScoreMap = new HashMap<>(); + List categoryLevelList = categoryLevelMapper.getCaseCategoryLevelList(null); + categoryLevelList.forEach(categoryLevel -> { + categoryScoreMap.put(categoryLevel.getCode(), categoryLevel.getWeight()); + }); + //事件按楼层分组,计算 List securityScoreDTOs = new ArrayList<>(); caseInfos.forEach(caseInfo -> { SecurityScoreDTO securityScoreDTO1 = new SecurityScoreDTO(); + securityScoreDTO1.setPosition(caseInfo.getPosition()); securityScoreDTO1.setArea(caseInfo.getArea()); - // TODO: 2022/8/4 楼层评分计算根据产品定义调整 -// caseInfo.get -// securityScoreDTO1.setScore(); + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); + Double score = 100 - Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + securityScoreDTO1.setScore(score); + securityScoreDTOs.add(securityScoreDTO1); }); - - return null; + 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); + }); + return ResponseData.success(securityScoreDTOs); } /** @@ -303,9 +375,13 @@ public Object SecurityFrequency(@RequestBody SecurityFrequencyDTO securityFrequencyDTO) { String year = securityFrequencyDTO.getYear(); String month = securityFrequencyDTO.getMonth(); - Integer quantity = caseInfoMapper.selectCountByMonth(year, month); - securityFrequencyDTO.setQuantity(quantity); - return ResponseData.success(securityFrequencyDTO); + if(!StringUtils.isEmpty(year) && StringUtils.isEmpty(month)){ + Integer quantity = caseInfoMapper.selectCountByMonth(year, month); + securityFrequencyDTO.setQuantity(quantity); + return ResponseData.success(securityFrequencyDTO); + } + List list = caseInfoMapper.selectPreMonthCount(); + return ResponseData.success(list); } } 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 ae4d770..f4f075c 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 @@ -1,20 +1,25 @@ package com.casic.missiles.modular.controller.cockpit; +import cn.hutool.core.date.DateUnit; import cn.hutool.core.date.DateUtil; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.casic.missiles.model.response.ResponseData; -import com.casic.missiles.modular.dao.AttendanceInfoMapper; -import com.casic.missiles.modular.dao.CaseInfoMapper; -import com.casic.missiles.modular.dao.HazardLevelMapper; -import com.casic.missiles.modular.dao.StaffInfoMapper; +import com.casic.missiles.modular.dao.*; +import com.casic.missiles.modular.dto.DeviceRepairLogDTO; +import com.casic.missiles.modular.dto.DeviceRepairRequest; import com.casic.missiles.modular.dto.statistics.*; +import com.casic.missiles.modular.enums.SecurityEventType; +import com.casic.missiles.modular.model.CaseCategoryLevel; import com.casic.missiles.modular.model.CaseHazardLevel; +import com.casic.missiles.modular.model.CaseInfo; import com.casic.missiles.modular.model.StaffInfo; +import com.casic.missiles.modular.service.DeviceInfoService; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.util.CollectionUtils; import org.springframework.web.bind.annotation.*; +import java.math.BigDecimal; import java.text.NumberFormat; import java.util.*; import java.util.stream.Collectors; @@ -40,6 +45,12 @@ @Autowired private HazardLevelMapper hazardLevelMapper; + @Autowired + private CategoryLevelMapper categoryLevelMapper; + + @Autowired + private DeviceInfoService deviceInfoService; + /** * 安防事件时域频次统计,每月的每天安防事件个数(原方案) * 月维度:展示每个月的每天的数据 @@ -89,15 +100,17 @@ List monthList = caseInfoMapper.selectPreMonthCountByYear(year); Map> collect = monthList.stream().collect(Collectors.groupingBy(PreMonthOrWeekCaseDTO::getHazardLevelCode)); HashMap strAvgMap = new HashMap<>(); + List resultList = new ArrayList<>(); for (String key : collect.keySet()) { List preMonthOrWeekCaseDTOS = collect.get(key); int sum = preMonthOrWeekCaseDTOS.stream().mapToInt(PreMonthOrWeekCaseDTO::getQuantity).sum(); //若年份是本年,则使用个安防级别数量/当前月份数 //若不是本年,除数为12 MonthAndWeekDTO monthAndWeekDTO = new MonthAndWeekDTO(); + String hazardName = hazardLevelMapper.selectHazardNameByCode(key); + monthAndWeekDTO.setLevelName(hazardName); if(year.equals(String.valueOf(DateUtil.thisYear()))){ monthAndWeekDTO.setMonthQuantity(sum / DateUtil.thisMonth()); -// monthAndWeekDTO.setLevelName(); strAvgMap.put(key, monthAndWeekDTO); }else{ monthAndWeekDTO.setMonthQuantity(sum / 12); @@ -113,27 +126,37 @@ if(year.equals(String.valueOf(DateUtil.thisYear()))){ if(!Objects.isNull(strAvgMap.get(key))){ MonthAndWeekDTO monthAndWeekDTO = strAvgMap.get(key); + String hazardName = hazardLevelMapper.selectHazardNameByCode(key); + monthAndWeekDTO.setLevelName(hazardName); monthAndWeekDTO.setWeekQuantity(sum / DateUtil.thisWeekOfYear()); strAvgMap.put(key, monthAndWeekDTO); }else{ MonthAndWeekDTO monthAndWeekDTO = new MonthAndWeekDTO(); + String hazardName = hazardLevelMapper.selectHazardNameByCode(key); + monthAndWeekDTO.setLevelName(hazardName); monthAndWeekDTO.setWeekQuantity(sum / DateUtil.thisWeekOfYear()); strAvgMap.put(key, monthAndWeekDTO); } }else{ if(!Objects.isNull(strAvgMap.get(key))){ MonthAndWeekDTO monthAndWeekDTO = strAvgMap.get(key); + String hazardName = hazardLevelMapper.selectHazardNameByCode(key); + monthAndWeekDTO.setLevelName(hazardName); monthAndWeekDTO.setWeekQuantity(sum / 52); strAvgMap.put(key, monthAndWeekDTO); }else{ MonthAndWeekDTO monthAndWeekDTO = new MonthAndWeekDTO(); + String hazardName = hazardLevelMapper.selectHazardNameByCode(key); + monthAndWeekDTO.setLevelName(hazardName); monthAndWeekDTO.setWeekQuantity(sum / 52); strAvgMap.put(key, monthAndWeekDTO); } } } - avgMonthAndWeekGroupDTO.setMap(strAvgMap); - return ResponseData.success(avgMonthAndWeekGroupDTO); + strAvgMap.keySet().forEach(key -> { + resultList.add(strAvgMap.get(key)); + }); + return ResponseData.success(resultList); } /** @@ -181,12 +204,178 @@ } /** - * 员工考勤人数变化,功能待定 + * 员工考勤人数变化,统计当天(横坐标为时)及近7天(横坐标为天)的考勤人数变化,只要发生一次考勤识别,次数的基数就正常增加(没有上班下班区分) */ + @PostMapping("/staff/attendanceNumber/{dimension}") + @ResponseBody + public Object attendanceNumber(@PathVariable("dimension") String dimension) { + List attendanceNumberDTOs = null; + List> resultList = new ArrayList<>(); + if("week".equals(dimension)){ + //近7天数据按天分组统计 + attendanceNumberDTOs = attendanceInfoMapper.getCountForWeek(); + }else if("day".equals(dimension)) { + //今天数据按小时分组统计 + attendanceNumberDTOs = attendanceInfoMapper.getCountForDay(); + } + if(CollectionUtils.isEmpty(attendanceNumberDTOs)){ + return ResponseData.error("该查询条件下,无员工出勤数据!"); + } + Map> collect = attendanceNumberDTOs.stream().collect(Collectors.groupingBy(AttendanceNumberDTO::getDate)); + collect.keySet().forEach(key -> { + List attendanceNumberDTOS = collect.get(key); + AttendanceNumberDTO attendanceNumberDTO = attendanceNumberDTOS.get(0); + AttendanceNumberDTO attendanceNumberDTO2 = attendanceNumberDTOS.get(1); + Map resultMap = new HashMap<>(); + resultMap.put(attendanceNumberDTO.getStaffType(), attendanceNumberDTO.getQuantity()); + resultMap.put(attendanceNumberDTO2.getStaffType(), attendanceNumberDTO2.getQuantity()); + resultMap.put("staticTime", attendanceNumberDTO.getDate()); + resultList.add(resultMap); + }); + return ResponseData.success(resultList); + } /** - * 近30天/近一周安保人员到岗排行 + * 早晚高峰区域安防评估 */ + @PostMapping("/security/assessment/{dimension}") + @ResponseBody + public Object securityAssessment(@PathVariable("dimension") String dimension) { + //查询各危险级别权重、各类别权重,放入map,避免循环中多次查数据库 + HashMap hazardScoreMap = new HashMap<>(); + List caseHazardLevelList = hazardLevelMapper.getCaseHazardLevelList(null); + caseHazardLevelList.forEach(hazardLevel -> { + hazardScoreMap.put(hazardLevel.getCode(), hazardLevel.getWeight()); + }); + HashMap categoryScoreMap = new HashMap<>(); + List categoryLevelList = categoryLevelMapper.getCaseCategoryLevelList(null); + categoryLevelList.forEach(categoryLevel -> { + categoryScoreMap.put(categoryLevel.getCode(), categoryLevel.getWeight()); + }); + HashMap hashMap = new HashMap<>(); + if("week".equals(dimension)){ + //近7天早晚高峰数据 + List caseInfos = caseInfoMapper.selectListBySevenDay(); + //按时间(天)进行分组 + caseInfos.forEach(caseInfo -> { + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); + Double score = Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + String[] array = caseInfo.getHappenTime().split(" "); + String dayTime = array[0]; + BigDecimal preScore; + if(hashMap.containsKey(dayTime)){ + Double aDouble = hashMap.get(dayTime); + preScore = new BigDecimal(aDouble.toString()); + + }else{ + preScore = new BigDecimal("100.0"); + } + BigDecimal nowScore = new BigDecimal(score.toString()); + hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); + }); + return ResponseData.success(hashMap); + }else if("day".equals(dimension)) { + //今天数据按小时分组统计 + List caseInfos = caseInfoMapper.selectListByToday(); + caseInfos.forEach(caseInfo -> { + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); + Double score = Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + String[] array = caseInfo.getHappenTime().split(":"); + String dayTime = array[0]; + BigDecimal preScore; + if(hashMap.containsKey(dayTime)){ + Double aDouble = hashMap.get(dayTime); + preScore = new BigDecimal(aDouble.toString()); + + }else{ + preScore = new BigDecimal("100.0"); + } + BigDecimal nowScore = new BigDecimal(score.toString()); + hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); + }); + return ResponseData.success(hashMap); + } + return null; + } + + /** + * 重点区域安防事态评估,统计重点区域6:00-23:00按小时分组数据 + */ + @GetMapping("/security/keyAreaStatistic") + @ResponseBody + public Object keyAreaStatistic() { + //查询各危险级别权重、各类别权重,放入map,避免循环中多次查数据库 + HashMap hazardScoreMap = new HashMap<>(); + List caseHazardLevelList = hazardLevelMapper.getCaseHazardLevelList(null); + caseHazardLevelList.forEach(hazardLevel -> { + hazardScoreMap.put(hazardLevel.getCode(), hazardLevel.getWeight()); + }); + HashMap categoryScoreMap = new HashMap<>(); + List categoryLevelList = categoryLevelMapper.getCaseCategoryLevelList(null); + categoryLevelList.forEach(categoryLevel -> { + categoryScoreMap.put(categoryLevel.getCode(), categoryLevel.getWeight()); + }); + HashMap hashMap = new HashMap<>(); + //今天数据按小时分组统计 + List caseInfos = caseInfoMapper.selectListByToday2(); + caseInfos.forEach(caseInfo -> { + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); + Double score = Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + String[] array = caseInfo.getHappenTime().split(":"); + String dayTime = array[0]; + BigDecimal preScore; + if(hashMap.containsKey(dayTime)){ + Double aDouble = hashMap.get(dayTime); + preScore = new BigDecimal(aDouble.toString()); + + }else{ + preScore = new BigDecimal("100.0"); + } + BigDecimal nowScore = new BigDecimal(score.toString()); + hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); + }); + return ResponseData.success(hashMap); + } + + /** + * 安防机动支援力量调配响应评估,根据事件已解决状态及已解决时间-发送时间,按时间(小时)分组统计 + */ + @GetMapping("/security/responseAssess") + @ResponseBody + public Object responseAssess() { + //查询各危险级别权重、各类别权重,放入map,避免循环中多次查数据库 + HashMap hazardScoreMap = new HashMap<>(); + List caseHazardLevelList = hazardLevelMapper.getCaseHazardLevelList(null); + caseHazardLevelList.forEach(hazardLevel -> { + hazardScoreMap.put(hazardLevel.getCode(), hazardLevel.getWeight()); + }); + HashMap hashMap = new HashMap<>(); + //今天数据按小时分组统计 + List caseInfos = caseInfoMapper.selectListByToday3(); + caseInfos.forEach(caseInfo -> { + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + //扣分=事件级别权重*未解决小时数 + Date updateTime = DateUtil.parse(caseInfo.getUpdateTime()); + Date happenTime = DateUtil.parse(caseInfo.getHappenTime()); + long between = DateUtil.between(updateTime, happenTime, DateUnit.HOUR); + Double score = Double.valueOf(hazardWeight)*between; + String[] array = caseInfo.getHappenTime().split(":"); + String dayTime = array[0]; + BigDecimal preScore; + if(hashMap.containsKey(dayTime)){ + Double aDouble = hashMap.get(dayTime); + preScore = new BigDecimal(aDouble.toString()); + }else{ + preScore = new BigDecimal("100.0"); + } + BigDecimal nowScore = new BigDecimal(score.toString()); + hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); + }); + return ResponseData.success(hashMap); + } /** * 重点区域威胁事件类型统计,优先级2,统计近7天和近30天 @@ -224,7 +413,34 @@ } /** - * 设备状态计算系数和评判,优先级3,需确认设备恢复时间是否可以获取 + * 近30天/近一周安保人员到岗排行 */ + + /** + * 安保等级评估,发生离岗事件减1分 + */ + @GetMapping("/security/levelAssess") + @ResponseBody + public Object securityLevelAssess() { + //今天数据按小时分组统计 + List resultList = caseInfoMapper.selectListByType(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); + resultList.forEach(result -> { + BigDecimal deScore = new BigDecimal(result.getQuantity()); + BigDecimal preScore = new BigDecimal("100.0"); + result.setScore(preScore.subtract(deScore).doubleValue()); + }); + return ResponseData.success(resultList); + } + + /** + * 设备状态计算系数和评判,即设备维修管理查询(不分页) + */ + @PostMapping("/device/repairList") + @ResponseBody + public Object repairList(@RequestBody DeviceRepairRequest deviceRepairRequest) { + List deviceRepairLogDTOS = deviceInfoService.deviceRepairListPage(deviceRepairRequest); + return ResponseData.success(deviceRepairLogDTOS); + } + } 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 fbf8ab6..c71a15a 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 @@ -1,13 +1,12 @@ package com.casic.missiles.modular.controller.hik; +import cn.hutool.core.date.DateTime; +import cn.hutool.core.date.DateUtil; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.casic.missiles.model.response.ResponseData; import com.casic.missiles.modular.dao.HikFaceGroupInfoMapper; -import com.casic.missiles.modular.dto.hik.EventSubscribeRequest; -import com.casic.missiles.modular.dto.hik.FaceGroupAdditionRequest; -import com.casic.missiles.modular.dto.hik.HikRecvEvent; -import com.casic.missiles.modular.dto.hik.OrgBatchAdd; +import com.casic.missiles.modular.dto.hik.*; import com.casic.missiles.modular.enums.HikUri; import com.casic.missiles.modular.enums.SecurityEventType; import com.casic.missiles.modular.model.CaseInfo; @@ -18,16 +17,20 @@ import com.casic.missiles.modular.util.CaseInfoFactoryUtil; import com.casic.missiles.modular.util.HikUtil; import com.casic.missiles.modular.util.ThreadPoolUtil; +import com.casic.missiles.modular.util.WebSocket; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; -import org.springframework.web.bind.annotation.*; +import org.springframework.util.CollectionUtils; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.RestController; -import java.net.InetAddress; -import java.net.UnknownHostException; import java.util.ArrayList; +import java.util.Iterator; import java.util.List; import java.util.Objects; @@ -38,7 +41,6 @@ */ @Slf4j @RestController -@RequestMapping("/hik") public class HikController { @Autowired @@ -53,28 +55,37 @@ @Autowired private HikService hikService; + @Autowired + private HikFaceGroupInfoMapper hikFaceGroupInfoMapper; + + @Autowired + private WebSocket webSocket; + @Value("${server.port}") private int serverPort; - @Autowired - private HikFaceGroupInfoMapper hikFaceGroupInfoMapper; /** * 海康事件订阅 */ - @PostMapping("/event/subscribe") + @PostMapping("/hik/event/subscribe") @ResponseBody - public Object eventSubscribe() throws UnknownHostException { + public Object eventSubscribe() { EventSubscribeRequest eventSubscribeRequest = new EventSubscribeRequest(); ArrayList list = new ArrayList<>(); list.add(SecurityEventType.DEVICE_OFFLINE); + list.add(SecurityEventType.DEVICE_ONLINE); list.add(SecurityEventType.KEY_PERSONNEL_IDENTIFY_EVENT); list.add(SecurityEventType.MONITORING_POINT_OFFLINE); + list.add(SecurityEventType.MONITORING_POINT_ONLINE); list.add(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); list.add(SecurityEventType.PERSONNEL_GATHER_EVENT); - InetAddress localHost = InetAddress.getLocalHost(); + list.add(SecurityEventType.VISITOR_REGISTER); + list.add(SecurityEventType.VISITOR_CHECKOUT); + list.add(SecurityEventType.HIGH_ALTITUDE_PARABOLIC); +// InetAddress localHost = InetAddress.getLocalHost(); eventSubscribeRequest.setEventTypes(list); - eventSubscribeRequest.setEventDest("https://" + localHost + ":" + serverPort + "/eventRcv"); + eventSubscribeRequest.setEventDest("http://" + "192.168.10.6" + ":" + serverPort + "/eventRcv"); //订阅类型,0-订阅原始事件,1-联动事件,2-原始事件和联动事件,不填使用默认值0 eventSubscribeRequest.setSubType(0); /** @@ -92,19 +103,25 @@ } /** + * 查询事件订阅信息 + */ + @PostMapping("/hik/event/query") + @ResponseBody + public Object eventQuery() { + String result = HikUtil.hikApi(HikUri.EVENT_INFO, ""); + return result; + } + + /** * 海康事件接收 */ @PostMapping("/eventRcv") @ResponseBody public Object eventRcv(@RequestBody HikRecvEvent hikRecvEvent) { //1、接收所需事件类型 - Long eventType = hikRecvEvent.getEventType(); + Number eventType = hikRecvEvent.getEventType(); log.info("接收到安防事件类型为:{}", eventType); CaseInfo caseInfo = caseInfoFactoryUtil.getCaseInfo(eventType); - //接收到不关心事件直接返回 - if(Objects.isNull(caseInfo)){ - return ResponseData.success(); - } //2、不同事件不同处理,caseInfoFactoryUtil已设置好事件基础定义信息 // 再为事件添加状态、设备编码、设备名称、位置、区域、时间 // 异步处理事件 @@ -114,19 +131,23 @@ caseHandle(hikRecvEvent, eventType, caseInfo); } })); +// caseHandle(hikRecvEvent, eventType, caseInfo); - return null; + return ResponseData.success(); } - private void caseHandle(HikRecvEvent hikRecvEvent, Long eventType, CaseInfo caseInfo) { + private void caseHandle(HikRecvEvent hikRecvEvent, Number eventType, CaseInfo caseInfo) { JSONArray eventArray = hikRecvEvent.getEventArray(); List caseInfos = new ArrayList<>(); - while (eventArray.stream().iterator().hasNext()) { + Iterator iterator = eventArray.iterator(); + while (iterator.hasNext()) { CaseInfo caseInfo1 = new CaseInfo(); - BeanUtils.copyProperties(caseInfo, caseInfo1); - JSONObject event = (JSONObject) eventArray.stream().iterator().next(); + if(!Objects.isNull(caseInfo)){ + BeanUtils.copyProperties(caseInfo, caseInfo1); + } + JSONObject event = (JSONObject) iterator.next(); //5种事件进行不同处理 - if(SecurityEventType.KEY_PERSONNEL_IDENTIFY_EVENT == eventType){ + if (SecurityEventType.KEY_PERSONNEL_IDENTIFY_EVENT.equals(eventType)) { //判断所属人脸分组 JSONObject data = (JSONObject) event.get("data"); JSONObject faceRecognitionResult = (JSONObject) data.get("faceRecognitionResult"); @@ -142,52 +163,101 @@ if (faceGroupCode.equals(blackListGroup.getFaceGroupCode())) { //黑名单分组处理 caseInfo1 = hikService.blackListHandle(event, caseInfo1); - }else if(faceGroupCode.equals(propertyPersonnelGroup.getFaceGroupCode())){ + } else if (faceGroupCode.equals(propertyPersonnelGroup.getFaceGroupCode())) { //考勤分组处理-物业人员,添加到考勤表 hikService.propertyAttendanceHandle(event); - }else if(faceGroupCode.equals(securityPersonnelGroup.getFaceGroupCode())){ + } else if (faceGroupCode.equals(securityPersonnelGroup.getFaceGroupCode())) { //考勤分组处理-安保人员,添加到考勤表 hikService.securityPersonnelHandle(event); - }else { + } else { return; } - }else if(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT == eventType){ + } else if (SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT.equals(eventType)) { //离岗事件处理 caseInfo1 = hikService.demobilizedHandle(event, caseInfo1); - }else if(SecurityEventType.PERSONNEL_GATHER_EVENT == eventType){ + } else if (SecurityEventType.PERSONNEL_GATHER_EVENT.equals(eventType)) { //人员聚集事件处理 caseInfo1 = hikService.personGatherHandle(event, caseInfo1); - }else if(SecurityEventType.MONITORING_POINT_OFFLINE == eventType){ + } else if (SecurityEventType.MONITORING_POINT_OFFLINE.equals(eventType)) { //监控点离线事件处理 caseInfo1 = hikService.monitorPointOfflineHandle(event, caseInfo1); - }else if(SecurityEventType.DEVICE_OFFLINE == eventType){ + } else if (SecurityEventType.MONITORING_POINT_ONLINE.equals(eventType)) { + //监控点上线事件处理 + hikService.monitorPointOnlineHandle(event); + } else if (SecurityEventType.DEVICE_OFFLINE.equals(eventType)) { //装置离线事件处理 caseInfo1 = hikService.deviceOfflineHandle(event, caseInfo1); - }else if(SecurityEventType.VISITOR_REGISTER == eventType){ + } else if (SecurityEventType.DEVICE_ONLINE.equals(eventType)) { + //装置上线处理 + hikService.deviceOnlineHandle(event); + } else if (SecurityEventType.VISITOR_REGISTER.equals(eventType)) { //记录访客登记记录,添加到访客记录表 hikService.visitorRegisterHandler(event); - }else if(SecurityEventType.VISITOR_CHECKOUT == eventType){ + } else if (SecurityEventType.VISITOR_CHECKOUT.equals(eventType)) { //记录访客签离记录 hikService.visitorCheckOutHandler(event); } - if(!Objects.isNull(caseInfo1) && !StringUtils.isEmpty(caseInfo1.getHappenTime())){ + if (!Objects.isNull(caseInfo1) && !StringUtils.isEmpty(caseInfo1.getHappenTime())) { caseInfos.add(caseInfo1); } } //3、安防事件入库 - if(!caseInfoService.insertCaseInfoBatch(caseInfos)){ - log.error("安防事件批量入库异常"); + if (!CollectionUtils.isEmpty(caseInfos) && !caseInfoService.insertCaseInfoBatch(caseInfos)) { + log.error("安防事件批量入库异常!"); } // TODO: 2022/8/15 webSocket推送 + if (CollectionUtils.isEmpty(caseInfos)) { + log.info("webSocket事件推送"); + webSocket.sendAllMessage(JSONObject.toJSONString(caseInfos)); + } return; } /** + * 以图搜图,前端用于轨迹追踪 + */ + @PostMapping("/hik/search/picture") + @ResponseBody + public Object searchPictures(@RequestBody SearchPicturesRequest searchPicturesRequest) { + DateTime startDateTime = DateUtil.parse(searchPicturesRequest.getStartTime()); + DateTime endDateTime = DateUtil.parse(searchPicturesRequest.getEndTime()); + String startTime = DateUtil.format(startDateTime, "yyyy-MM-dd'T'HH:mm:ss.SSSXXX"); + String endTime = DateUtil.format(endDateTime, "yyyy-MM-dd'T'HH:mm:ss.SSSXXX"); + searchPicturesRequest.setStartTime(startTime); + searchPicturesRequest.setEndTime(endTime); + String body = JSONObject.toJSONString(searchPicturesRequest); + String resultStr = HikUtil.hikApi(HikUri.SEARCH_PICTURES, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (!"0".equals(resultJson.get("code"))) { + log.error("请求海康,以图搜图失败,海康response:{}", resultStr); + return ResponseData.error("以图搜图失败"); + } + return ResponseData.success(resultJson); + } + + + /** + * 海康事件取消订阅 + */ + @PostMapping("/hik/event/cancel") + @ResponseBody + public Object eventCancelSubscribe(@RequestBody CancelSubscribeRequest cancelSubscribeRequest) { + String body = JSONObject.toJSONString(cancelSubscribeRequest); + String resultStr = HikUtil.hikApi(HikUri.EVENT_CANCEL, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (!"0".equals(resultJson.get("code"))) { + log.error("请求海康,取消订阅失败,海康response:{}", resultStr); + return ResponseData.error("取消订阅失败"); + } + return ResponseData.success(resultJson); + } + + /** * 单个添加海康人脸分组 * api->hik单个添加人脸分组api->response->mysql */ - @PostMapping("/faceGroup/single/add") + @PostMapping("/hik/faceGroup/single/add") @ResponseBody public Object faceGroupAddition(@RequestBody FaceGroupAdditionRequest faceGroupAdditionRequest) { String body = JSONObject.toJSONString(faceGroupAdditionRequest); @@ -212,7 +282,7 @@ * 批量添加海康组织 * api->hik批量添加组织api->response */ - @PostMapping("/org/batch/add") + @PostMapping("/hik/org/batch/add") @ResponseBody public Object orgBatchAdd(@RequestBody List orgBatchAddRequest) { String body = JSONObject.toJSONString(orgBatchAddRequest); @@ -232,4 +302,62 @@ return ResponseData.error("批量添加组织失败"); } + /** + * 获取人员列表 + */ + @PostMapping("/hik/person/personList") + @ResponseBody + public Object personList() { + PersonListRequest request = new PersonListRequest(); + request.setPageNo(1); + request.setPageSize(100); + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi("/api/resource/v2/person/personList", body); + return resultStr; + } + + /** + * 获取组织列表 + */ + @PostMapping("/hik/org/orgList") + @ResponseBody + public Object orgList() { + PersonListRequest request = new PersonListRequest(); + request.setPageNo(1); + request.setPageSize(100); + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi("/api/resource/v1/org/orgList", body); + return resultStr; + } + + /** + * 查询访客权限下载记录 + */ + @PostMapping("/hik/auth/result") + @ResponseBody + public Object authResult() { + PersonListRequest request = new PersonListRequest(); + request.setPageNo(1); + request.setPageSize(100); + request.setOrderId("ba101db6246711edaea66f7939a13638"); + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi("/api/visitor/v1/auth/result", body); + return resultStr; + } + + /** + * 人脸图片获取 + */ + @PostMapping("/hik/face/picture") + @ResponseBody + public Object facePicture() { + FaceRequest request = new FaceRequest(); +// List list = new ArrayList<>(); +// list.add(""); + request.setCertificateNum("wanggong"); + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi("/api/frs/v1/face", body); + return resultStr; + } + } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/AssetInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/AssetInfoMapper.java index 4f64e83..c0684ee 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/AssetInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/AssetInfoMapper.java @@ -17,6 +17,6 @@ @Mapper public interface AssetInfoMapper extends BaseMapper { - List getAssetInfoListPage(@Param("page") Page page, AssetInfoRequest assetInfoRequest); + List getAssetInfoListPage(@Param("page") Page page, @Param("assetInfoRequest") AssetInfoRequest assetInfoRequest); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/AttendanceInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/AttendanceInfoMapper.java index f9e793e..ec87e46 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/AttendanceInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/AttendanceInfoMapper.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.statistics.AttendanceNumberDTO; import com.casic.missiles.modular.dto.statistics.AttendanceRatioDTO; import com.casic.missiles.modular.model.AttendanceInfo; import org.apache.ibatis.annotations.Mapper; @@ -17,7 +18,7 @@ */ @Mapper public interface AttendanceInfoMapper extends BaseMapper { - List getAttendanceInfoListPage(@Param("page") Page page, StaffInfoRequest attendanceInfoRequest); + List getAttendanceInfoListPage(@Param("page") Page page, @Param("attendanceInfoRequest") StaffInfoRequest attendanceInfoRequest); AttendanceInfo selectByCodeAndDate(@Param("staffCode") String staffCode); @@ -26,4 +27,8 @@ List getCountByTypeAndDateForMonth(@Param("staffType")String staffType); List getCountByTypeAndDateForYear(@Param("staffType")String staffType); + + List getCountForWeek(); + + List getCountForDay(); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java index ce94b8f..6137a7d 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java @@ -17,5 +17,5 @@ @Mapper public interface BlackInfoMapper extends BaseMapper { - List getBlackInfoListPage(@Param("page") Page page, BlackInfoRequest blackInfoRequest); + List getBlackInfoListPage(@Param("page") Page page, @Param("blackInfoRequest") BlackInfoRequest blackInfoRequest); } 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 efda6b3..50aaa6f 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 @@ -20,7 +20,7 @@ List getCaseInfoListPage(@Param("page") Page page, @Param("caseInfoRequest") CaseInfoRequest caseInfoRequest); - int updateStatusById(CaseInfoRequest caseInfoRequest); + int updateStatusById(@Param("caseInfoRequest") CaseInfoRequest caseInfoRequest); List selectByLevelAndMonth(@Param("year") String year); @@ -47,4 +47,20 @@ List selectPreWeekCountByThirtyDay(); List selectPreDayCountBySevenDay(); + + Integer selectDemobilizedCount(@Param("eventType") Number personnelDemobilizedEvent); + + List selectPreMonthCount(); + + List selectListBySevenDay(); + + List selectListByToday(); + + List selectListByToday2(); + + List selectListByToday3(); + + List selectListByType(@Param("eventType") Number eventType); + + List selectDemobilizedCountByHour(@Param("eventType") Number eventType); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/CategoryLevelMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/CategoryLevelMapper.java index 52fc714..afe1650 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/CategoryLevelMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/CategoryLevelMapper.java @@ -17,9 +17,9 @@ @Mapper public interface CategoryLevelMapper extends BaseMapper { - List getCaseCategoryLevelListPage(@Param("page") Page page, CategoryLevelRequest categoryLevelRequest); + List getCaseCategoryLevelListPage(@Param("page") Page page, @Param("categoryLevelRequest") CategoryLevelRequest categoryLevelRequest); - List getCaseCategoryLevelList(CategoryLevelRequest categoryLevelRequest); + List getCaseCategoryLevelList(@Param("categoryLevelRequest") CategoryLevelRequest categoryLevelRequest); CaseCategoryLevel getCaseCategoryLevel(@Param("categoryLevelCode") String categoryLevelCode); 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 66353b1..2555a09 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 @@ -19,7 +19,7 @@ @Mapper public interface DeviceInfoMapper extends BaseMapper { - List getDeviceInfoListPage(@Param("page") Page page, DeviceInfoRequest deviceInfoRequest); + List getDeviceInfoListPage(@Param("page") Page page, @Param("deviceInfoRequest") DeviceInfoRequest deviceInfoRequest); List getDeviceInfoList(@Param("deviceInfoRequest") DeviceInfoRequest deviceInfoRequest); @@ -27,6 +27,8 @@ DeviceInfo getByIndexCode(@Param("srcIndex") String srcIndex); + DeviceInfo getByIp(@Param("ip") String ip); + List selectIndexCodesByCodes(@Param("deviceCodes") List deviceCodes); List selectByType(@Param("devType") String devType); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java index 41dd0af..5bfaf63 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java @@ -5,6 +5,7 @@ import com.casic.missiles.modular.dto.DeviceRepairRequest; import com.casic.missiles.modular.model.DeviceRepairLog; import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; import java.util.List; @@ -16,7 +17,7 @@ @Mapper public interface DeviceRepairLogMapper extends BaseMapper { - List getDeviceRepairListPage(Page page, DeviceRepairRequest deviceRepairRequest); + List getDeviceRepairListPage(@Param("page") Page page, @Param("deviceRepairRequest")DeviceRepairRequest deviceRepairRequest); - List getDeviceRepairList(DeviceRepairRequest deviceRepairRequest); + List getDeviceRepairList(@Param("deviceRepairRequest") DeviceRepairRequest deviceRepairRequest); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java index 9035c47..4823ac1 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java @@ -18,7 +18,7 @@ @Mapper public interface FireEquipInfoMapper extends BaseMapper { - List getFireEquipInfoListPage(@Param("page") Page page, FireEquipRequest fireEquipRequest); + List getFireEquipInfoListPage(@Param("page") Page page, @Param("fireEquipRequest") FireEquipRequest fireEquipRequest); FireEquipInfo getFireEquipInfo(@Param("equipCode") String equipCode); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/GateGroupMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/GateGroupMapper.java index d8c330d..977a427 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/GateGroupMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/GateGroupMapper.java @@ -17,7 +17,7 @@ */ @Mapper public interface GateGroupMapper extends BaseMapper { - List getGateGroupListPage(@Param("page") Page page, GateGroupRequest gateGroupRequest); + List getGateGroupListPage(@Param("page") Page page, @Param("gateGroupRequest") GateGroupRequest gateGroupRequest); GateGroup getGateGroupByName(@Param("groupName") String groupName); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/HazardLevelMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/HazardLevelMapper.java index 8957780..dcf47bb 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/HazardLevelMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/HazardLevelMapper.java @@ -17,11 +17,13 @@ @Mapper public interface HazardLevelMapper extends BaseMapper { - List getCaseHazardLevelListPage(@Param("page") Page page, HazardLevelRequest hazardLevelRequest); + List getCaseHazardLevelListPage(@Param("page") Page page, @Param("hazardLevelRequest") HazardLevelRequest hazardLevelRequest); - List getCaseHazardLevelList(HazardLevelRequest hazardLevelRequest); + List getCaseHazardLevelList(@Param("hazardLevelRequest") HazardLevelRequest hazardLevelRequest); CaseHazardLevel getCaseHazardLevel(@Param("hazardLevelCode") String hazardLevelCode); List selectHazardName(); + + String selectHazardNameByCode(@Param("hazardLevelCode") String hazardLevelCode); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/HikCaseDefineMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/HikCaseDefineMapper.java index 0dc47d1..f162fef 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/HikCaseDefineMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/HikCaseDefineMapper.java @@ -12,5 +12,5 @@ */ @Mapper public interface HikCaseDefineMapper extends BaseMapper { - HikCaseDefine getHikCaseDefine(@Param("caseTypeCode") Long caseTypeCode); + HikCaseDefine getHikCaseDefine(@Param("caseTypeCode") Number caseTypeCode); } 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 f8a674c..fe5afc2 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 @@ -17,11 +17,13 @@ @Mapper public interface StaffInfoMapper extends BaseMapper { - List getStaffInfoListPage(@Param("page") Page page, StaffInfoRequest staffInfoRequest); + List getStaffInfoListPage(@Param("page") Page page, @Param("staffInfoRequest") StaffInfoRequest staffInfoRequest); StaffInfo selectByCode(@Param("staffCode") String staffCode); - List getStaffInfoList(StaffInfoRequest staffInfoRequest); + List getStaffInfoList(@Param("staffInfoRequest") StaffInfoRequest staffInfoRequest); - List selectBatchCodes(List list); + List selectBatchCodes(@Param("list") List list); + + int updateByCodeForCard(@Param("staffCode") String staffCode, @Param("cardNo") String cardNo); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitInfoMapper.java index b1217c5..6c52542 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitInfoMapper.java @@ -16,7 +16,7 @@ */ @Mapper public interface VisitInfoMapper extends BaseMapper { - List getVisitInfoListPage(@Param("page") Page page, VisitorRequest visitorRequest); + List getVisitInfoListPage(@Param("page") Page page, @Param("visitorRequest") VisitorRequest visitorRequest); VisitInfo selectByOrderId(@Param("orderId") String orderId); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitorApplyMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitorApplyMapper.java index c09f3c0..6ea55bd 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitorApplyMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitorApplyMapper.java @@ -18,7 +18,7 @@ @Mapper public interface VisitorApplyMapper extends BaseMapper { - List getVisitorApplyListPage(@Param("page") Page page, VisitorApplyRequest visitorApplyRequest); + List getVisitorApplyListPage(@Param("page") Page page, @Param("visitorApplyRequest") VisitorApplyRequest visitorApplyRequest); List selectByVisitReason(); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/AttendanceInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/AttendanceInfoMapper.xml index b2ece71..f8bdd6e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/AttendanceInfoMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/AttendanceInfoMapper.xml @@ -43,7 +43,8 @@ and staff_type = #{staffType} - and YEARWEEK(date_format(atte_date, '%Y-%m-%d'), 1) = YEARWEEK(now(),1); + AND DATE_SUB(CURDATE(), INTERVAL 7 DAY) <= DATE(atte_date) + GROUP BY DATE_FORMAT(atte_date, '%Y-%m-%d') @@ -69,4 +70,20 @@ GROUP BY DATE_FORMAT(atte_date, '%Y-%m') + + + \ No newline at end of file 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 2b6953f..06ec0a8 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 @@ -28,7 +28,9 @@ @@ -87,7 +89,8 @@ SELECT hazard_level_code as levelCode, count(id) as quantity FROM bus_case_info WHERE hazard_level_code is not null - AND DATE_SUB(CURDATE(), INTERVAL 7 DAY) <= date(happen_time); + AND is_key_area = 1 + AND DATE_SUB(CURDATE(), INTERVAL 7 DAY) <= date(happen_time) GROUP BY hazard_level_code @@ -95,7 +98,8 @@ SELECT hazard_level_code as levelCode, count(id) as quantity FROM bus_case_info WHERE hazard_level_code is not null - AND DATE_SUB(CURDATE(), INTERVAL 30 DAY) <= date(happen_time); + AND is_key_area = 1 + AND DATE_SUB(CURDATE(), INTERVAL 30 DAY) <= date(happen_time) GROUP BY hazard_level_code @@ -122,4 +126,71 @@ AND hazard_level_code is not null GROUP BY DATE_FORMAT(happen_time,'%Y-%m-%d') + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/CategoryLevelMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/CategoryLevelMapper.xml index 4670b1f..1d25cbd 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/CategoryLevelMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/CategoryLevelMapper.xml @@ -20,11 +20,11 @@ SELECT * FROM bus_case_category_level WHERE 1=1 - - and code = #{code} + + and code = #{categoryLevelRequest.code} - - and name = #{name} + + and name = #{categoryLevelRequest.name} ORDER by create_time DESC 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 9b66fd8..bfd84b7 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 @@ -98,4 +98,10 @@ #{item} + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceRepairLogMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceRepairLogMapper.xml index 078ed3c..cf1a481 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceRepairLogMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceRepairLogMapper.xml @@ -22,14 +22,14 @@ SELECT * FROM bus_device_repair_log WHERE 1=1 - - and device_code = #{devCode} + + and device_code = #{deviceRepairRequest.devCode} - - and device_name = #{devName} + + and device_name = #{deviceRepairRequest.devName} - - and DATE_FORMAT(create_time,"%y%m%d") = DATE_FORMAT(#{createTime},"%y%m%d") + + and DATE_FORMAT(create_time,"%y%m%d") = DATE_FORMAT(#{deviceRepairRequest.createTime},"%y%m%d") ORDER by create_time DESC diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/HazardLevelMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/HazardLevelMapper.xml index f16f2b9..458322b 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/HazardLevelMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/HazardLevelMapper.xml @@ -20,11 +20,11 @@ SELECT * FROM bus_case_hazard_level WHERE 1=1 - - and code = #{code} + + and code = #{hazardLevelRequest.code} - - and name = #{name} + + and name = #{hazardLevelRequest.name} ORDER by create_time DESC @@ -42,4 +42,10 @@ SELECT name FROM bus_case_hazard_level + + \ 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 557237e..b6a183a 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 @@ -50,4 +50,10 @@ + + + UPDATE bus_staff_info + SET card_no = #{cardNo} + WHERE staff_code = #{staffCode} + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitInfoMapper.xml index 84aa84f..230529a 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitInfoMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitInfoMapper.xml @@ -27,5 +27,6 @@ SELECT * FROM bus_visit_info WHERE order_id = #{orderId} and DATE_FORMAT(in_time,'%Y-%m-%d') = CURRENT_DATE + limit 1 \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/BlackPictureRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/BlackPictureRequest.java new file mode 100644 index 0000000..fc92701 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/BlackPictureRequest.java @@ -0,0 +1,14 @@ +package com.casic.missiles.modular.dto; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/29 19:26 + */ +@Data +public class BlackPictureRequest { + private String picUri; + private String serverIndexCode; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/CancelSubscribeRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/CancelSubscribeRequest.java new file mode 100644 index 0000000..e2d390a --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/CancelSubscribeRequest.java @@ -0,0 +1,15 @@ +package com.casic.missiles.modular.dto.hik; + +import lombok.Data; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/24 15:14 + */ +@Data +public class CancelSubscribeRequest { + private List eventTypes; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/CardInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/CardInfo.java new file mode 100644 index 0000000..341457d --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/CardInfo.java @@ -0,0 +1,24 @@ +package com.casic.missiles.modular.dto.hik; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/26 16:08 + */ +@Data +public class CardInfo { + //卡号,8~20个字符,支持数字和大写字母 + private String cardNo; + //人员ID,员工工号 + private String personId; + //人员所属组织IndexCode + private String orgIndexCode; + //卡片类型,默认是1:IC卡 + //1:IC卡 + //2:CPU卡 + //3:远距离卡 + //4:MIFARE卡 + private Number cardType; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/FaceRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/FaceRequest.java new file mode 100644 index 0000000..edc04bf --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/FaceRequest.java @@ -0,0 +1,16 @@ +package com.casic.missiles.modular.dto.hik; + +import lombok.Data; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/25 16:53 + */ +@Data +public class FaceRequest { + private String certificateNum; + private List indexCodes; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/HikRecvEvent.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/HikRecvEvent.java index a3e9845..1b2b2b1 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/HikRecvEvent.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/HikRecvEvent.java @@ -28,12 +28,12 @@ /** * 事件类型,用于判断所需接收到的事件类型 */ - public Long getEventType(){ + public Number getEventType(){ JSONObject jsonObject = (JSONObject)JSONObject.toJSON(params); //事件类别对应SecurityEventTypeEnum JSONArray eventTypeArray = (JSONArray)jsonObject.get("events"); JSONObject eventJsonObject = (JSONObject)JSONObject.toJSON(eventTypeArray.get(0)); - Long eventType = (Long) eventJsonObject.get("eventType"); + Number eventType = (Number) eventJsonObject.get("eventType"); return eventType; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/BlackListController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/BlackListController.java index a27f9f8..0c06661 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/BlackListController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/BlackListController.java @@ -1,13 +1,18 @@ package com.casic.missiles.modular.controller; +import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.base.controller.ExportController; import com.casic.missiles.core.page.PageFactory; import com.casic.missiles.model.response.ResponseData; import com.casic.missiles.modular.dto.BlackInfoRequest; +import com.casic.missiles.modular.dto.BlackPictureRequest; +import com.casic.missiles.modular.dto.hik.PersonInfoRequest; +import com.casic.missiles.modular.enums.HikUri; import com.casic.missiles.modular.enums.OperateTypeEnum; import com.casic.missiles.modular.model.BlackInfo; import com.casic.missiles.modular.service.BlackInfoService; +import com.casic.missiles.modular.util.HikUtil; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; @@ -56,4 +61,22 @@ return null; } + /** + * 黑名单人员照片 + */ + @PostMapping("/personPicture") + @ResponseBody + public Object personPicture(@RequestBody BlackPictureRequest blackPictureRequest){ + //获取照片 + String picUri = blackPictureRequest.getPicUri(); + String serverIndexCode = blackPictureRequest.getServerIndexCode(); + PersonInfoRequest picRequest = new PersonInfoRequest(); + picRequest.setPicUri(picUri); + picRequest.setServerIndexCode(serverIndexCode); + String reBody = JSONObject.toJSONString(picRequest); + //重定向地址获取 + String url = HikUtil.hikApiFor302(HikUri.PERSON_PICTURE, reBody); + return ResponseData.success(url); + } + } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/DeviceController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/DeviceController.java index e1c4eba..666bbee 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/DeviceController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/DeviceController.java @@ -107,7 +107,7 @@ } /** - * 设备维修管理查询(分页),需计算MTTR=总维修时间/故障次数 + * 设备状态计算与评判/设备维修管理查询(分页),需计算MTTR=总维修时间/故障次数 */ @PostMapping("/repair/listPage") @ResponseBody @@ -211,7 +211,7 @@ //需根据设备编号获取到对应的门禁点唯一标识 doorControlRequest.setDoorIndexCodes(indexCodes); doorControlRequest.setControlType(Integer.valueOf(gateGroupDTO.getStatus())); - String body = JSONObject.toJSONString(deviceCodes); + String body = JSONObject.toJSONString(doorControlRequest); String resultStr = HikUtil.hikApi(HikUri.DOOR_CONTROL, body); JSONObject resultJson = (JSONObject)JSONObject.parse(resultStr); if (!"0".equals(resultJson.get("code"))) { diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/StaffController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/StaffController.java index b58ccab..704093c 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/StaffController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/StaffController.java @@ -2,15 +2,21 @@ import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.util.StrUtil; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.base.controller.ExportController; import com.casic.missiles.core.page.PageFactory; import com.casic.missiles.model.response.ErrorResponseData; import com.casic.missiles.model.response.ResponseData; import com.casic.missiles.modular.dto.StaffInfoRequest; +import com.casic.missiles.modular.dto.hik.PersonInfoRequest; +import com.casic.missiles.modular.dto.hik.StaffCardRequest; +import com.casic.missiles.modular.enums.HikUri; import com.casic.missiles.modular.enums.OperateTypeEnum; import com.casic.missiles.modular.model.StaffInfo; import com.casic.missiles.modular.service.StaffInfoService; +import com.casic.missiles.modular.util.HikUtil; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; @@ -110,4 +116,60 @@ } return ResponseData.success(); } + + /** + * 批量开卡,添加人员之后调用,若在一个接口中添加人员成功开卡失败则第二次添加时会有问题 + */ + @PostMapping("/cardBinding") + @ResponseBody + public Object cardBinding(@RequestBody StaffCardRequest staffCardRequest) { + String body = JSONObject.toJSONString(staffCardRequest); + String resultStr = HikUtil.hikApi(HikUri.CARD_BINDING, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (!"0".equals(resultJson.get("code"))) { + log.error("请求海康,批量开卡失败,海康response:{}", resultStr); + return ResponseData.error("批量开卡失败"); + } + //保存卡号 + if(staffInfoService.saveCardInfo(staffCardRequest) > 0){ + return ResponseData.success(); + } + return ResponseData.error("批量开卡失败"); + } + + /** + * 获取员工照片,海康存储 + */ + @PostMapping("/personPicture/{staffCode}") + @ResponseBody + public Object personPicture(@PathVariable("staffCode") String staffCode){ + //获取员工详细信息,含图片服务器、uri + PersonInfoRequest request = new PersonInfoRequest(); + List list = new ArrayList<>(); + list.add(staffCode); + request.setParamName("personId"); + request.setParamValue(list); + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi(HikUri.PERSON_INFO, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (!"0".equals(resultJson.get("code"))) { + log.error("请求海康,根据人员唯一字段获取人员详细信息失败,海康response:{}", resultStr); + return ResponseData.error("获取员工照片失败"); + } + //获取照片 + JSONObject data = (JSONObject) resultJson.get("data"); + JSONArray dataArray = (JSONArray) data.get("list"); + JSONObject jsonObject = (JSONObject) dataArray.get(0); + JSONArray personPhoto = (JSONArray) jsonObject.get("personPhoto"); + JSONObject photo = (JSONObject) personPhoto.get(0); + String picUri = photo.getString("picUri"); + String serverIndexCode = photo.getString("serverIndexCode"); + PersonInfoRequest picRequest = new PersonInfoRequest(); + picRequest.setPicUri(picUri); + picRequest.setServerIndexCode(serverIndexCode); + String reBody = JSONObject.toJSONString(picRequest); + //重定向地址获取 + String url = HikUtil.hikApiFor302(HikUri.PERSON_PICTURE, reBody); + return ResponseData.success(url); + } } 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 4a07dd9..7b1dcf6 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 @@ -16,6 +16,7 @@ import com.casic.missiles.modular.redis.key.CacheKeys; import com.casic.missiles.modular.service.CockpitService; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.util.CollectionUtils; import org.springframework.web.bind.annotation.*; @@ -24,10 +25,7 @@ import java.text.NumberFormat; import java.time.LocalDateTime; import java.time.temporal.ChronoUnit; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.util.*; import java.util.stream.Collectors; /** @@ -73,6 +71,9 @@ private StatisticNumberMapper numberMapper; @Autowired + private HazardLevelMapper hazardLevelMapper; + + @Autowired private AccessGroupConfig accessGroupConfig; /** @@ -104,8 +105,24 @@ public Object buildingNumberPerHour(){ //当天按小时分组的人数 List list = numberMapper.selectListByTime(); - Map> collect = list.stream().collect(Collectors.groupingBy(BuildingNumberDTO::getStatisticPosition)); - return ResponseData.success(collect); + Map> collect = list.stream().collect(Collectors.groupingBy(BuildingNumberDTO::getStatisticTime)); + //定时任务中已将每小时三栋楼人数存到数据库 + //将一期主楼和录制楼人数合并,二期单算 + List> resultList = new ArrayList<>(); + collect.keySet().forEach(key -> { + List buildingNumberDTOS = collect.get(key); + BuildingNumberDTO mainBuildingOne = buildingNumberDTOS.get(0); + BuildingNumberDTO mainBuildingTwo = buildingNumberDTOS.get(1); + BuildingNumberDTO recordingBuilding = buildingNumberDTOS.get(2); + HashMap resultMap = new HashMap<>(); + Integer oneQuantity = Integer.valueOf(mainBuildingOne.getStatisticQuantity()); + Integer recordingQuantity = Integer.valueOf(recordingBuilding.getStatisticQuantity()); + resultMap.put("staticTime", mainBuildingOne.getStatisticTime()); + resultMap.put(mainBuildingOne.getStatisticPositionName()+"、"+recordingBuilding.getStatisticPositionName(), String.valueOf(oneQuantity+recordingQuantity)); + resultMap.put(mainBuildingTwo.getStatisticPositionName(), mainBuildingTwo.getStatisticQuantity()); + resultList.add(resultMap); + }); + return ResponseData.success(resultList); } /** @@ -151,12 +168,11 @@ public Object securityNumber() { QueryWrapper wrapper = new QueryWrapper<>(); wrapper.eq("staff_type", 2); + // TODO: 2022/9/2 后续使用产品确定的每天出勤的安保人员的数量 Integer total = staffInfoMapper.selectCount(wrapper); - //当日离岗事件个数 - QueryWrapper wrapper1 = new QueryWrapper<>(); - wrapper1.eq("hik_event_type", SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); - wrapper1.apply("date_format(now(),'%Y-%m-%d') = date_format(happen_time,'%Y-%m-%d')"); - Integer leave = caseInfoMapper.selectCount(wrapper1); + //当日离岗事件按设备去重后的个数 + // TODO: 2022/9/2 目前相当于24小时内的计算,之后看需要可改成自定义小时数计算离岗率,即离岗+6小时内仅一次离岗则恢复为100%,多次则累加离岗次数计算离岗率 + Integer leave = caseInfoMapper.selectDemobilizedCount(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); NumberFormat numberFormat = NumberFormat.getInstance(); // 设置精确到小数点后2位 numberFormat.setMaximumFractionDigits(2); @@ -179,7 +195,6 @@ @ResponseBody public Object visitorApplyDetail() { List reasonGroup = applyMapper.selectByVisitReason(); - HashMap resultMap = new HashMap<>(); NumberFormat numberFormat = NumberFormat.getInstance(); // 设置精确到小数点后2位 numberFormat.setMaximumFractionDigits(2); @@ -187,12 +202,17 @@ if(0 == sum){ return ResponseData.success(); } + List resultList = new ArrayList<>(); reasonGroup.forEach(group -> { String reasonName = dictService.getDictNameByCode(SecurityEventDict.VISIT_REASON, group.getVisitReason()); String result = numberFormat.format((float) group.getQuantity() / (float) sum * 100); - resultMap.put(reasonName, result+"%"); + ApplyReasonGroupDTO applyReasonGroupDTO = new ApplyReasonGroupDTO(); + applyReasonGroupDTO.setQuantity(group.getQuantity()); + applyReasonGroupDTO.setVisitReason(reasonName); + applyReasonGroupDTO.setRatio(result+"%"); + resultList.add(applyReasonGroupDTO); }); - return ResponseData.success(resultMap); + return ResponseData.success(resultList); } /** @@ -247,6 +267,32 @@ } /** + * 机动力量实时在岗率,在岗人数除以总应在岗人数,用离岗+6小时内恢复为100%,6小时外再计算 + */ + @GetMapping("/staff/beOnDutyRatio") + @ResponseBody + public Object beOnDutyRatio() { + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("staff_type", 2); + // TODO: 2022/9/2 后续使用产品确定的每天出勤的安保人员的数量 + Integer total = staffInfoMapper.selectCount(wrapper); + if(0 == total){ + return ResponseData.success(null); + } + //当日离岗事件按设备去重后的个数 + // TODO: 2022/9/2 目前相当于24小时内的计算,之后看需要可改成自定义小时数计算离岗率,即离岗+6小时内仅一次离岗则恢复为100%,多次则累加离岗次数计算离岗率 + List onDutyRatioDTOS = caseInfoMapper.selectDemobilizedCountByHour(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); + onDutyRatioDTOS.forEach(dto -> { + NumberFormat numberFormat = NumberFormat.getInstance(); + // 设置精确到小数点后2位 + numberFormat.setMaximumFractionDigits(2); + String result = numberFormat.format(100 - Float.valueOf(dto.getQuantity()) / (float) total * 100); + dto.setRatio(result+"%"); + }); + return ResponseData.success(onDutyRatioDTOS); + } + + /** * 闸机速通门统计-设备状态分组计算数量,devType传闸机字典key * 视频频监控摄像机统计-设备状态分组计算数量,devType传摄像头字典key */ @@ -262,12 +308,17 @@ if(sum <= 0){ return ResponseData.error("无该类设备信息"); } + List resultList = new ArrayList<>(); gateStatusGroup.forEach(group -> { String devStatus = dictService.getDictNameByCode(SecurityEventDict.DEVICE_STATUS, group.getStatus()); String result = numberFormat.format((float) group.getQuantity() / (float) sum * 100); - resultMap.put(devStatus, result+"%"); + GateStatusGroupResponse gateStatusGroupResponse = new GateStatusGroupResponse(); + gateStatusGroupResponse.setStatus(devStatus); + gateStatusGroupResponse.setRatio(result+"%"); + resultList.add(gateStatusGroupResponse); }); - resultMap.put("总", sum); + resultMap.put("total", sum); + resultMap.put("list", resultList); return ResponseData.success(resultMap); } @@ -282,17 +333,38 @@ String position = securityScoreDTO.getPosition(); List caseInfos = caseInfoMapper.selectByPosition(position); //查询各危险级别权重、各类别权重,放入map,避免循环中多次查数据库 - + HashMap hazardScoreMap = new HashMap<>(); + List caseHazardLevelList = hazardLevelMapper.getCaseHazardLevelList(null); + caseHazardLevelList.forEach(hazardLevel -> { + hazardScoreMap.put(hazardLevel.getCode(), hazardLevel.getWeight()); + }); + HashMap categoryScoreMap = new HashMap<>(); + List categoryLevelList = categoryLevelMapper.getCaseCategoryLevelList(null); + categoryLevelList.forEach(categoryLevel -> { + categoryScoreMap.put(categoryLevel.getCode(), categoryLevel.getWeight()); + }); + //事件按楼层分组,计算 List securityScoreDTOs = new ArrayList<>(); caseInfos.forEach(caseInfo -> { SecurityScoreDTO securityScoreDTO1 = new SecurityScoreDTO(); + securityScoreDTO1.setPosition(caseInfo.getPosition()); securityScoreDTO1.setArea(caseInfo.getArea()); - // TODO: 2022/8/4 楼层评分计算根据产品定义调整 -// caseInfo.get -// securityScoreDTO1.setScore(); + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); + Double score = 100 - Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + securityScoreDTO1.setScore(score); + securityScoreDTOs.add(securityScoreDTO1); }); - - return null; + 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); + }); + return ResponseData.success(securityScoreDTOs); } /** @@ -303,9 +375,13 @@ public Object SecurityFrequency(@RequestBody SecurityFrequencyDTO securityFrequencyDTO) { String year = securityFrequencyDTO.getYear(); String month = securityFrequencyDTO.getMonth(); - Integer quantity = caseInfoMapper.selectCountByMonth(year, month); - securityFrequencyDTO.setQuantity(quantity); - return ResponseData.success(securityFrequencyDTO); + if(!StringUtils.isEmpty(year) && StringUtils.isEmpty(month)){ + Integer quantity = caseInfoMapper.selectCountByMonth(year, month); + securityFrequencyDTO.setQuantity(quantity); + return ResponseData.success(securityFrequencyDTO); + } + List list = caseInfoMapper.selectPreMonthCount(); + return ResponseData.success(list); } } 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 ae4d770..f4f075c 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 @@ -1,20 +1,25 @@ package com.casic.missiles.modular.controller.cockpit; +import cn.hutool.core.date.DateUnit; import cn.hutool.core.date.DateUtil; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.casic.missiles.model.response.ResponseData; -import com.casic.missiles.modular.dao.AttendanceInfoMapper; -import com.casic.missiles.modular.dao.CaseInfoMapper; -import com.casic.missiles.modular.dao.HazardLevelMapper; -import com.casic.missiles.modular.dao.StaffInfoMapper; +import com.casic.missiles.modular.dao.*; +import com.casic.missiles.modular.dto.DeviceRepairLogDTO; +import com.casic.missiles.modular.dto.DeviceRepairRequest; import com.casic.missiles.modular.dto.statistics.*; +import com.casic.missiles.modular.enums.SecurityEventType; +import com.casic.missiles.modular.model.CaseCategoryLevel; import com.casic.missiles.modular.model.CaseHazardLevel; +import com.casic.missiles.modular.model.CaseInfo; import com.casic.missiles.modular.model.StaffInfo; +import com.casic.missiles.modular.service.DeviceInfoService; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.util.CollectionUtils; import org.springframework.web.bind.annotation.*; +import java.math.BigDecimal; import java.text.NumberFormat; import java.util.*; import java.util.stream.Collectors; @@ -40,6 +45,12 @@ @Autowired private HazardLevelMapper hazardLevelMapper; + @Autowired + private CategoryLevelMapper categoryLevelMapper; + + @Autowired + private DeviceInfoService deviceInfoService; + /** * 安防事件时域频次统计,每月的每天安防事件个数(原方案) * 月维度:展示每个月的每天的数据 @@ -89,15 +100,17 @@ List monthList = caseInfoMapper.selectPreMonthCountByYear(year); Map> collect = monthList.stream().collect(Collectors.groupingBy(PreMonthOrWeekCaseDTO::getHazardLevelCode)); HashMap strAvgMap = new HashMap<>(); + List resultList = new ArrayList<>(); for (String key : collect.keySet()) { List preMonthOrWeekCaseDTOS = collect.get(key); int sum = preMonthOrWeekCaseDTOS.stream().mapToInt(PreMonthOrWeekCaseDTO::getQuantity).sum(); //若年份是本年,则使用个安防级别数量/当前月份数 //若不是本年,除数为12 MonthAndWeekDTO monthAndWeekDTO = new MonthAndWeekDTO(); + String hazardName = hazardLevelMapper.selectHazardNameByCode(key); + monthAndWeekDTO.setLevelName(hazardName); if(year.equals(String.valueOf(DateUtil.thisYear()))){ monthAndWeekDTO.setMonthQuantity(sum / DateUtil.thisMonth()); -// monthAndWeekDTO.setLevelName(); strAvgMap.put(key, monthAndWeekDTO); }else{ monthAndWeekDTO.setMonthQuantity(sum / 12); @@ -113,27 +126,37 @@ if(year.equals(String.valueOf(DateUtil.thisYear()))){ if(!Objects.isNull(strAvgMap.get(key))){ MonthAndWeekDTO monthAndWeekDTO = strAvgMap.get(key); + String hazardName = hazardLevelMapper.selectHazardNameByCode(key); + monthAndWeekDTO.setLevelName(hazardName); monthAndWeekDTO.setWeekQuantity(sum / DateUtil.thisWeekOfYear()); strAvgMap.put(key, monthAndWeekDTO); }else{ MonthAndWeekDTO monthAndWeekDTO = new MonthAndWeekDTO(); + String hazardName = hazardLevelMapper.selectHazardNameByCode(key); + monthAndWeekDTO.setLevelName(hazardName); monthAndWeekDTO.setWeekQuantity(sum / DateUtil.thisWeekOfYear()); strAvgMap.put(key, monthAndWeekDTO); } }else{ if(!Objects.isNull(strAvgMap.get(key))){ MonthAndWeekDTO monthAndWeekDTO = strAvgMap.get(key); + String hazardName = hazardLevelMapper.selectHazardNameByCode(key); + monthAndWeekDTO.setLevelName(hazardName); monthAndWeekDTO.setWeekQuantity(sum / 52); strAvgMap.put(key, monthAndWeekDTO); }else{ MonthAndWeekDTO monthAndWeekDTO = new MonthAndWeekDTO(); + String hazardName = hazardLevelMapper.selectHazardNameByCode(key); + monthAndWeekDTO.setLevelName(hazardName); monthAndWeekDTO.setWeekQuantity(sum / 52); strAvgMap.put(key, monthAndWeekDTO); } } } - avgMonthAndWeekGroupDTO.setMap(strAvgMap); - return ResponseData.success(avgMonthAndWeekGroupDTO); + strAvgMap.keySet().forEach(key -> { + resultList.add(strAvgMap.get(key)); + }); + return ResponseData.success(resultList); } /** @@ -181,12 +204,178 @@ } /** - * 员工考勤人数变化,功能待定 + * 员工考勤人数变化,统计当天(横坐标为时)及近7天(横坐标为天)的考勤人数变化,只要发生一次考勤识别,次数的基数就正常增加(没有上班下班区分) */ + @PostMapping("/staff/attendanceNumber/{dimension}") + @ResponseBody + public Object attendanceNumber(@PathVariable("dimension") String dimension) { + List attendanceNumberDTOs = null; + List> resultList = new ArrayList<>(); + if("week".equals(dimension)){ + //近7天数据按天分组统计 + attendanceNumberDTOs = attendanceInfoMapper.getCountForWeek(); + }else if("day".equals(dimension)) { + //今天数据按小时分组统计 + attendanceNumberDTOs = attendanceInfoMapper.getCountForDay(); + } + if(CollectionUtils.isEmpty(attendanceNumberDTOs)){ + return ResponseData.error("该查询条件下,无员工出勤数据!"); + } + Map> collect = attendanceNumberDTOs.stream().collect(Collectors.groupingBy(AttendanceNumberDTO::getDate)); + collect.keySet().forEach(key -> { + List attendanceNumberDTOS = collect.get(key); + AttendanceNumberDTO attendanceNumberDTO = attendanceNumberDTOS.get(0); + AttendanceNumberDTO attendanceNumberDTO2 = attendanceNumberDTOS.get(1); + Map resultMap = new HashMap<>(); + resultMap.put(attendanceNumberDTO.getStaffType(), attendanceNumberDTO.getQuantity()); + resultMap.put(attendanceNumberDTO2.getStaffType(), attendanceNumberDTO2.getQuantity()); + resultMap.put("staticTime", attendanceNumberDTO.getDate()); + resultList.add(resultMap); + }); + return ResponseData.success(resultList); + } /** - * 近30天/近一周安保人员到岗排行 + * 早晚高峰区域安防评估 */ + @PostMapping("/security/assessment/{dimension}") + @ResponseBody + public Object securityAssessment(@PathVariable("dimension") String dimension) { + //查询各危险级别权重、各类别权重,放入map,避免循环中多次查数据库 + HashMap hazardScoreMap = new HashMap<>(); + List caseHazardLevelList = hazardLevelMapper.getCaseHazardLevelList(null); + caseHazardLevelList.forEach(hazardLevel -> { + hazardScoreMap.put(hazardLevel.getCode(), hazardLevel.getWeight()); + }); + HashMap categoryScoreMap = new HashMap<>(); + List categoryLevelList = categoryLevelMapper.getCaseCategoryLevelList(null); + categoryLevelList.forEach(categoryLevel -> { + categoryScoreMap.put(categoryLevel.getCode(), categoryLevel.getWeight()); + }); + HashMap hashMap = new HashMap<>(); + if("week".equals(dimension)){ + //近7天早晚高峰数据 + List caseInfos = caseInfoMapper.selectListBySevenDay(); + //按时间(天)进行分组 + caseInfos.forEach(caseInfo -> { + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); + Double score = Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + String[] array = caseInfo.getHappenTime().split(" "); + String dayTime = array[0]; + BigDecimal preScore; + if(hashMap.containsKey(dayTime)){ + Double aDouble = hashMap.get(dayTime); + preScore = new BigDecimal(aDouble.toString()); + + }else{ + preScore = new BigDecimal("100.0"); + } + BigDecimal nowScore = new BigDecimal(score.toString()); + hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); + }); + return ResponseData.success(hashMap); + }else if("day".equals(dimension)) { + //今天数据按小时分组统计 + List caseInfos = caseInfoMapper.selectListByToday(); + caseInfos.forEach(caseInfo -> { + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); + Double score = Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + String[] array = caseInfo.getHappenTime().split(":"); + String dayTime = array[0]; + BigDecimal preScore; + if(hashMap.containsKey(dayTime)){ + Double aDouble = hashMap.get(dayTime); + preScore = new BigDecimal(aDouble.toString()); + + }else{ + preScore = new BigDecimal("100.0"); + } + BigDecimal nowScore = new BigDecimal(score.toString()); + hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); + }); + return ResponseData.success(hashMap); + } + return null; + } + + /** + * 重点区域安防事态评估,统计重点区域6:00-23:00按小时分组数据 + */ + @GetMapping("/security/keyAreaStatistic") + @ResponseBody + public Object keyAreaStatistic() { + //查询各危险级别权重、各类别权重,放入map,避免循环中多次查数据库 + HashMap hazardScoreMap = new HashMap<>(); + List caseHazardLevelList = hazardLevelMapper.getCaseHazardLevelList(null); + caseHazardLevelList.forEach(hazardLevel -> { + hazardScoreMap.put(hazardLevel.getCode(), hazardLevel.getWeight()); + }); + HashMap categoryScoreMap = new HashMap<>(); + List categoryLevelList = categoryLevelMapper.getCaseCategoryLevelList(null); + categoryLevelList.forEach(categoryLevel -> { + categoryScoreMap.put(categoryLevel.getCode(), categoryLevel.getWeight()); + }); + HashMap hashMap = new HashMap<>(); + //今天数据按小时分组统计 + List caseInfos = caseInfoMapper.selectListByToday2(); + caseInfos.forEach(caseInfo -> { + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); + Double score = Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + String[] array = caseInfo.getHappenTime().split(":"); + String dayTime = array[0]; + BigDecimal preScore; + if(hashMap.containsKey(dayTime)){ + Double aDouble = hashMap.get(dayTime); + preScore = new BigDecimal(aDouble.toString()); + + }else{ + preScore = new BigDecimal("100.0"); + } + BigDecimal nowScore = new BigDecimal(score.toString()); + hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); + }); + return ResponseData.success(hashMap); + } + + /** + * 安防机动支援力量调配响应评估,根据事件已解决状态及已解决时间-发送时间,按时间(小时)分组统计 + */ + @GetMapping("/security/responseAssess") + @ResponseBody + public Object responseAssess() { + //查询各危险级别权重、各类别权重,放入map,避免循环中多次查数据库 + HashMap hazardScoreMap = new HashMap<>(); + List caseHazardLevelList = hazardLevelMapper.getCaseHazardLevelList(null); + caseHazardLevelList.forEach(hazardLevel -> { + hazardScoreMap.put(hazardLevel.getCode(), hazardLevel.getWeight()); + }); + HashMap hashMap = new HashMap<>(); + //今天数据按小时分组统计 + List caseInfos = caseInfoMapper.selectListByToday3(); + caseInfos.forEach(caseInfo -> { + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + //扣分=事件级别权重*未解决小时数 + Date updateTime = DateUtil.parse(caseInfo.getUpdateTime()); + Date happenTime = DateUtil.parse(caseInfo.getHappenTime()); + long between = DateUtil.between(updateTime, happenTime, DateUnit.HOUR); + Double score = Double.valueOf(hazardWeight)*between; + String[] array = caseInfo.getHappenTime().split(":"); + String dayTime = array[0]; + BigDecimal preScore; + if(hashMap.containsKey(dayTime)){ + Double aDouble = hashMap.get(dayTime); + preScore = new BigDecimal(aDouble.toString()); + }else{ + preScore = new BigDecimal("100.0"); + } + BigDecimal nowScore = new BigDecimal(score.toString()); + hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); + }); + return ResponseData.success(hashMap); + } /** * 重点区域威胁事件类型统计,优先级2,统计近7天和近30天 @@ -224,7 +413,34 @@ } /** - * 设备状态计算系数和评判,优先级3,需确认设备恢复时间是否可以获取 + * 近30天/近一周安保人员到岗排行 */ + + /** + * 安保等级评估,发生离岗事件减1分 + */ + @GetMapping("/security/levelAssess") + @ResponseBody + public Object securityLevelAssess() { + //今天数据按小时分组统计 + List resultList = caseInfoMapper.selectListByType(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); + resultList.forEach(result -> { + BigDecimal deScore = new BigDecimal(result.getQuantity()); + BigDecimal preScore = new BigDecimal("100.0"); + result.setScore(preScore.subtract(deScore).doubleValue()); + }); + return ResponseData.success(resultList); + } + + /** + * 设备状态计算系数和评判,即设备维修管理查询(不分页) + */ + @PostMapping("/device/repairList") + @ResponseBody + public Object repairList(@RequestBody DeviceRepairRequest deviceRepairRequest) { + List deviceRepairLogDTOS = deviceInfoService.deviceRepairListPage(deviceRepairRequest); + return ResponseData.success(deviceRepairLogDTOS); + } + } 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 fbf8ab6..c71a15a 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 @@ -1,13 +1,12 @@ package com.casic.missiles.modular.controller.hik; +import cn.hutool.core.date.DateTime; +import cn.hutool.core.date.DateUtil; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.casic.missiles.model.response.ResponseData; import com.casic.missiles.modular.dao.HikFaceGroupInfoMapper; -import com.casic.missiles.modular.dto.hik.EventSubscribeRequest; -import com.casic.missiles.modular.dto.hik.FaceGroupAdditionRequest; -import com.casic.missiles.modular.dto.hik.HikRecvEvent; -import com.casic.missiles.modular.dto.hik.OrgBatchAdd; +import com.casic.missiles.modular.dto.hik.*; import com.casic.missiles.modular.enums.HikUri; import com.casic.missiles.modular.enums.SecurityEventType; import com.casic.missiles.modular.model.CaseInfo; @@ -18,16 +17,20 @@ import com.casic.missiles.modular.util.CaseInfoFactoryUtil; import com.casic.missiles.modular.util.HikUtil; import com.casic.missiles.modular.util.ThreadPoolUtil; +import com.casic.missiles.modular.util.WebSocket; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; -import org.springframework.web.bind.annotation.*; +import org.springframework.util.CollectionUtils; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.RestController; -import java.net.InetAddress; -import java.net.UnknownHostException; import java.util.ArrayList; +import java.util.Iterator; import java.util.List; import java.util.Objects; @@ -38,7 +41,6 @@ */ @Slf4j @RestController -@RequestMapping("/hik") public class HikController { @Autowired @@ -53,28 +55,37 @@ @Autowired private HikService hikService; + @Autowired + private HikFaceGroupInfoMapper hikFaceGroupInfoMapper; + + @Autowired + private WebSocket webSocket; + @Value("${server.port}") private int serverPort; - @Autowired - private HikFaceGroupInfoMapper hikFaceGroupInfoMapper; /** * 海康事件订阅 */ - @PostMapping("/event/subscribe") + @PostMapping("/hik/event/subscribe") @ResponseBody - public Object eventSubscribe() throws UnknownHostException { + public Object eventSubscribe() { EventSubscribeRequest eventSubscribeRequest = new EventSubscribeRequest(); ArrayList list = new ArrayList<>(); list.add(SecurityEventType.DEVICE_OFFLINE); + list.add(SecurityEventType.DEVICE_ONLINE); list.add(SecurityEventType.KEY_PERSONNEL_IDENTIFY_EVENT); list.add(SecurityEventType.MONITORING_POINT_OFFLINE); + list.add(SecurityEventType.MONITORING_POINT_ONLINE); list.add(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); list.add(SecurityEventType.PERSONNEL_GATHER_EVENT); - InetAddress localHost = InetAddress.getLocalHost(); + list.add(SecurityEventType.VISITOR_REGISTER); + list.add(SecurityEventType.VISITOR_CHECKOUT); + list.add(SecurityEventType.HIGH_ALTITUDE_PARABOLIC); +// InetAddress localHost = InetAddress.getLocalHost(); eventSubscribeRequest.setEventTypes(list); - eventSubscribeRequest.setEventDest("https://" + localHost + ":" + serverPort + "/eventRcv"); + eventSubscribeRequest.setEventDest("http://" + "192.168.10.6" + ":" + serverPort + "/eventRcv"); //订阅类型,0-订阅原始事件,1-联动事件,2-原始事件和联动事件,不填使用默认值0 eventSubscribeRequest.setSubType(0); /** @@ -92,19 +103,25 @@ } /** + * 查询事件订阅信息 + */ + @PostMapping("/hik/event/query") + @ResponseBody + public Object eventQuery() { + String result = HikUtil.hikApi(HikUri.EVENT_INFO, ""); + return result; + } + + /** * 海康事件接收 */ @PostMapping("/eventRcv") @ResponseBody public Object eventRcv(@RequestBody HikRecvEvent hikRecvEvent) { //1、接收所需事件类型 - Long eventType = hikRecvEvent.getEventType(); + Number eventType = hikRecvEvent.getEventType(); log.info("接收到安防事件类型为:{}", eventType); CaseInfo caseInfo = caseInfoFactoryUtil.getCaseInfo(eventType); - //接收到不关心事件直接返回 - if(Objects.isNull(caseInfo)){ - return ResponseData.success(); - } //2、不同事件不同处理,caseInfoFactoryUtil已设置好事件基础定义信息 // 再为事件添加状态、设备编码、设备名称、位置、区域、时间 // 异步处理事件 @@ -114,19 +131,23 @@ caseHandle(hikRecvEvent, eventType, caseInfo); } })); +// caseHandle(hikRecvEvent, eventType, caseInfo); - return null; + return ResponseData.success(); } - private void caseHandle(HikRecvEvent hikRecvEvent, Long eventType, CaseInfo caseInfo) { + private void caseHandle(HikRecvEvent hikRecvEvent, Number eventType, CaseInfo caseInfo) { JSONArray eventArray = hikRecvEvent.getEventArray(); List caseInfos = new ArrayList<>(); - while (eventArray.stream().iterator().hasNext()) { + Iterator iterator = eventArray.iterator(); + while (iterator.hasNext()) { CaseInfo caseInfo1 = new CaseInfo(); - BeanUtils.copyProperties(caseInfo, caseInfo1); - JSONObject event = (JSONObject) eventArray.stream().iterator().next(); + if(!Objects.isNull(caseInfo)){ + BeanUtils.copyProperties(caseInfo, caseInfo1); + } + JSONObject event = (JSONObject) iterator.next(); //5种事件进行不同处理 - if(SecurityEventType.KEY_PERSONNEL_IDENTIFY_EVENT == eventType){ + if (SecurityEventType.KEY_PERSONNEL_IDENTIFY_EVENT.equals(eventType)) { //判断所属人脸分组 JSONObject data = (JSONObject) event.get("data"); JSONObject faceRecognitionResult = (JSONObject) data.get("faceRecognitionResult"); @@ -142,52 +163,101 @@ if (faceGroupCode.equals(blackListGroup.getFaceGroupCode())) { //黑名单分组处理 caseInfo1 = hikService.blackListHandle(event, caseInfo1); - }else if(faceGroupCode.equals(propertyPersonnelGroup.getFaceGroupCode())){ + } else if (faceGroupCode.equals(propertyPersonnelGroup.getFaceGroupCode())) { //考勤分组处理-物业人员,添加到考勤表 hikService.propertyAttendanceHandle(event); - }else if(faceGroupCode.equals(securityPersonnelGroup.getFaceGroupCode())){ + } else if (faceGroupCode.equals(securityPersonnelGroup.getFaceGroupCode())) { //考勤分组处理-安保人员,添加到考勤表 hikService.securityPersonnelHandle(event); - }else { + } else { return; } - }else if(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT == eventType){ + } else if (SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT.equals(eventType)) { //离岗事件处理 caseInfo1 = hikService.demobilizedHandle(event, caseInfo1); - }else if(SecurityEventType.PERSONNEL_GATHER_EVENT == eventType){ + } else if (SecurityEventType.PERSONNEL_GATHER_EVENT.equals(eventType)) { //人员聚集事件处理 caseInfo1 = hikService.personGatherHandle(event, caseInfo1); - }else if(SecurityEventType.MONITORING_POINT_OFFLINE == eventType){ + } else if (SecurityEventType.MONITORING_POINT_OFFLINE.equals(eventType)) { //监控点离线事件处理 caseInfo1 = hikService.monitorPointOfflineHandle(event, caseInfo1); - }else if(SecurityEventType.DEVICE_OFFLINE == eventType){ + } else if (SecurityEventType.MONITORING_POINT_ONLINE.equals(eventType)) { + //监控点上线事件处理 + hikService.monitorPointOnlineHandle(event); + } else if (SecurityEventType.DEVICE_OFFLINE.equals(eventType)) { //装置离线事件处理 caseInfo1 = hikService.deviceOfflineHandle(event, caseInfo1); - }else if(SecurityEventType.VISITOR_REGISTER == eventType){ + } else if (SecurityEventType.DEVICE_ONLINE.equals(eventType)) { + //装置上线处理 + hikService.deviceOnlineHandle(event); + } else if (SecurityEventType.VISITOR_REGISTER.equals(eventType)) { //记录访客登记记录,添加到访客记录表 hikService.visitorRegisterHandler(event); - }else if(SecurityEventType.VISITOR_CHECKOUT == eventType){ + } else if (SecurityEventType.VISITOR_CHECKOUT.equals(eventType)) { //记录访客签离记录 hikService.visitorCheckOutHandler(event); } - if(!Objects.isNull(caseInfo1) && !StringUtils.isEmpty(caseInfo1.getHappenTime())){ + if (!Objects.isNull(caseInfo1) && !StringUtils.isEmpty(caseInfo1.getHappenTime())) { caseInfos.add(caseInfo1); } } //3、安防事件入库 - if(!caseInfoService.insertCaseInfoBatch(caseInfos)){ - log.error("安防事件批量入库异常"); + if (!CollectionUtils.isEmpty(caseInfos) && !caseInfoService.insertCaseInfoBatch(caseInfos)) { + log.error("安防事件批量入库异常!"); } // TODO: 2022/8/15 webSocket推送 + if (CollectionUtils.isEmpty(caseInfos)) { + log.info("webSocket事件推送"); + webSocket.sendAllMessage(JSONObject.toJSONString(caseInfos)); + } return; } /** + * 以图搜图,前端用于轨迹追踪 + */ + @PostMapping("/hik/search/picture") + @ResponseBody + public Object searchPictures(@RequestBody SearchPicturesRequest searchPicturesRequest) { + DateTime startDateTime = DateUtil.parse(searchPicturesRequest.getStartTime()); + DateTime endDateTime = DateUtil.parse(searchPicturesRequest.getEndTime()); + String startTime = DateUtil.format(startDateTime, "yyyy-MM-dd'T'HH:mm:ss.SSSXXX"); + String endTime = DateUtil.format(endDateTime, "yyyy-MM-dd'T'HH:mm:ss.SSSXXX"); + searchPicturesRequest.setStartTime(startTime); + searchPicturesRequest.setEndTime(endTime); + String body = JSONObject.toJSONString(searchPicturesRequest); + String resultStr = HikUtil.hikApi(HikUri.SEARCH_PICTURES, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (!"0".equals(resultJson.get("code"))) { + log.error("请求海康,以图搜图失败,海康response:{}", resultStr); + return ResponseData.error("以图搜图失败"); + } + return ResponseData.success(resultJson); + } + + + /** + * 海康事件取消订阅 + */ + @PostMapping("/hik/event/cancel") + @ResponseBody + public Object eventCancelSubscribe(@RequestBody CancelSubscribeRequest cancelSubscribeRequest) { + String body = JSONObject.toJSONString(cancelSubscribeRequest); + String resultStr = HikUtil.hikApi(HikUri.EVENT_CANCEL, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (!"0".equals(resultJson.get("code"))) { + log.error("请求海康,取消订阅失败,海康response:{}", resultStr); + return ResponseData.error("取消订阅失败"); + } + return ResponseData.success(resultJson); + } + + /** * 单个添加海康人脸分组 * api->hik单个添加人脸分组api->response->mysql */ - @PostMapping("/faceGroup/single/add") + @PostMapping("/hik/faceGroup/single/add") @ResponseBody public Object faceGroupAddition(@RequestBody FaceGroupAdditionRequest faceGroupAdditionRequest) { String body = JSONObject.toJSONString(faceGroupAdditionRequest); @@ -212,7 +282,7 @@ * 批量添加海康组织 * api->hik批量添加组织api->response */ - @PostMapping("/org/batch/add") + @PostMapping("/hik/org/batch/add") @ResponseBody public Object orgBatchAdd(@RequestBody List orgBatchAddRequest) { String body = JSONObject.toJSONString(orgBatchAddRequest); @@ -232,4 +302,62 @@ return ResponseData.error("批量添加组织失败"); } + /** + * 获取人员列表 + */ + @PostMapping("/hik/person/personList") + @ResponseBody + public Object personList() { + PersonListRequest request = new PersonListRequest(); + request.setPageNo(1); + request.setPageSize(100); + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi("/api/resource/v2/person/personList", body); + return resultStr; + } + + /** + * 获取组织列表 + */ + @PostMapping("/hik/org/orgList") + @ResponseBody + public Object orgList() { + PersonListRequest request = new PersonListRequest(); + request.setPageNo(1); + request.setPageSize(100); + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi("/api/resource/v1/org/orgList", body); + return resultStr; + } + + /** + * 查询访客权限下载记录 + */ + @PostMapping("/hik/auth/result") + @ResponseBody + public Object authResult() { + PersonListRequest request = new PersonListRequest(); + request.setPageNo(1); + request.setPageSize(100); + request.setOrderId("ba101db6246711edaea66f7939a13638"); + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi("/api/visitor/v1/auth/result", body); + return resultStr; + } + + /** + * 人脸图片获取 + */ + @PostMapping("/hik/face/picture") + @ResponseBody + public Object facePicture() { + FaceRequest request = new FaceRequest(); +// List list = new ArrayList<>(); +// list.add(""); + request.setCertificateNum("wanggong"); + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi("/api/frs/v1/face", body); + return resultStr; + } + } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/AssetInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/AssetInfoMapper.java index 4f64e83..c0684ee 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/AssetInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/AssetInfoMapper.java @@ -17,6 +17,6 @@ @Mapper public interface AssetInfoMapper extends BaseMapper { - List getAssetInfoListPage(@Param("page") Page page, AssetInfoRequest assetInfoRequest); + List getAssetInfoListPage(@Param("page") Page page, @Param("assetInfoRequest") AssetInfoRequest assetInfoRequest); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/AttendanceInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/AttendanceInfoMapper.java index f9e793e..ec87e46 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/AttendanceInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/AttendanceInfoMapper.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.statistics.AttendanceNumberDTO; import com.casic.missiles.modular.dto.statistics.AttendanceRatioDTO; import com.casic.missiles.modular.model.AttendanceInfo; import org.apache.ibatis.annotations.Mapper; @@ -17,7 +18,7 @@ */ @Mapper public interface AttendanceInfoMapper extends BaseMapper { - List getAttendanceInfoListPage(@Param("page") Page page, StaffInfoRequest attendanceInfoRequest); + List getAttendanceInfoListPage(@Param("page") Page page, @Param("attendanceInfoRequest") StaffInfoRequest attendanceInfoRequest); AttendanceInfo selectByCodeAndDate(@Param("staffCode") String staffCode); @@ -26,4 +27,8 @@ List getCountByTypeAndDateForMonth(@Param("staffType")String staffType); List getCountByTypeAndDateForYear(@Param("staffType")String staffType); + + List getCountForWeek(); + + List getCountForDay(); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java index ce94b8f..6137a7d 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java @@ -17,5 +17,5 @@ @Mapper public interface BlackInfoMapper extends BaseMapper { - List getBlackInfoListPage(@Param("page") Page page, BlackInfoRequest blackInfoRequest); + List getBlackInfoListPage(@Param("page") Page page, @Param("blackInfoRequest") BlackInfoRequest blackInfoRequest); } 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 efda6b3..50aaa6f 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 @@ -20,7 +20,7 @@ List getCaseInfoListPage(@Param("page") Page page, @Param("caseInfoRequest") CaseInfoRequest caseInfoRequest); - int updateStatusById(CaseInfoRequest caseInfoRequest); + int updateStatusById(@Param("caseInfoRequest") CaseInfoRequest caseInfoRequest); List selectByLevelAndMonth(@Param("year") String year); @@ -47,4 +47,20 @@ List selectPreWeekCountByThirtyDay(); List selectPreDayCountBySevenDay(); + + Integer selectDemobilizedCount(@Param("eventType") Number personnelDemobilizedEvent); + + List selectPreMonthCount(); + + List selectListBySevenDay(); + + List selectListByToday(); + + List selectListByToday2(); + + List selectListByToday3(); + + List selectListByType(@Param("eventType") Number eventType); + + List selectDemobilizedCountByHour(@Param("eventType") Number eventType); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/CategoryLevelMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/CategoryLevelMapper.java index 52fc714..afe1650 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/CategoryLevelMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/CategoryLevelMapper.java @@ -17,9 +17,9 @@ @Mapper public interface CategoryLevelMapper extends BaseMapper { - List getCaseCategoryLevelListPage(@Param("page") Page page, CategoryLevelRequest categoryLevelRequest); + List getCaseCategoryLevelListPage(@Param("page") Page page, @Param("categoryLevelRequest") CategoryLevelRequest categoryLevelRequest); - List getCaseCategoryLevelList(CategoryLevelRequest categoryLevelRequest); + List getCaseCategoryLevelList(@Param("categoryLevelRequest") CategoryLevelRequest categoryLevelRequest); CaseCategoryLevel getCaseCategoryLevel(@Param("categoryLevelCode") String categoryLevelCode); 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 66353b1..2555a09 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 @@ -19,7 +19,7 @@ @Mapper public interface DeviceInfoMapper extends BaseMapper { - List getDeviceInfoListPage(@Param("page") Page page, DeviceInfoRequest deviceInfoRequest); + List getDeviceInfoListPage(@Param("page") Page page, @Param("deviceInfoRequest") DeviceInfoRequest deviceInfoRequest); List getDeviceInfoList(@Param("deviceInfoRequest") DeviceInfoRequest deviceInfoRequest); @@ -27,6 +27,8 @@ DeviceInfo getByIndexCode(@Param("srcIndex") String srcIndex); + DeviceInfo getByIp(@Param("ip") String ip); + List selectIndexCodesByCodes(@Param("deviceCodes") List deviceCodes); List selectByType(@Param("devType") String devType); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java index 41dd0af..5bfaf63 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java @@ -5,6 +5,7 @@ import com.casic.missiles.modular.dto.DeviceRepairRequest; import com.casic.missiles.modular.model.DeviceRepairLog; import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; import java.util.List; @@ -16,7 +17,7 @@ @Mapper public interface DeviceRepairLogMapper extends BaseMapper { - List getDeviceRepairListPage(Page page, DeviceRepairRequest deviceRepairRequest); + List getDeviceRepairListPage(@Param("page") Page page, @Param("deviceRepairRequest")DeviceRepairRequest deviceRepairRequest); - List getDeviceRepairList(DeviceRepairRequest deviceRepairRequest); + List getDeviceRepairList(@Param("deviceRepairRequest") DeviceRepairRequest deviceRepairRequest); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java index 9035c47..4823ac1 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java @@ -18,7 +18,7 @@ @Mapper public interface FireEquipInfoMapper extends BaseMapper { - List getFireEquipInfoListPage(@Param("page") Page page, FireEquipRequest fireEquipRequest); + List getFireEquipInfoListPage(@Param("page") Page page, @Param("fireEquipRequest") FireEquipRequest fireEquipRequest); FireEquipInfo getFireEquipInfo(@Param("equipCode") String equipCode); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/GateGroupMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/GateGroupMapper.java index d8c330d..977a427 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/GateGroupMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/GateGroupMapper.java @@ -17,7 +17,7 @@ */ @Mapper public interface GateGroupMapper extends BaseMapper { - List getGateGroupListPage(@Param("page") Page page, GateGroupRequest gateGroupRequest); + List getGateGroupListPage(@Param("page") Page page, @Param("gateGroupRequest") GateGroupRequest gateGroupRequest); GateGroup getGateGroupByName(@Param("groupName") String groupName); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/HazardLevelMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/HazardLevelMapper.java index 8957780..dcf47bb 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/HazardLevelMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/HazardLevelMapper.java @@ -17,11 +17,13 @@ @Mapper public interface HazardLevelMapper extends BaseMapper { - List getCaseHazardLevelListPage(@Param("page") Page page, HazardLevelRequest hazardLevelRequest); + List getCaseHazardLevelListPage(@Param("page") Page page, @Param("hazardLevelRequest") HazardLevelRequest hazardLevelRequest); - List getCaseHazardLevelList(HazardLevelRequest hazardLevelRequest); + List getCaseHazardLevelList(@Param("hazardLevelRequest") HazardLevelRequest hazardLevelRequest); CaseHazardLevel getCaseHazardLevel(@Param("hazardLevelCode") String hazardLevelCode); List selectHazardName(); + + String selectHazardNameByCode(@Param("hazardLevelCode") String hazardLevelCode); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/HikCaseDefineMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/HikCaseDefineMapper.java index 0dc47d1..f162fef 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/HikCaseDefineMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/HikCaseDefineMapper.java @@ -12,5 +12,5 @@ */ @Mapper public interface HikCaseDefineMapper extends BaseMapper { - HikCaseDefine getHikCaseDefine(@Param("caseTypeCode") Long caseTypeCode); + HikCaseDefine getHikCaseDefine(@Param("caseTypeCode") Number caseTypeCode); } 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 f8a674c..fe5afc2 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 @@ -17,11 +17,13 @@ @Mapper public interface StaffInfoMapper extends BaseMapper { - List getStaffInfoListPage(@Param("page") Page page, StaffInfoRequest staffInfoRequest); + List getStaffInfoListPage(@Param("page") Page page, @Param("staffInfoRequest") StaffInfoRequest staffInfoRequest); StaffInfo selectByCode(@Param("staffCode") String staffCode); - List getStaffInfoList(StaffInfoRequest staffInfoRequest); + List getStaffInfoList(@Param("staffInfoRequest") StaffInfoRequest staffInfoRequest); - List selectBatchCodes(List list); + List selectBatchCodes(@Param("list") List list); + + int updateByCodeForCard(@Param("staffCode") String staffCode, @Param("cardNo") String cardNo); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitInfoMapper.java index b1217c5..6c52542 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitInfoMapper.java @@ -16,7 +16,7 @@ */ @Mapper public interface VisitInfoMapper extends BaseMapper { - List getVisitInfoListPage(@Param("page") Page page, VisitorRequest visitorRequest); + List getVisitInfoListPage(@Param("page") Page page, @Param("visitorRequest") VisitorRequest visitorRequest); VisitInfo selectByOrderId(@Param("orderId") String orderId); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitorApplyMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitorApplyMapper.java index c09f3c0..6ea55bd 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitorApplyMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitorApplyMapper.java @@ -18,7 +18,7 @@ @Mapper public interface VisitorApplyMapper extends BaseMapper { - List getVisitorApplyListPage(@Param("page") Page page, VisitorApplyRequest visitorApplyRequest); + List getVisitorApplyListPage(@Param("page") Page page, @Param("visitorApplyRequest") VisitorApplyRequest visitorApplyRequest); List selectByVisitReason(); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/AttendanceInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/AttendanceInfoMapper.xml index b2ece71..f8bdd6e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/AttendanceInfoMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/AttendanceInfoMapper.xml @@ -43,7 +43,8 @@ and staff_type = #{staffType} - and YEARWEEK(date_format(atte_date, '%Y-%m-%d'), 1) = YEARWEEK(now(),1); + AND DATE_SUB(CURDATE(), INTERVAL 7 DAY) <= DATE(atte_date) + GROUP BY DATE_FORMAT(atte_date, '%Y-%m-%d') @@ -69,4 +70,20 @@ GROUP BY DATE_FORMAT(atte_date, '%Y-%m') + + + \ No newline at end of file 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 2b6953f..06ec0a8 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 @@ -28,7 +28,9 @@ @@ -87,7 +89,8 @@ SELECT hazard_level_code as levelCode, count(id) as quantity FROM bus_case_info WHERE hazard_level_code is not null - AND DATE_SUB(CURDATE(), INTERVAL 7 DAY) <= date(happen_time); + AND is_key_area = 1 + AND DATE_SUB(CURDATE(), INTERVAL 7 DAY) <= date(happen_time) GROUP BY hazard_level_code @@ -95,7 +98,8 @@ SELECT hazard_level_code as levelCode, count(id) as quantity FROM bus_case_info WHERE hazard_level_code is not null - AND DATE_SUB(CURDATE(), INTERVAL 30 DAY) <= date(happen_time); + AND is_key_area = 1 + AND DATE_SUB(CURDATE(), INTERVAL 30 DAY) <= date(happen_time) GROUP BY hazard_level_code @@ -122,4 +126,71 @@ AND hazard_level_code is not null GROUP BY DATE_FORMAT(happen_time,'%Y-%m-%d') + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/CategoryLevelMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/CategoryLevelMapper.xml index 4670b1f..1d25cbd 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/CategoryLevelMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/CategoryLevelMapper.xml @@ -20,11 +20,11 @@ SELECT * FROM bus_case_category_level WHERE 1=1 - - and code = #{code} + + and code = #{categoryLevelRequest.code} - - and name = #{name} + + and name = #{categoryLevelRequest.name} ORDER by create_time DESC 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 9b66fd8..bfd84b7 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 @@ -98,4 +98,10 @@ #{item} + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceRepairLogMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceRepairLogMapper.xml index 078ed3c..cf1a481 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceRepairLogMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceRepairLogMapper.xml @@ -22,14 +22,14 @@ SELECT * FROM bus_device_repair_log WHERE 1=1 - - and device_code = #{devCode} + + and device_code = #{deviceRepairRequest.devCode} - - and device_name = #{devName} + + and device_name = #{deviceRepairRequest.devName} - - and DATE_FORMAT(create_time,"%y%m%d") = DATE_FORMAT(#{createTime},"%y%m%d") + + and DATE_FORMAT(create_time,"%y%m%d") = DATE_FORMAT(#{deviceRepairRequest.createTime},"%y%m%d") ORDER by create_time DESC diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/HazardLevelMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/HazardLevelMapper.xml index f16f2b9..458322b 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/HazardLevelMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/HazardLevelMapper.xml @@ -20,11 +20,11 @@ SELECT * FROM bus_case_hazard_level WHERE 1=1 - - and code = #{code} + + and code = #{hazardLevelRequest.code} - - and name = #{name} + + and name = #{hazardLevelRequest.name} ORDER by create_time DESC @@ -42,4 +42,10 @@ SELECT name FROM bus_case_hazard_level + + \ 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 557237e..b6a183a 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 @@ -50,4 +50,10 @@ + + + UPDATE bus_staff_info + SET card_no = #{cardNo} + WHERE staff_code = #{staffCode} + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitInfoMapper.xml index 84aa84f..230529a 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitInfoMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitInfoMapper.xml @@ -27,5 +27,6 @@ SELECT * FROM bus_visit_info WHERE order_id = #{orderId} and DATE_FORMAT(in_time,'%Y-%m-%d') = CURRENT_DATE + limit 1 \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/BlackPictureRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/BlackPictureRequest.java new file mode 100644 index 0000000..fc92701 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/BlackPictureRequest.java @@ -0,0 +1,14 @@ +package com.casic.missiles.modular.dto; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/29 19:26 + */ +@Data +public class BlackPictureRequest { + private String picUri; + private String serverIndexCode; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/CancelSubscribeRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/CancelSubscribeRequest.java new file mode 100644 index 0000000..e2d390a --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/CancelSubscribeRequest.java @@ -0,0 +1,15 @@ +package com.casic.missiles.modular.dto.hik; + +import lombok.Data; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/24 15:14 + */ +@Data +public class CancelSubscribeRequest { + private List eventTypes; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/CardInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/CardInfo.java new file mode 100644 index 0000000..341457d --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/CardInfo.java @@ -0,0 +1,24 @@ +package com.casic.missiles.modular.dto.hik; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/26 16:08 + */ +@Data +public class CardInfo { + //卡号,8~20个字符,支持数字和大写字母 + private String cardNo; + //人员ID,员工工号 + private String personId; + //人员所属组织IndexCode + private String orgIndexCode; + //卡片类型,默认是1:IC卡 + //1:IC卡 + //2:CPU卡 + //3:远距离卡 + //4:MIFARE卡 + private Number cardType; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/FaceRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/FaceRequest.java new file mode 100644 index 0000000..edc04bf --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/FaceRequest.java @@ -0,0 +1,16 @@ +package com.casic.missiles.modular.dto.hik; + +import lombok.Data; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/25 16:53 + */ +@Data +public class FaceRequest { + private String certificateNum; + private List indexCodes; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/HikRecvEvent.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/HikRecvEvent.java index a3e9845..1b2b2b1 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/HikRecvEvent.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/HikRecvEvent.java @@ -28,12 +28,12 @@ /** * 事件类型,用于判断所需接收到的事件类型 */ - public Long getEventType(){ + public Number getEventType(){ JSONObject jsonObject = (JSONObject)JSONObject.toJSON(params); //事件类别对应SecurityEventTypeEnum JSONArray eventTypeArray = (JSONArray)jsonObject.get("events"); JSONObject eventJsonObject = (JSONObject)JSONObject.toJSON(eventTypeArray.get(0)); - Long eventType = (Long) eventJsonObject.get("eventType"); + Number eventType = (Number) eventJsonObject.get("eventType"); return eventType; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonBatchDeleteRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonBatchDeleteRequest.java index 027d31d..9751929 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonBatchDeleteRequest.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonBatchDeleteRequest.java @@ -12,4 +12,6 @@ @Data public class PersonBatchDeleteRequest { private List personIds; + //删除人脸接口使用 + private String faceId; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/BlackListController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/BlackListController.java index a27f9f8..0c06661 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/BlackListController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/BlackListController.java @@ -1,13 +1,18 @@ package com.casic.missiles.modular.controller; +import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.base.controller.ExportController; import com.casic.missiles.core.page.PageFactory; import com.casic.missiles.model.response.ResponseData; import com.casic.missiles.modular.dto.BlackInfoRequest; +import com.casic.missiles.modular.dto.BlackPictureRequest; +import com.casic.missiles.modular.dto.hik.PersonInfoRequest; +import com.casic.missiles.modular.enums.HikUri; import com.casic.missiles.modular.enums.OperateTypeEnum; import com.casic.missiles.modular.model.BlackInfo; import com.casic.missiles.modular.service.BlackInfoService; +import com.casic.missiles.modular.util.HikUtil; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; @@ -56,4 +61,22 @@ return null; } + /** + * 黑名单人员照片 + */ + @PostMapping("/personPicture") + @ResponseBody + public Object personPicture(@RequestBody BlackPictureRequest blackPictureRequest){ + //获取照片 + String picUri = blackPictureRequest.getPicUri(); + String serverIndexCode = blackPictureRequest.getServerIndexCode(); + PersonInfoRequest picRequest = new PersonInfoRequest(); + picRequest.setPicUri(picUri); + picRequest.setServerIndexCode(serverIndexCode); + String reBody = JSONObject.toJSONString(picRequest); + //重定向地址获取 + String url = HikUtil.hikApiFor302(HikUri.PERSON_PICTURE, reBody); + return ResponseData.success(url); + } + } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/DeviceController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/DeviceController.java index e1c4eba..666bbee 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/DeviceController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/DeviceController.java @@ -107,7 +107,7 @@ } /** - * 设备维修管理查询(分页),需计算MTTR=总维修时间/故障次数 + * 设备状态计算与评判/设备维修管理查询(分页),需计算MTTR=总维修时间/故障次数 */ @PostMapping("/repair/listPage") @ResponseBody @@ -211,7 +211,7 @@ //需根据设备编号获取到对应的门禁点唯一标识 doorControlRequest.setDoorIndexCodes(indexCodes); doorControlRequest.setControlType(Integer.valueOf(gateGroupDTO.getStatus())); - String body = JSONObject.toJSONString(deviceCodes); + String body = JSONObject.toJSONString(doorControlRequest); String resultStr = HikUtil.hikApi(HikUri.DOOR_CONTROL, body); JSONObject resultJson = (JSONObject)JSONObject.parse(resultStr); if (!"0".equals(resultJson.get("code"))) { diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/StaffController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/StaffController.java index b58ccab..704093c 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/StaffController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/StaffController.java @@ -2,15 +2,21 @@ import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.util.StrUtil; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.base.controller.ExportController; import com.casic.missiles.core.page.PageFactory; import com.casic.missiles.model.response.ErrorResponseData; import com.casic.missiles.model.response.ResponseData; import com.casic.missiles.modular.dto.StaffInfoRequest; +import com.casic.missiles.modular.dto.hik.PersonInfoRequest; +import com.casic.missiles.modular.dto.hik.StaffCardRequest; +import com.casic.missiles.modular.enums.HikUri; import com.casic.missiles.modular.enums.OperateTypeEnum; import com.casic.missiles.modular.model.StaffInfo; import com.casic.missiles.modular.service.StaffInfoService; +import com.casic.missiles.modular.util.HikUtil; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; @@ -110,4 +116,60 @@ } return ResponseData.success(); } + + /** + * 批量开卡,添加人员之后调用,若在一个接口中添加人员成功开卡失败则第二次添加时会有问题 + */ + @PostMapping("/cardBinding") + @ResponseBody + public Object cardBinding(@RequestBody StaffCardRequest staffCardRequest) { + String body = JSONObject.toJSONString(staffCardRequest); + String resultStr = HikUtil.hikApi(HikUri.CARD_BINDING, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (!"0".equals(resultJson.get("code"))) { + log.error("请求海康,批量开卡失败,海康response:{}", resultStr); + return ResponseData.error("批量开卡失败"); + } + //保存卡号 + if(staffInfoService.saveCardInfo(staffCardRequest) > 0){ + return ResponseData.success(); + } + return ResponseData.error("批量开卡失败"); + } + + /** + * 获取员工照片,海康存储 + */ + @PostMapping("/personPicture/{staffCode}") + @ResponseBody + public Object personPicture(@PathVariable("staffCode") String staffCode){ + //获取员工详细信息,含图片服务器、uri + PersonInfoRequest request = new PersonInfoRequest(); + List list = new ArrayList<>(); + list.add(staffCode); + request.setParamName("personId"); + request.setParamValue(list); + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi(HikUri.PERSON_INFO, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (!"0".equals(resultJson.get("code"))) { + log.error("请求海康,根据人员唯一字段获取人员详细信息失败,海康response:{}", resultStr); + return ResponseData.error("获取员工照片失败"); + } + //获取照片 + JSONObject data = (JSONObject) resultJson.get("data"); + JSONArray dataArray = (JSONArray) data.get("list"); + JSONObject jsonObject = (JSONObject) dataArray.get(0); + JSONArray personPhoto = (JSONArray) jsonObject.get("personPhoto"); + JSONObject photo = (JSONObject) personPhoto.get(0); + String picUri = photo.getString("picUri"); + String serverIndexCode = photo.getString("serverIndexCode"); + PersonInfoRequest picRequest = new PersonInfoRequest(); + picRequest.setPicUri(picUri); + picRequest.setServerIndexCode(serverIndexCode); + String reBody = JSONObject.toJSONString(picRequest); + //重定向地址获取 + String url = HikUtil.hikApiFor302(HikUri.PERSON_PICTURE, reBody); + return ResponseData.success(url); + } } 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 4a07dd9..7b1dcf6 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 @@ -16,6 +16,7 @@ import com.casic.missiles.modular.redis.key.CacheKeys; import com.casic.missiles.modular.service.CockpitService; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.util.CollectionUtils; import org.springframework.web.bind.annotation.*; @@ -24,10 +25,7 @@ import java.text.NumberFormat; import java.time.LocalDateTime; import java.time.temporal.ChronoUnit; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.util.*; import java.util.stream.Collectors; /** @@ -73,6 +71,9 @@ private StatisticNumberMapper numberMapper; @Autowired + private HazardLevelMapper hazardLevelMapper; + + @Autowired private AccessGroupConfig accessGroupConfig; /** @@ -104,8 +105,24 @@ public Object buildingNumberPerHour(){ //当天按小时分组的人数 List list = numberMapper.selectListByTime(); - Map> collect = list.stream().collect(Collectors.groupingBy(BuildingNumberDTO::getStatisticPosition)); - return ResponseData.success(collect); + Map> collect = list.stream().collect(Collectors.groupingBy(BuildingNumberDTO::getStatisticTime)); + //定时任务中已将每小时三栋楼人数存到数据库 + //将一期主楼和录制楼人数合并,二期单算 + List> resultList = new ArrayList<>(); + collect.keySet().forEach(key -> { + List buildingNumberDTOS = collect.get(key); + BuildingNumberDTO mainBuildingOne = buildingNumberDTOS.get(0); + BuildingNumberDTO mainBuildingTwo = buildingNumberDTOS.get(1); + BuildingNumberDTO recordingBuilding = buildingNumberDTOS.get(2); + HashMap resultMap = new HashMap<>(); + Integer oneQuantity = Integer.valueOf(mainBuildingOne.getStatisticQuantity()); + Integer recordingQuantity = Integer.valueOf(recordingBuilding.getStatisticQuantity()); + resultMap.put("staticTime", mainBuildingOne.getStatisticTime()); + resultMap.put(mainBuildingOne.getStatisticPositionName()+"、"+recordingBuilding.getStatisticPositionName(), String.valueOf(oneQuantity+recordingQuantity)); + resultMap.put(mainBuildingTwo.getStatisticPositionName(), mainBuildingTwo.getStatisticQuantity()); + resultList.add(resultMap); + }); + return ResponseData.success(resultList); } /** @@ -151,12 +168,11 @@ public Object securityNumber() { QueryWrapper wrapper = new QueryWrapper<>(); wrapper.eq("staff_type", 2); + // TODO: 2022/9/2 后续使用产品确定的每天出勤的安保人员的数量 Integer total = staffInfoMapper.selectCount(wrapper); - //当日离岗事件个数 - QueryWrapper wrapper1 = new QueryWrapper<>(); - wrapper1.eq("hik_event_type", SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); - wrapper1.apply("date_format(now(),'%Y-%m-%d') = date_format(happen_time,'%Y-%m-%d')"); - Integer leave = caseInfoMapper.selectCount(wrapper1); + //当日离岗事件按设备去重后的个数 + // TODO: 2022/9/2 目前相当于24小时内的计算,之后看需要可改成自定义小时数计算离岗率,即离岗+6小时内仅一次离岗则恢复为100%,多次则累加离岗次数计算离岗率 + Integer leave = caseInfoMapper.selectDemobilizedCount(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); NumberFormat numberFormat = NumberFormat.getInstance(); // 设置精确到小数点后2位 numberFormat.setMaximumFractionDigits(2); @@ -179,7 +195,6 @@ @ResponseBody public Object visitorApplyDetail() { List reasonGroup = applyMapper.selectByVisitReason(); - HashMap resultMap = new HashMap<>(); NumberFormat numberFormat = NumberFormat.getInstance(); // 设置精确到小数点后2位 numberFormat.setMaximumFractionDigits(2); @@ -187,12 +202,17 @@ if(0 == sum){ return ResponseData.success(); } + List resultList = new ArrayList<>(); reasonGroup.forEach(group -> { String reasonName = dictService.getDictNameByCode(SecurityEventDict.VISIT_REASON, group.getVisitReason()); String result = numberFormat.format((float) group.getQuantity() / (float) sum * 100); - resultMap.put(reasonName, result+"%"); + ApplyReasonGroupDTO applyReasonGroupDTO = new ApplyReasonGroupDTO(); + applyReasonGroupDTO.setQuantity(group.getQuantity()); + applyReasonGroupDTO.setVisitReason(reasonName); + applyReasonGroupDTO.setRatio(result+"%"); + resultList.add(applyReasonGroupDTO); }); - return ResponseData.success(resultMap); + return ResponseData.success(resultList); } /** @@ -247,6 +267,32 @@ } /** + * 机动力量实时在岗率,在岗人数除以总应在岗人数,用离岗+6小时内恢复为100%,6小时外再计算 + */ + @GetMapping("/staff/beOnDutyRatio") + @ResponseBody + public Object beOnDutyRatio() { + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("staff_type", 2); + // TODO: 2022/9/2 后续使用产品确定的每天出勤的安保人员的数量 + Integer total = staffInfoMapper.selectCount(wrapper); + if(0 == total){ + return ResponseData.success(null); + } + //当日离岗事件按设备去重后的个数 + // TODO: 2022/9/2 目前相当于24小时内的计算,之后看需要可改成自定义小时数计算离岗率,即离岗+6小时内仅一次离岗则恢复为100%,多次则累加离岗次数计算离岗率 + List onDutyRatioDTOS = caseInfoMapper.selectDemobilizedCountByHour(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); + onDutyRatioDTOS.forEach(dto -> { + NumberFormat numberFormat = NumberFormat.getInstance(); + // 设置精确到小数点后2位 + numberFormat.setMaximumFractionDigits(2); + String result = numberFormat.format(100 - Float.valueOf(dto.getQuantity()) / (float) total * 100); + dto.setRatio(result+"%"); + }); + return ResponseData.success(onDutyRatioDTOS); + } + + /** * 闸机速通门统计-设备状态分组计算数量,devType传闸机字典key * 视频频监控摄像机统计-设备状态分组计算数量,devType传摄像头字典key */ @@ -262,12 +308,17 @@ if(sum <= 0){ return ResponseData.error("无该类设备信息"); } + List resultList = new ArrayList<>(); gateStatusGroup.forEach(group -> { String devStatus = dictService.getDictNameByCode(SecurityEventDict.DEVICE_STATUS, group.getStatus()); String result = numberFormat.format((float) group.getQuantity() / (float) sum * 100); - resultMap.put(devStatus, result+"%"); + GateStatusGroupResponse gateStatusGroupResponse = new GateStatusGroupResponse(); + gateStatusGroupResponse.setStatus(devStatus); + gateStatusGroupResponse.setRatio(result+"%"); + resultList.add(gateStatusGroupResponse); }); - resultMap.put("总", sum); + resultMap.put("total", sum); + resultMap.put("list", resultList); return ResponseData.success(resultMap); } @@ -282,17 +333,38 @@ String position = securityScoreDTO.getPosition(); List caseInfos = caseInfoMapper.selectByPosition(position); //查询各危险级别权重、各类别权重,放入map,避免循环中多次查数据库 - + HashMap hazardScoreMap = new HashMap<>(); + List caseHazardLevelList = hazardLevelMapper.getCaseHazardLevelList(null); + caseHazardLevelList.forEach(hazardLevel -> { + hazardScoreMap.put(hazardLevel.getCode(), hazardLevel.getWeight()); + }); + HashMap categoryScoreMap = new HashMap<>(); + List categoryLevelList = categoryLevelMapper.getCaseCategoryLevelList(null); + categoryLevelList.forEach(categoryLevel -> { + categoryScoreMap.put(categoryLevel.getCode(), categoryLevel.getWeight()); + }); + //事件按楼层分组,计算 List securityScoreDTOs = new ArrayList<>(); caseInfos.forEach(caseInfo -> { SecurityScoreDTO securityScoreDTO1 = new SecurityScoreDTO(); + securityScoreDTO1.setPosition(caseInfo.getPosition()); securityScoreDTO1.setArea(caseInfo.getArea()); - // TODO: 2022/8/4 楼层评分计算根据产品定义调整 -// caseInfo.get -// securityScoreDTO1.setScore(); + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); + Double score = 100 - Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + securityScoreDTO1.setScore(score); + securityScoreDTOs.add(securityScoreDTO1); }); - - return null; + 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); + }); + return ResponseData.success(securityScoreDTOs); } /** @@ -303,9 +375,13 @@ public Object SecurityFrequency(@RequestBody SecurityFrequencyDTO securityFrequencyDTO) { String year = securityFrequencyDTO.getYear(); String month = securityFrequencyDTO.getMonth(); - Integer quantity = caseInfoMapper.selectCountByMonth(year, month); - securityFrequencyDTO.setQuantity(quantity); - return ResponseData.success(securityFrequencyDTO); + if(!StringUtils.isEmpty(year) && StringUtils.isEmpty(month)){ + Integer quantity = caseInfoMapper.selectCountByMonth(year, month); + securityFrequencyDTO.setQuantity(quantity); + return ResponseData.success(securityFrequencyDTO); + } + List list = caseInfoMapper.selectPreMonthCount(); + return ResponseData.success(list); } } 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 ae4d770..f4f075c 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 @@ -1,20 +1,25 @@ package com.casic.missiles.modular.controller.cockpit; +import cn.hutool.core.date.DateUnit; import cn.hutool.core.date.DateUtil; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.casic.missiles.model.response.ResponseData; -import com.casic.missiles.modular.dao.AttendanceInfoMapper; -import com.casic.missiles.modular.dao.CaseInfoMapper; -import com.casic.missiles.modular.dao.HazardLevelMapper; -import com.casic.missiles.modular.dao.StaffInfoMapper; +import com.casic.missiles.modular.dao.*; +import com.casic.missiles.modular.dto.DeviceRepairLogDTO; +import com.casic.missiles.modular.dto.DeviceRepairRequest; import com.casic.missiles.modular.dto.statistics.*; +import com.casic.missiles.modular.enums.SecurityEventType; +import com.casic.missiles.modular.model.CaseCategoryLevel; import com.casic.missiles.modular.model.CaseHazardLevel; +import com.casic.missiles.modular.model.CaseInfo; import com.casic.missiles.modular.model.StaffInfo; +import com.casic.missiles.modular.service.DeviceInfoService; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.util.CollectionUtils; import org.springframework.web.bind.annotation.*; +import java.math.BigDecimal; import java.text.NumberFormat; import java.util.*; import java.util.stream.Collectors; @@ -40,6 +45,12 @@ @Autowired private HazardLevelMapper hazardLevelMapper; + @Autowired + private CategoryLevelMapper categoryLevelMapper; + + @Autowired + private DeviceInfoService deviceInfoService; + /** * 安防事件时域频次统计,每月的每天安防事件个数(原方案) * 月维度:展示每个月的每天的数据 @@ -89,15 +100,17 @@ List monthList = caseInfoMapper.selectPreMonthCountByYear(year); Map> collect = monthList.stream().collect(Collectors.groupingBy(PreMonthOrWeekCaseDTO::getHazardLevelCode)); HashMap strAvgMap = new HashMap<>(); + List resultList = new ArrayList<>(); for (String key : collect.keySet()) { List preMonthOrWeekCaseDTOS = collect.get(key); int sum = preMonthOrWeekCaseDTOS.stream().mapToInt(PreMonthOrWeekCaseDTO::getQuantity).sum(); //若年份是本年,则使用个安防级别数量/当前月份数 //若不是本年,除数为12 MonthAndWeekDTO monthAndWeekDTO = new MonthAndWeekDTO(); + String hazardName = hazardLevelMapper.selectHazardNameByCode(key); + monthAndWeekDTO.setLevelName(hazardName); if(year.equals(String.valueOf(DateUtil.thisYear()))){ monthAndWeekDTO.setMonthQuantity(sum / DateUtil.thisMonth()); -// monthAndWeekDTO.setLevelName(); strAvgMap.put(key, monthAndWeekDTO); }else{ monthAndWeekDTO.setMonthQuantity(sum / 12); @@ -113,27 +126,37 @@ if(year.equals(String.valueOf(DateUtil.thisYear()))){ if(!Objects.isNull(strAvgMap.get(key))){ MonthAndWeekDTO monthAndWeekDTO = strAvgMap.get(key); + String hazardName = hazardLevelMapper.selectHazardNameByCode(key); + monthAndWeekDTO.setLevelName(hazardName); monthAndWeekDTO.setWeekQuantity(sum / DateUtil.thisWeekOfYear()); strAvgMap.put(key, monthAndWeekDTO); }else{ MonthAndWeekDTO monthAndWeekDTO = new MonthAndWeekDTO(); + String hazardName = hazardLevelMapper.selectHazardNameByCode(key); + monthAndWeekDTO.setLevelName(hazardName); monthAndWeekDTO.setWeekQuantity(sum / DateUtil.thisWeekOfYear()); strAvgMap.put(key, monthAndWeekDTO); } }else{ if(!Objects.isNull(strAvgMap.get(key))){ MonthAndWeekDTO monthAndWeekDTO = strAvgMap.get(key); + String hazardName = hazardLevelMapper.selectHazardNameByCode(key); + monthAndWeekDTO.setLevelName(hazardName); monthAndWeekDTO.setWeekQuantity(sum / 52); strAvgMap.put(key, monthAndWeekDTO); }else{ MonthAndWeekDTO monthAndWeekDTO = new MonthAndWeekDTO(); + String hazardName = hazardLevelMapper.selectHazardNameByCode(key); + monthAndWeekDTO.setLevelName(hazardName); monthAndWeekDTO.setWeekQuantity(sum / 52); strAvgMap.put(key, monthAndWeekDTO); } } } - avgMonthAndWeekGroupDTO.setMap(strAvgMap); - return ResponseData.success(avgMonthAndWeekGroupDTO); + strAvgMap.keySet().forEach(key -> { + resultList.add(strAvgMap.get(key)); + }); + return ResponseData.success(resultList); } /** @@ -181,12 +204,178 @@ } /** - * 员工考勤人数变化,功能待定 + * 员工考勤人数变化,统计当天(横坐标为时)及近7天(横坐标为天)的考勤人数变化,只要发生一次考勤识别,次数的基数就正常增加(没有上班下班区分) */ + @PostMapping("/staff/attendanceNumber/{dimension}") + @ResponseBody + public Object attendanceNumber(@PathVariable("dimension") String dimension) { + List attendanceNumberDTOs = null; + List> resultList = new ArrayList<>(); + if("week".equals(dimension)){ + //近7天数据按天分组统计 + attendanceNumberDTOs = attendanceInfoMapper.getCountForWeek(); + }else if("day".equals(dimension)) { + //今天数据按小时分组统计 + attendanceNumberDTOs = attendanceInfoMapper.getCountForDay(); + } + if(CollectionUtils.isEmpty(attendanceNumberDTOs)){ + return ResponseData.error("该查询条件下,无员工出勤数据!"); + } + Map> collect = attendanceNumberDTOs.stream().collect(Collectors.groupingBy(AttendanceNumberDTO::getDate)); + collect.keySet().forEach(key -> { + List attendanceNumberDTOS = collect.get(key); + AttendanceNumberDTO attendanceNumberDTO = attendanceNumberDTOS.get(0); + AttendanceNumberDTO attendanceNumberDTO2 = attendanceNumberDTOS.get(1); + Map resultMap = new HashMap<>(); + resultMap.put(attendanceNumberDTO.getStaffType(), attendanceNumberDTO.getQuantity()); + resultMap.put(attendanceNumberDTO2.getStaffType(), attendanceNumberDTO2.getQuantity()); + resultMap.put("staticTime", attendanceNumberDTO.getDate()); + resultList.add(resultMap); + }); + return ResponseData.success(resultList); + } /** - * 近30天/近一周安保人员到岗排行 + * 早晚高峰区域安防评估 */ + @PostMapping("/security/assessment/{dimension}") + @ResponseBody + public Object securityAssessment(@PathVariable("dimension") String dimension) { + //查询各危险级别权重、各类别权重,放入map,避免循环中多次查数据库 + HashMap hazardScoreMap = new HashMap<>(); + List caseHazardLevelList = hazardLevelMapper.getCaseHazardLevelList(null); + caseHazardLevelList.forEach(hazardLevel -> { + hazardScoreMap.put(hazardLevel.getCode(), hazardLevel.getWeight()); + }); + HashMap categoryScoreMap = new HashMap<>(); + List categoryLevelList = categoryLevelMapper.getCaseCategoryLevelList(null); + categoryLevelList.forEach(categoryLevel -> { + categoryScoreMap.put(categoryLevel.getCode(), categoryLevel.getWeight()); + }); + HashMap hashMap = new HashMap<>(); + if("week".equals(dimension)){ + //近7天早晚高峰数据 + List caseInfos = caseInfoMapper.selectListBySevenDay(); + //按时间(天)进行分组 + caseInfos.forEach(caseInfo -> { + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); + Double score = Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + String[] array = caseInfo.getHappenTime().split(" "); + String dayTime = array[0]; + BigDecimal preScore; + if(hashMap.containsKey(dayTime)){ + Double aDouble = hashMap.get(dayTime); + preScore = new BigDecimal(aDouble.toString()); + + }else{ + preScore = new BigDecimal("100.0"); + } + BigDecimal nowScore = new BigDecimal(score.toString()); + hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); + }); + return ResponseData.success(hashMap); + }else if("day".equals(dimension)) { + //今天数据按小时分组统计 + List caseInfos = caseInfoMapper.selectListByToday(); + caseInfos.forEach(caseInfo -> { + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); + Double score = Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + String[] array = caseInfo.getHappenTime().split(":"); + String dayTime = array[0]; + BigDecimal preScore; + if(hashMap.containsKey(dayTime)){ + Double aDouble = hashMap.get(dayTime); + preScore = new BigDecimal(aDouble.toString()); + + }else{ + preScore = new BigDecimal("100.0"); + } + BigDecimal nowScore = new BigDecimal(score.toString()); + hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); + }); + return ResponseData.success(hashMap); + } + return null; + } + + /** + * 重点区域安防事态评估,统计重点区域6:00-23:00按小时分组数据 + */ + @GetMapping("/security/keyAreaStatistic") + @ResponseBody + public Object keyAreaStatistic() { + //查询各危险级别权重、各类别权重,放入map,避免循环中多次查数据库 + HashMap hazardScoreMap = new HashMap<>(); + List caseHazardLevelList = hazardLevelMapper.getCaseHazardLevelList(null); + caseHazardLevelList.forEach(hazardLevel -> { + hazardScoreMap.put(hazardLevel.getCode(), hazardLevel.getWeight()); + }); + HashMap categoryScoreMap = new HashMap<>(); + List categoryLevelList = categoryLevelMapper.getCaseCategoryLevelList(null); + categoryLevelList.forEach(categoryLevel -> { + categoryScoreMap.put(categoryLevel.getCode(), categoryLevel.getWeight()); + }); + HashMap hashMap = new HashMap<>(); + //今天数据按小时分组统计 + List caseInfos = caseInfoMapper.selectListByToday2(); + caseInfos.forEach(caseInfo -> { + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); + Double score = Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + String[] array = caseInfo.getHappenTime().split(":"); + String dayTime = array[0]; + BigDecimal preScore; + if(hashMap.containsKey(dayTime)){ + Double aDouble = hashMap.get(dayTime); + preScore = new BigDecimal(aDouble.toString()); + + }else{ + preScore = new BigDecimal("100.0"); + } + BigDecimal nowScore = new BigDecimal(score.toString()); + hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); + }); + return ResponseData.success(hashMap); + } + + /** + * 安防机动支援力量调配响应评估,根据事件已解决状态及已解决时间-发送时间,按时间(小时)分组统计 + */ + @GetMapping("/security/responseAssess") + @ResponseBody + public Object responseAssess() { + //查询各危险级别权重、各类别权重,放入map,避免循环中多次查数据库 + HashMap hazardScoreMap = new HashMap<>(); + List caseHazardLevelList = hazardLevelMapper.getCaseHazardLevelList(null); + caseHazardLevelList.forEach(hazardLevel -> { + hazardScoreMap.put(hazardLevel.getCode(), hazardLevel.getWeight()); + }); + HashMap hashMap = new HashMap<>(); + //今天数据按小时分组统计 + List caseInfos = caseInfoMapper.selectListByToday3(); + caseInfos.forEach(caseInfo -> { + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + //扣分=事件级别权重*未解决小时数 + Date updateTime = DateUtil.parse(caseInfo.getUpdateTime()); + Date happenTime = DateUtil.parse(caseInfo.getHappenTime()); + long between = DateUtil.between(updateTime, happenTime, DateUnit.HOUR); + Double score = Double.valueOf(hazardWeight)*between; + String[] array = caseInfo.getHappenTime().split(":"); + String dayTime = array[0]; + BigDecimal preScore; + if(hashMap.containsKey(dayTime)){ + Double aDouble = hashMap.get(dayTime); + preScore = new BigDecimal(aDouble.toString()); + }else{ + preScore = new BigDecimal("100.0"); + } + BigDecimal nowScore = new BigDecimal(score.toString()); + hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); + }); + return ResponseData.success(hashMap); + } /** * 重点区域威胁事件类型统计,优先级2,统计近7天和近30天 @@ -224,7 +413,34 @@ } /** - * 设备状态计算系数和评判,优先级3,需确认设备恢复时间是否可以获取 + * 近30天/近一周安保人员到岗排行 */ + + /** + * 安保等级评估,发生离岗事件减1分 + */ + @GetMapping("/security/levelAssess") + @ResponseBody + public Object securityLevelAssess() { + //今天数据按小时分组统计 + List resultList = caseInfoMapper.selectListByType(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); + resultList.forEach(result -> { + BigDecimal deScore = new BigDecimal(result.getQuantity()); + BigDecimal preScore = new BigDecimal("100.0"); + result.setScore(preScore.subtract(deScore).doubleValue()); + }); + return ResponseData.success(resultList); + } + + /** + * 设备状态计算系数和评判,即设备维修管理查询(不分页) + */ + @PostMapping("/device/repairList") + @ResponseBody + public Object repairList(@RequestBody DeviceRepairRequest deviceRepairRequest) { + List deviceRepairLogDTOS = deviceInfoService.deviceRepairListPage(deviceRepairRequest); + return ResponseData.success(deviceRepairLogDTOS); + } + } 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 fbf8ab6..c71a15a 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 @@ -1,13 +1,12 @@ package com.casic.missiles.modular.controller.hik; +import cn.hutool.core.date.DateTime; +import cn.hutool.core.date.DateUtil; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.casic.missiles.model.response.ResponseData; import com.casic.missiles.modular.dao.HikFaceGroupInfoMapper; -import com.casic.missiles.modular.dto.hik.EventSubscribeRequest; -import com.casic.missiles.modular.dto.hik.FaceGroupAdditionRequest; -import com.casic.missiles.modular.dto.hik.HikRecvEvent; -import com.casic.missiles.modular.dto.hik.OrgBatchAdd; +import com.casic.missiles.modular.dto.hik.*; import com.casic.missiles.modular.enums.HikUri; import com.casic.missiles.modular.enums.SecurityEventType; import com.casic.missiles.modular.model.CaseInfo; @@ -18,16 +17,20 @@ import com.casic.missiles.modular.util.CaseInfoFactoryUtil; import com.casic.missiles.modular.util.HikUtil; import com.casic.missiles.modular.util.ThreadPoolUtil; +import com.casic.missiles.modular.util.WebSocket; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; -import org.springframework.web.bind.annotation.*; +import org.springframework.util.CollectionUtils; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.RestController; -import java.net.InetAddress; -import java.net.UnknownHostException; import java.util.ArrayList; +import java.util.Iterator; import java.util.List; import java.util.Objects; @@ -38,7 +41,6 @@ */ @Slf4j @RestController -@RequestMapping("/hik") public class HikController { @Autowired @@ -53,28 +55,37 @@ @Autowired private HikService hikService; + @Autowired + private HikFaceGroupInfoMapper hikFaceGroupInfoMapper; + + @Autowired + private WebSocket webSocket; + @Value("${server.port}") private int serverPort; - @Autowired - private HikFaceGroupInfoMapper hikFaceGroupInfoMapper; /** * 海康事件订阅 */ - @PostMapping("/event/subscribe") + @PostMapping("/hik/event/subscribe") @ResponseBody - public Object eventSubscribe() throws UnknownHostException { + public Object eventSubscribe() { EventSubscribeRequest eventSubscribeRequest = new EventSubscribeRequest(); ArrayList list = new ArrayList<>(); list.add(SecurityEventType.DEVICE_OFFLINE); + list.add(SecurityEventType.DEVICE_ONLINE); list.add(SecurityEventType.KEY_PERSONNEL_IDENTIFY_EVENT); list.add(SecurityEventType.MONITORING_POINT_OFFLINE); + list.add(SecurityEventType.MONITORING_POINT_ONLINE); list.add(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); list.add(SecurityEventType.PERSONNEL_GATHER_EVENT); - InetAddress localHost = InetAddress.getLocalHost(); + list.add(SecurityEventType.VISITOR_REGISTER); + list.add(SecurityEventType.VISITOR_CHECKOUT); + list.add(SecurityEventType.HIGH_ALTITUDE_PARABOLIC); +// InetAddress localHost = InetAddress.getLocalHost(); eventSubscribeRequest.setEventTypes(list); - eventSubscribeRequest.setEventDest("https://" + localHost + ":" + serverPort + "/eventRcv"); + eventSubscribeRequest.setEventDest("http://" + "192.168.10.6" + ":" + serverPort + "/eventRcv"); //订阅类型,0-订阅原始事件,1-联动事件,2-原始事件和联动事件,不填使用默认值0 eventSubscribeRequest.setSubType(0); /** @@ -92,19 +103,25 @@ } /** + * 查询事件订阅信息 + */ + @PostMapping("/hik/event/query") + @ResponseBody + public Object eventQuery() { + String result = HikUtil.hikApi(HikUri.EVENT_INFO, ""); + return result; + } + + /** * 海康事件接收 */ @PostMapping("/eventRcv") @ResponseBody public Object eventRcv(@RequestBody HikRecvEvent hikRecvEvent) { //1、接收所需事件类型 - Long eventType = hikRecvEvent.getEventType(); + Number eventType = hikRecvEvent.getEventType(); log.info("接收到安防事件类型为:{}", eventType); CaseInfo caseInfo = caseInfoFactoryUtil.getCaseInfo(eventType); - //接收到不关心事件直接返回 - if(Objects.isNull(caseInfo)){ - return ResponseData.success(); - } //2、不同事件不同处理,caseInfoFactoryUtil已设置好事件基础定义信息 // 再为事件添加状态、设备编码、设备名称、位置、区域、时间 // 异步处理事件 @@ -114,19 +131,23 @@ caseHandle(hikRecvEvent, eventType, caseInfo); } })); +// caseHandle(hikRecvEvent, eventType, caseInfo); - return null; + return ResponseData.success(); } - private void caseHandle(HikRecvEvent hikRecvEvent, Long eventType, CaseInfo caseInfo) { + private void caseHandle(HikRecvEvent hikRecvEvent, Number eventType, CaseInfo caseInfo) { JSONArray eventArray = hikRecvEvent.getEventArray(); List caseInfos = new ArrayList<>(); - while (eventArray.stream().iterator().hasNext()) { + Iterator iterator = eventArray.iterator(); + while (iterator.hasNext()) { CaseInfo caseInfo1 = new CaseInfo(); - BeanUtils.copyProperties(caseInfo, caseInfo1); - JSONObject event = (JSONObject) eventArray.stream().iterator().next(); + if(!Objects.isNull(caseInfo)){ + BeanUtils.copyProperties(caseInfo, caseInfo1); + } + JSONObject event = (JSONObject) iterator.next(); //5种事件进行不同处理 - if(SecurityEventType.KEY_PERSONNEL_IDENTIFY_EVENT == eventType){ + if (SecurityEventType.KEY_PERSONNEL_IDENTIFY_EVENT.equals(eventType)) { //判断所属人脸分组 JSONObject data = (JSONObject) event.get("data"); JSONObject faceRecognitionResult = (JSONObject) data.get("faceRecognitionResult"); @@ -142,52 +163,101 @@ if (faceGroupCode.equals(blackListGroup.getFaceGroupCode())) { //黑名单分组处理 caseInfo1 = hikService.blackListHandle(event, caseInfo1); - }else if(faceGroupCode.equals(propertyPersonnelGroup.getFaceGroupCode())){ + } else if (faceGroupCode.equals(propertyPersonnelGroup.getFaceGroupCode())) { //考勤分组处理-物业人员,添加到考勤表 hikService.propertyAttendanceHandle(event); - }else if(faceGroupCode.equals(securityPersonnelGroup.getFaceGroupCode())){ + } else if (faceGroupCode.equals(securityPersonnelGroup.getFaceGroupCode())) { //考勤分组处理-安保人员,添加到考勤表 hikService.securityPersonnelHandle(event); - }else { + } else { return; } - }else if(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT == eventType){ + } else if (SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT.equals(eventType)) { //离岗事件处理 caseInfo1 = hikService.demobilizedHandle(event, caseInfo1); - }else if(SecurityEventType.PERSONNEL_GATHER_EVENT == eventType){ + } else if (SecurityEventType.PERSONNEL_GATHER_EVENT.equals(eventType)) { //人员聚集事件处理 caseInfo1 = hikService.personGatherHandle(event, caseInfo1); - }else if(SecurityEventType.MONITORING_POINT_OFFLINE == eventType){ + } else if (SecurityEventType.MONITORING_POINT_OFFLINE.equals(eventType)) { //监控点离线事件处理 caseInfo1 = hikService.monitorPointOfflineHandle(event, caseInfo1); - }else if(SecurityEventType.DEVICE_OFFLINE == eventType){ + } else if (SecurityEventType.MONITORING_POINT_ONLINE.equals(eventType)) { + //监控点上线事件处理 + hikService.monitorPointOnlineHandle(event); + } else if (SecurityEventType.DEVICE_OFFLINE.equals(eventType)) { //装置离线事件处理 caseInfo1 = hikService.deviceOfflineHandle(event, caseInfo1); - }else if(SecurityEventType.VISITOR_REGISTER == eventType){ + } else if (SecurityEventType.DEVICE_ONLINE.equals(eventType)) { + //装置上线处理 + hikService.deviceOnlineHandle(event); + } else if (SecurityEventType.VISITOR_REGISTER.equals(eventType)) { //记录访客登记记录,添加到访客记录表 hikService.visitorRegisterHandler(event); - }else if(SecurityEventType.VISITOR_CHECKOUT == eventType){ + } else if (SecurityEventType.VISITOR_CHECKOUT.equals(eventType)) { //记录访客签离记录 hikService.visitorCheckOutHandler(event); } - if(!Objects.isNull(caseInfo1) && !StringUtils.isEmpty(caseInfo1.getHappenTime())){ + if (!Objects.isNull(caseInfo1) && !StringUtils.isEmpty(caseInfo1.getHappenTime())) { caseInfos.add(caseInfo1); } } //3、安防事件入库 - if(!caseInfoService.insertCaseInfoBatch(caseInfos)){ - log.error("安防事件批量入库异常"); + if (!CollectionUtils.isEmpty(caseInfos) && !caseInfoService.insertCaseInfoBatch(caseInfos)) { + log.error("安防事件批量入库异常!"); } // TODO: 2022/8/15 webSocket推送 + if (CollectionUtils.isEmpty(caseInfos)) { + log.info("webSocket事件推送"); + webSocket.sendAllMessage(JSONObject.toJSONString(caseInfos)); + } return; } /** + * 以图搜图,前端用于轨迹追踪 + */ + @PostMapping("/hik/search/picture") + @ResponseBody + public Object searchPictures(@RequestBody SearchPicturesRequest searchPicturesRequest) { + DateTime startDateTime = DateUtil.parse(searchPicturesRequest.getStartTime()); + DateTime endDateTime = DateUtil.parse(searchPicturesRequest.getEndTime()); + String startTime = DateUtil.format(startDateTime, "yyyy-MM-dd'T'HH:mm:ss.SSSXXX"); + String endTime = DateUtil.format(endDateTime, "yyyy-MM-dd'T'HH:mm:ss.SSSXXX"); + searchPicturesRequest.setStartTime(startTime); + searchPicturesRequest.setEndTime(endTime); + String body = JSONObject.toJSONString(searchPicturesRequest); + String resultStr = HikUtil.hikApi(HikUri.SEARCH_PICTURES, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (!"0".equals(resultJson.get("code"))) { + log.error("请求海康,以图搜图失败,海康response:{}", resultStr); + return ResponseData.error("以图搜图失败"); + } + return ResponseData.success(resultJson); + } + + + /** + * 海康事件取消订阅 + */ + @PostMapping("/hik/event/cancel") + @ResponseBody + public Object eventCancelSubscribe(@RequestBody CancelSubscribeRequest cancelSubscribeRequest) { + String body = JSONObject.toJSONString(cancelSubscribeRequest); + String resultStr = HikUtil.hikApi(HikUri.EVENT_CANCEL, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (!"0".equals(resultJson.get("code"))) { + log.error("请求海康,取消订阅失败,海康response:{}", resultStr); + return ResponseData.error("取消订阅失败"); + } + return ResponseData.success(resultJson); + } + + /** * 单个添加海康人脸分组 * api->hik单个添加人脸分组api->response->mysql */ - @PostMapping("/faceGroup/single/add") + @PostMapping("/hik/faceGroup/single/add") @ResponseBody public Object faceGroupAddition(@RequestBody FaceGroupAdditionRequest faceGroupAdditionRequest) { String body = JSONObject.toJSONString(faceGroupAdditionRequest); @@ -212,7 +282,7 @@ * 批量添加海康组织 * api->hik批量添加组织api->response */ - @PostMapping("/org/batch/add") + @PostMapping("/hik/org/batch/add") @ResponseBody public Object orgBatchAdd(@RequestBody List orgBatchAddRequest) { String body = JSONObject.toJSONString(orgBatchAddRequest); @@ -232,4 +302,62 @@ return ResponseData.error("批量添加组织失败"); } + /** + * 获取人员列表 + */ + @PostMapping("/hik/person/personList") + @ResponseBody + public Object personList() { + PersonListRequest request = new PersonListRequest(); + request.setPageNo(1); + request.setPageSize(100); + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi("/api/resource/v2/person/personList", body); + return resultStr; + } + + /** + * 获取组织列表 + */ + @PostMapping("/hik/org/orgList") + @ResponseBody + public Object orgList() { + PersonListRequest request = new PersonListRequest(); + request.setPageNo(1); + request.setPageSize(100); + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi("/api/resource/v1/org/orgList", body); + return resultStr; + } + + /** + * 查询访客权限下载记录 + */ + @PostMapping("/hik/auth/result") + @ResponseBody + public Object authResult() { + PersonListRequest request = new PersonListRequest(); + request.setPageNo(1); + request.setPageSize(100); + request.setOrderId("ba101db6246711edaea66f7939a13638"); + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi("/api/visitor/v1/auth/result", body); + return resultStr; + } + + /** + * 人脸图片获取 + */ + @PostMapping("/hik/face/picture") + @ResponseBody + public Object facePicture() { + FaceRequest request = new FaceRequest(); +// List list = new ArrayList<>(); +// list.add(""); + request.setCertificateNum("wanggong"); + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi("/api/frs/v1/face", body); + return resultStr; + } + } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/AssetInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/AssetInfoMapper.java index 4f64e83..c0684ee 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/AssetInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/AssetInfoMapper.java @@ -17,6 +17,6 @@ @Mapper public interface AssetInfoMapper extends BaseMapper { - List getAssetInfoListPage(@Param("page") Page page, AssetInfoRequest assetInfoRequest); + List getAssetInfoListPage(@Param("page") Page page, @Param("assetInfoRequest") AssetInfoRequest assetInfoRequest); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/AttendanceInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/AttendanceInfoMapper.java index f9e793e..ec87e46 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/AttendanceInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/AttendanceInfoMapper.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.statistics.AttendanceNumberDTO; import com.casic.missiles.modular.dto.statistics.AttendanceRatioDTO; import com.casic.missiles.modular.model.AttendanceInfo; import org.apache.ibatis.annotations.Mapper; @@ -17,7 +18,7 @@ */ @Mapper public interface AttendanceInfoMapper extends BaseMapper { - List getAttendanceInfoListPage(@Param("page") Page page, StaffInfoRequest attendanceInfoRequest); + List getAttendanceInfoListPage(@Param("page") Page page, @Param("attendanceInfoRequest") StaffInfoRequest attendanceInfoRequest); AttendanceInfo selectByCodeAndDate(@Param("staffCode") String staffCode); @@ -26,4 +27,8 @@ List getCountByTypeAndDateForMonth(@Param("staffType")String staffType); List getCountByTypeAndDateForYear(@Param("staffType")String staffType); + + List getCountForWeek(); + + List getCountForDay(); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java index ce94b8f..6137a7d 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java @@ -17,5 +17,5 @@ @Mapper public interface BlackInfoMapper extends BaseMapper { - List getBlackInfoListPage(@Param("page") Page page, BlackInfoRequest blackInfoRequest); + List getBlackInfoListPage(@Param("page") Page page, @Param("blackInfoRequest") BlackInfoRequest blackInfoRequest); } 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 efda6b3..50aaa6f 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 @@ -20,7 +20,7 @@ List getCaseInfoListPage(@Param("page") Page page, @Param("caseInfoRequest") CaseInfoRequest caseInfoRequest); - int updateStatusById(CaseInfoRequest caseInfoRequest); + int updateStatusById(@Param("caseInfoRequest") CaseInfoRequest caseInfoRequest); List selectByLevelAndMonth(@Param("year") String year); @@ -47,4 +47,20 @@ List selectPreWeekCountByThirtyDay(); List selectPreDayCountBySevenDay(); + + Integer selectDemobilizedCount(@Param("eventType") Number personnelDemobilizedEvent); + + List selectPreMonthCount(); + + List selectListBySevenDay(); + + List selectListByToday(); + + List selectListByToday2(); + + List selectListByToday3(); + + List selectListByType(@Param("eventType") Number eventType); + + List selectDemobilizedCountByHour(@Param("eventType") Number eventType); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/CategoryLevelMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/CategoryLevelMapper.java index 52fc714..afe1650 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/CategoryLevelMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/CategoryLevelMapper.java @@ -17,9 +17,9 @@ @Mapper public interface CategoryLevelMapper extends BaseMapper { - List getCaseCategoryLevelListPage(@Param("page") Page page, CategoryLevelRequest categoryLevelRequest); + List getCaseCategoryLevelListPage(@Param("page") Page page, @Param("categoryLevelRequest") CategoryLevelRequest categoryLevelRequest); - List getCaseCategoryLevelList(CategoryLevelRequest categoryLevelRequest); + List getCaseCategoryLevelList(@Param("categoryLevelRequest") CategoryLevelRequest categoryLevelRequest); CaseCategoryLevel getCaseCategoryLevel(@Param("categoryLevelCode") String categoryLevelCode); 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 66353b1..2555a09 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 @@ -19,7 +19,7 @@ @Mapper public interface DeviceInfoMapper extends BaseMapper { - List getDeviceInfoListPage(@Param("page") Page page, DeviceInfoRequest deviceInfoRequest); + List getDeviceInfoListPage(@Param("page") Page page, @Param("deviceInfoRequest") DeviceInfoRequest deviceInfoRequest); List getDeviceInfoList(@Param("deviceInfoRequest") DeviceInfoRequest deviceInfoRequest); @@ -27,6 +27,8 @@ DeviceInfo getByIndexCode(@Param("srcIndex") String srcIndex); + DeviceInfo getByIp(@Param("ip") String ip); + List selectIndexCodesByCodes(@Param("deviceCodes") List deviceCodes); List selectByType(@Param("devType") String devType); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java index 41dd0af..5bfaf63 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java @@ -5,6 +5,7 @@ import com.casic.missiles.modular.dto.DeviceRepairRequest; import com.casic.missiles.modular.model.DeviceRepairLog; import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; import java.util.List; @@ -16,7 +17,7 @@ @Mapper public interface DeviceRepairLogMapper extends BaseMapper { - List getDeviceRepairListPage(Page page, DeviceRepairRequest deviceRepairRequest); + List getDeviceRepairListPage(@Param("page") Page page, @Param("deviceRepairRequest")DeviceRepairRequest deviceRepairRequest); - List getDeviceRepairList(DeviceRepairRequest deviceRepairRequest); + List getDeviceRepairList(@Param("deviceRepairRequest") DeviceRepairRequest deviceRepairRequest); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java index 9035c47..4823ac1 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java @@ -18,7 +18,7 @@ @Mapper public interface FireEquipInfoMapper extends BaseMapper { - List getFireEquipInfoListPage(@Param("page") Page page, FireEquipRequest fireEquipRequest); + List getFireEquipInfoListPage(@Param("page") Page page, @Param("fireEquipRequest") FireEquipRequest fireEquipRequest); FireEquipInfo getFireEquipInfo(@Param("equipCode") String equipCode); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/GateGroupMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/GateGroupMapper.java index d8c330d..977a427 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/GateGroupMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/GateGroupMapper.java @@ -17,7 +17,7 @@ */ @Mapper public interface GateGroupMapper extends BaseMapper { - List getGateGroupListPage(@Param("page") Page page, GateGroupRequest gateGroupRequest); + List getGateGroupListPage(@Param("page") Page page, @Param("gateGroupRequest") GateGroupRequest gateGroupRequest); GateGroup getGateGroupByName(@Param("groupName") String groupName); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/HazardLevelMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/HazardLevelMapper.java index 8957780..dcf47bb 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/HazardLevelMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/HazardLevelMapper.java @@ -17,11 +17,13 @@ @Mapper public interface HazardLevelMapper extends BaseMapper { - List getCaseHazardLevelListPage(@Param("page") Page page, HazardLevelRequest hazardLevelRequest); + List getCaseHazardLevelListPage(@Param("page") Page page, @Param("hazardLevelRequest") HazardLevelRequest hazardLevelRequest); - List getCaseHazardLevelList(HazardLevelRequest hazardLevelRequest); + List getCaseHazardLevelList(@Param("hazardLevelRequest") HazardLevelRequest hazardLevelRequest); CaseHazardLevel getCaseHazardLevel(@Param("hazardLevelCode") String hazardLevelCode); List selectHazardName(); + + String selectHazardNameByCode(@Param("hazardLevelCode") String hazardLevelCode); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/HikCaseDefineMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/HikCaseDefineMapper.java index 0dc47d1..f162fef 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/HikCaseDefineMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/HikCaseDefineMapper.java @@ -12,5 +12,5 @@ */ @Mapper public interface HikCaseDefineMapper extends BaseMapper { - HikCaseDefine getHikCaseDefine(@Param("caseTypeCode") Long caseTypeCode); + HikCaseDefine getHikCaseDefine(@Param("caseTypeCode") Number caseTypeCode); } 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 f8a674c..fe5afc2 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 @@ -17,11 +17,13 @@ @Mapper public interface StaffInfoMapper extends BaseMapper { - List getStaffInfoListPage(@Param("page") Page page, StaffInfoRequest staffInfoRequest); + List getStaffInfoListPage(@Param("page") Page page, @Param("staffInfoRequest") StaffInfoRequest staffInfoRequest); StaffInfo selectByCode(@Param("staffCode") String staffCode); - List getStaffInfoList(StaffInfoRequest staffInfoRequest); + List getStaffInfoList(@Param("staffInfoRequest") StaffInfoRequest staffInfoRequest); - List selectBatchCodes(List list); + List selectBatchCodes(@Param("list") List list); + + int updateByCodeForCard(@Param("staffCode") String staffCode, @Param("cardNo") String cardNo); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitInfoMapper.java index b1217c5..6c52542 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitInfoMapper.java @@ -16,7 +16,7 @@ */ @Mapper public interface VisitInfoMapper extends BaseMapper { - List getVisitInfoListPage(@Param("page") Page page, VisitorRequest visitorRequest); + List getVisitInfoListPage(@Param("page") Page page, @Param("visitorRequest") VisitorRequest visitorRequest); VisitInfo selectByOrderId(@Param("orderId") String orderId); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitorApplyMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitorApplyMapper.java index c09f3c0..6ea55bd 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitorApplyMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitorApplyMapper.java @@ -18,7 +18,7 @@ @Mapper public interface VisitorApplyMapper extends BaseMapper { - List getVisitorApplyListPage(@Param("page") Page page, VisitorApplyRequest visitorApplyRequest); + List getVisitorApplyListPage(@Param("page") Page page, @Param("visitorApplyRequest") VisitorApplyRequest visitorApplyRequest); List selectByVisitReason(); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/AttendanceInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/AttendanceInfoMapper.xml index b2ece71..f8bdd6e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/AttendanceInfoMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/AttendanceInfoMapper.xml @@ -43,7 +43,8 @@ and staff_type = #{staffType} - and YEARWEEK(date_format(atte_date, '%Y-%m-%d'), 1) = YEARWEEK(now(),1); + AND DATE_SUB(CURDATE(), INTERVAL 7 DAY) <= DATE(atte_date) + GROUP BY DATE_FORMAT(atte_date, '%Y-%m-%d') @@ -69,4 +70,20 @@ GROUP BY DATE_FORMAT(atte_date, '%Y-%m') + + + \ No newline at end of file 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 2b6953f..06ec0a8 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 @@ -28,7 +28,9 @@ @@ -87,7 +89,8 @@ SELECT hazard_level_code as levelCode, count(id) as quantity FROM bus_case_info WHERE hazard_level_code is not null - AND DATE_SUB(CURDATE(), INTERVAL 7 DAY) <= date(happen_time); + AND is_key_area = 1 + AND DATE_SUB(CURDATE(), INTERVAL 7 DAY) <= date(happen_time) GROUP BY hazard_level_code @@ -95,7 +98,8 @@ SELECT hazard_level_code as levelCode, count(id) as quantity FROM bus_case_info WHERE hazard_level_code is not null - AND DATE_SUB(CURDATE(), INTERVAL 30 DAY) <= date(happen_time); + AND is_key_area = 1 + AND DATE_SUB(CURDATE(), INTERVAL 30 DAY) <= date(happen_time) GROUP BY hazard_level_code @@ -122,4 +126,71 @@ AND hazard_level_code is not null GROUP BY DATE_FORMAT(happen_time,'%Y-%m-%d') + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/CategoryLevelMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/CategoryLevelMapper.xml index 4670b1f..1d25cbd 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/CategoryLevelMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/CategoryLevelMapper.xml @@ -20,11 +20,11 @@ SELECT * FROM bus_case_category_level WHERE 1=1 - - and code = #{code} + + and code = #{categoryLevelRequest.code} - - and name = #{name} + + and name = #{categoryLevelRequest.name} ORDER by create_time DESC 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 9b66fd8..bfd84b7 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 @@ -98,4 +98,10 @@ #{item} + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceRepairLogMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceRepairLogMapper.xml index 078ed3c..cf1a481 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceRepairLogMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceRepairLogMapper.xml @@ -22,14 +22,14 @@ SELECT * FROM bus_device_repair_log WHERE 1=1 - - and device_code = #{devCode} + + and device_code = #{deviceRepairRequest.devCode} - - and device_name = #{devName} + + and device_name = #{deviceRepairRequest.devName} - - and DATE_FORMAT(create_time,"%y%m%d") = DATE_FORMAT(#{createTime},"%y%m%d") + + and DATE_FORMAT(create_time,"%y%m%d") = DATE_FORMAT(#{deviceRepairRequest.createTime},"%y%m%d") ORDER by create_time DESC diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/HazardLevelMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/HazardLevelMapper.xml index f16f2b9..458322b 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/HazardLevelMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/HazardLevelMapper.xml @@ -20,11 +20,11 @@ SELECT * FROM bus_case_hazard_level WHERE 1=1 - - and code = #{code} + + and code = #{hazardLevelRequest.code} - - and name = #{name} + + and name = #{hazardLevelRequest.name} ORDER by create_time DESC @@ -42,4 +42,10 @@ SELECT name FROM bus_case_hazard_level + + \ 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 557237e..b6a183a 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 @@ -50,4 +50,10 @@ + + + UPDATE bus_staff_info + SET card_no = #{cardNo} + WHERE staff_code = #{staffCode} + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitInfoMapper.xml index 84aa84f..230529a 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitInfoMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitInfoMapper.xml @@ -27,5 +27,6 @@ SELECT * FROM bus_visit_info WHERE order_id = #{orderId} and DATE_FORMAT(in_time,'%Y-%m-%d') = CURRENT_DATE + limit 1 \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/BlackPictureRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/BlackPictureRequest.java new file mode 100644 index 0000000..fc92701 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/BlackPictureRequest.java @@ -0,0 +1,14 @@ +package com.casic.missiles.modular.dto; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/29 19:26 + */ +@Data +public class BlackPictureRequest { + private String picUri; + private String serverIndexCode; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/CancelSubscribeRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/CancelSubscribeRequest.java new file mode 100644 index 0000000..e2d390a --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/CancelSubscribeRequest.java @@ -0,0 +1,15 @@ +package com.casic.missiles.modular.dto.hik; + +import lombok.Data; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/24 15:14 + */ +@Data +public class CancelSubscribeRequest { + private List eventTypes; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/CardInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/CardInfo.java new file mode 100644 index 0000000..341457d --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/CardInfo.java @@ -0,0 +1,24 @@ +package com.casic.missiles.modular.dto.hik; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/26 16:08 + */ +@Data +public class CardInfo { + //卡号,8~20个字符,支持数字和大写字母 + private String cardNo; + //人员ID,员工工号 + private String personId; + //人员所属组织IndexCode + private String orgIndexCode; + //卡片类型,默认是1:IC卡 + //1:IC卡 + //2:CPU卡 + //3:远距离卡 + //4:MIFARE卡 + private Number cardType; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/FaceRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/FaceRequest.java new file mode 100644 index 0000000..edc04bf --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/FaceRequest.java @@ -0,0 +1,16 @@ +package com.casic.missiles.modular.dto.hik; + +import lombok.Data; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/25 16:53 + */ +@Data +public class FaceRequest { + private String certificateNum; + private List indexCodes; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/HikRecvEvent.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/HikRecvEvent.java index a3e9845..1b2b2b1 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/HikRecvEvent.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/HikRecvEvent.java @@ -28,12 +28,12 @@ /** * 事件类型,用于判断所需接收到的事件类型 */ - public Long getEventType(){ + public Number getEventType(){ JSONObject jsonObject = (JSONObject)JSONObject.toJSON(params); //事件类别对应SecurityEventTypeEnum JSONArray eventTypeArray = (JSONArray)jsonObject.get("events"); JSONObject eventJsonObject = (JSONObject)JSONObject.toJSON(eventTypeArray.get(0)); - Long eventType = (Long) eventJsonObject.get("eventType"); + Number eventType = (Number) eventJsonObject.get("eventType"); return eventType; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonBatchDeleteRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonBatchDeleteRequest.java index 027d31d..9751929 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonBatchDeleteRequest.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonBatchDeleteRequest.java @@ -12,4 +12,6 @@ @Data public class PersonBatchDeleteRequest { private List personIds; + //删除人脸接口使用 + private String faceId; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonInfoRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonInfoRequest.java new file mode 100644 index 0000000..05dc9e1 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonInfoRequest.java @@ -0,0 +1,20 @@ +package com.casic.missiles.modular.dto.hik; + +import lombok.Data; + +import java.util.List; + +/** + * @Description: 获取员工照片请求实体 + * @Author: wangpeng + * @Date: 2022/8/25 16:53 + */ +@Data +public class PersonInfoRequest { + //获取员工详细信息使用 + private String paramName; + private List paramValue; + //获取照片使用 + private String picUri; + private String serverIndexCode; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/BlackListController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/BlackListController.java index a27f9f8..0c06661 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/BlackListController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/BlackListController.java @@ -1,13 +1,18 @@ package com.casic.missiles.modular.controller; +import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.base.controller.ExportController; import com.casic.missiles.core.page.PageFactory; import com.casic.missiles.model.response.ResponseData; import com.casic.missiles.modular.dto.BlackInfoRequest; +import com.casic.missiles.modular.dto.BlackPictureRequest; +import com.casic.missiles.modular.dto.hik.PersonInfoRequest; +import com.casic.missiles.modular.enums.HikUri; import com.casic.missiles.modular.enums.OperateTypeEnum; import com.casic.missiles.modular.model.BlackInfo; import com.casic.missiles.modular.service.BlackInfoService; +import com.casic.missiles.modular.util.HikUtil; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; @@ -56,4 +61,22 @@ return null; } + /** + * 黑名单人员照片 + */ + @PostMapping("/personPicture") + @ResponseBody + public Object personPicture(@RequestBody BlackPictureRequest blackPictureRequest){ + //获取照片 + String picUri = blackPictureRequest.getPicUri(); + String serverIndexCode = blackPictureRequest.getServerIndexCode(); + PersonInfoRequest picRequest = new PersonInfoRequest(); + picRequest.setPicUri(picUri); + picRequest.setServerIndexCode(serverIndexCode); + String reBody = JSONObject.toJSONString(picRequest); + //重定向地址获取 + String url = HikUtil.hikApiFor302(HikUri.PERSON_PICTURE, reBody); + return ResponseData.success(url); + } + } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/DeviceController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/DeviceController.java index e1c4eba..666bbee 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/DeviceController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/DeviceController.java @@ -107,7 +107,7 @@ } /** - * 设备维修管理查询(分页),需计算MTTR=总维修时间/故障次数 + * 设备状态计算与评判/设备维修管理查询(分页),需计算MTTR=总维修时间/故障次数 */ @PostMapping("/repair/listPage") @ResponseBody @@ -211,7 +211,7 @@ //需根据设备编号获取到对应的门禁点唯一标识 doorControlRequest.setDoorIndexCodes(indexCodes); doorControlRequest.setControlType(Integer.valueOf(gateGroupDTO.getStatus())); - String body = JSONObject.toJSONString(deviceCodes); + String body = JSONObject.toJSONString(doorControlRequest); String resultStr = HikUtil.hikApi(HikUri.DOOR_CONTROL, body); JSONObject resultJson = (JSONObject)JSONObject.parse(resultStr); if (!"0".equals(resultJson.get("code"))) { diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/StaffController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/StaffController.java index b58ccab..704093c 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/StaffController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/StaffController.java @@ -2,15 +2,21 @@ import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.util.StrUtil; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.base.controller.ExportController; import com.casic.missiles.core.page.PageFactory; import com.casic.missiles.model.response.ErrorResponseData; import com.casic.missiles.model.response.ResponseData; import com.casic.missiles.modular.dto.StaffInfoRequest; +import com.casic.missiles.modular.dto.hik.PersonInfoRequest; +import com.casic.missiles.modular.dto.hik.StaffCardRequest; +import com.casic.missiles.modular.enums.HikUri; import com.casic.missiles.modular.enums.OperateTypeEnum; import com.casic.missiles.modular.model.StaffInfo; import com.casic.missiles.modular.service.StaffInfoService; +import com.casic.missiles.modular.util.HikUtil; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; @@ -110,4 +116,60 @@ } return ResponseData.success(); } + + /** + * 批量开卡,添加人员之后调用,若在一个接口中添加人员成功开卡失败则第二次添加时会有问题 + */ + @PostMapping("/cardBinding") + @ResponseBody + public Object cardBinding(@RequestBody StaffCardRequest staffCardRequest) { + String body = JSONObject.toJSONString(staffCardRequest); + String resultStr = HikUtil.hikApi(HikUri.CARD_BINDING, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (!"0".equals(resultJson.get("code"))) { + log.error("请求海康,批量开卡失败,海康response:{}", resultStr); + return ResponseData.error("批量开卡失败"); + } + //保存卡号 + if(staffInfoService.saveCardInfo(staffCardRequest) > 0){ + return ResponseData.success(); + } + return ResponseData.error("批量开卡失败"); + } + + /** + * 获取员工照片,海康存储 + */ + @PostMapping("/personPicture/{staffCode}") + @ResponseBody + public Object personPicture(@PathVariable("staffCode") String staffCode){ + //获取员工详细信息,含图片服务器、uri + PersonInfoRequest request = new PersonInfoRequest(); + List list = new ArrayList<>(); + list.add(staffCode); + request.setParamName("personId"); + request.setParamValue(list); + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi(HikUri.PERSON_INFO, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (!"0".equals(resultJson.get("code"))) { + log.error("请求海康,根据人员唯一字段获取人员详细信息失败,海康response:{}", resultStr); + return ResponseData.error("获取员工照片失败"); + } + //获取照片 + JSONObject data = (JSONObject) resultJson.get("data"); + JSONArray dataArray = (JSONArray) data.get("list"); + JSONObject jsonObject = (JSONObject) dataArray.get(0); + JSONArray personPhoto = (JSONArray) jsonObject.get("personPhoto"); + JSONObject photo = (JSONObject) personPhoto.get(0); + String picUri = photo.getString("picUri"); + String serverIndexCode = photo.getString("serverIndexCode"); + PersonInfoRequest picRequest = new PersonInfoRequest(); + picRequest.setPicUri(picUri); + picRequest.setServerIndexCode(serverIndexCode); + String reBody = JSONObject.toJSONString(picRequest); + //重定向地址获取 + String url = HikUtil.hikApiFor302(HikUri.PERSON_PICTURE, reBody); + return ResponseData.success(url); + } } 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 4a07dd9..7b1dcf6 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 @@ -16,6 +16,7 @@ import com.casic.missiles.modular.redis.key.CacheKeys; import com.casic.missiles.modular.service.CockpitService; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.util.CollectionUtils; import org.springframework.web.bind.annotation.*; @@ -24,10 +25,7 @@ import java.text.NumberFormat; import java.time.LocalDateTime; import java.time.temporal.ChronoUnit; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.util.*; import java.util.stream.Collectors; /** @@ -73,6 +71,9 @@ private StatisticNumberMapper numberMapper; @Autowired + private HazardLevelMapper hazardLevelMapper; + + @Autowired private AccessGroupConfig accessGroupConfig; /** @@ -104,8 +105,24 @@ public Object buildingNumberPerHour(){ //当天按小时分组的人数 List list = numberMapper.selectListByTime(); - Map> collect = list.stream().collect(Collectors.groupingBy(BuildingNumberDTO::getStatisticPosition)); - return ResponseData.success(collect); + Map> collect = list.stream().collect(Collectors.groupingBy(BuildingNumberDTO::getStatisticTime)); + //定时任务中已将每小时三栋楼人数存到数据库 + //将一期主楼和录制楼人数合并,二期单算 + List> resultList = new ArrayList<>(); + collect.keySet().forEach(key -> { + List buildingNumberDTOS = collect.get(key); + BuildingNumberDTO mainBuildingOne = buildingNumberDTOS.get(0); + BuildingNumberDTO mainBuildingTwo = buildingNumberDTOS.get(1); + BuildingNumberDTO recordingBuilding = buildingNumberDTOS.get(2); + HashMap resultMap = new HashMap<>(); + Integer oneQuantity = Integer.valueOf(mainBuildingOne.getStatisticQuantity()); + Integer recordingQuantity = Integer.valueOf(recordingBuilding.getStatisticQuantity()); + resultMap.put("staticTime", mainBuildingOne.getStatisticTime()); + resultMap.put(mainBuildingOne.getStatisticPositionName()+"、"+recordingBuilding.getStatisticPositionName(), String.valueOf(oneQuantity+recordingQuantity)); + resultMap.put(mainBuildingTwo.getStatisticPositionName(), mainBuildingTwo.getStatisticQuantity()); + resultList.add(resultMap); + }); + return ResponseData.success(resultList); } /** @@ -151,12 +168,11 @@ public Object securityNumber() { QueryWrapper wrapper = new QueryWrapper<>(); wrapper.eq("staff_type", 2); + // TODO: 2022/9/2 后续使用产品确定的每天出勤的安保人员的数量 Integer total = staffInfoMapper.selectCount(wrapper); - //当日离岗事件个数 - QueryWrapper wrapper1 = new QueryWrapper<>(); - wrapper1.eq("hik_event_type", SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); - wrapper1.apply("date_format(now(),'%Y-%m-%d') = date_format(happen_time,'%Y-%m-%d')"); - Integer leave = caseInfoMapper.selectCount(wrapper1); + //当日离岗事件按设备去重后的个数 + // TODO: 2022/9/2 目前相当于24小时内的计算,之后看需要可改成自定义小时数计算离岗率,即离岗+6小时内仅一次离岗则恢复为100%,多次则累加离岗次数计算离岗率 + Integer leave = caseInfoMapper.selectDemobilizedCount(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); NumberFormat numberFormat = NumberFormat.getInstance(); // 设置精确到小数点后2位 numberFormat.setMaximumFractionDigits(2); @@ -179,7 +195,6 @@ @ResponseBody public Object visitorApplyDetail() { List reasonGroup = applyMapper.selectByVisitReason(); - HashMap resultMap = new HashMap<>(); NumberFormat numberFormat = NumberFormat.getInstance(); // 设置精确到小数点后2位 numberFormat.setMaximumFractionDigits(2); @@ -187,12 +202,17 @@ if(0 == sum){ return ResponseData.success(); } + List resultList = new ArrayList<>(); reasonGroup.forEach(group -> { String reasonName = dictService.getDictNameByCode(SecurityEventDict.VISIT_REASON, group.getVisitReason()); String result = numberFormat.format((float) group.getQuantity() / (float) sum * 100); - resultMap.put(reasonName, result+"%"); + ApplyReasonGroupDTO applyReasonGroupDTO = new ApplyReasonGroupDTO(); + applyReasonGroupDTO.setQuantity(group.getQuantity()); + applyReasonGroupDTO.setVisitReason(reasonName); + applyReasonGroupDTO.setRatio(result+"%"); + resultList.add(applyReasonGroupDTO); }); - return ResponseData.success(resultMap); + return ResponseData.success(resultList); } /** @@ -247,6 +267,32 @@ } /** + * 机动力量实时在岗率,在岗人数除以总应在岗人数,用离岗+6小时内恢复为100%,6小时外再计算 + */ + @GetMapping("/staff/beOnDutyRatio") + @ResponseBody + public Object beOnDutyRatio() { + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("staff_type", 2); + // TODO: 2022/9/2 后续使用产品确定的每天出勤的安保人员的数量 + Integer total = staffInfoMapper.selectCount(wrapper); + if(0 == total){ + return ResponseData.success(null); + } + //当日离岗事件按设备去重后的个数 + // TODO: 2022/9/2 目前相当于24小时内的计算,之后看需要可改成自定义小时数计算离岗率,即离岗+6小时内仅一次离岗则恢复为100%,多次则累加离岗次数计算离岗率 + List onDutyRatioDTOS = caseInfoMapper.selectDemobilizedCountByHour(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); + onDutyRatioDTOS.forEach(dto -> { + NumberFormat numberFormat = NumberFormat.getInstance(); + // 设置精确到小数点后2位 + numberFormat.setMaximumFractionDigits(2); + String result = numberFormat.format(100 - Float.valueOf(dto.getQuantity()) / (float) total * 100); + dto.setRatio(result+"%"); + }); + return ResponseData.success(onDutyRatioDTOS); + } + + /** * 闸机速通门统计-设备状态分组计算数量,devType传闸机字典key * 视频频监控摄像机统计-设备状态分组计算数量,devType传摄像头字典key */ @@ -262,12 +308,17 @@ if(sum <= 0){ return ResponseData.error("无该类设备信息"); } + List resultList = new ArrayList<>(); gateStatusGroup.forEach(group -> { String devStatus = dictService.getDictNameByCode(SecurityEventDict.DEVICE_STATUS, group.getStatus()); String result = numberFormat.format((float) group.getQuantity() / (float) sum * 100); - resultMap.put(devStatus, result+"%"); + GateStatusGroupResponse gateStatusGroupResponse = new GateStatusGroupResponse(); + gateStatusGroupResponse.setStatus(devStatus); + gateStatusGroupResponse.setRatio(result+"%"); + resultList.add(gateStatusGroupResponse); }); - resultMap.put("总", sum); + resultMap.put("total", sum); + resultMap.put("list", resultList); return ResponseData.success(resultMap); } @@ -282,17 +333,38 @@ String position = securityScoreDTO.getPosition(); List caseInfos = caseInfoMapper.selectByPosition(position); //查询各危险级别权重、各类别权重,放入map,避免循环中多次查数据库 - + HashMap hazardScoreMap = new HashMap<>(); + List caseHazardLevelList = hazardLevelMapper.getCaseHazardLevelList(null); + caseHazardLevelList.forEach(hazardLevel -> { + hazardScoreMap.put(hazardLevel.getCode(), hazardLevel.getWeight()); + }); + HashMap categoryScoreMap = new HashMap<>(); + List categoryLevelList = categoryLevelMapper.getCaseCategoryLevelList(null); + categoryLevelList.forEach(categoryLevel -> { + categoryScoreMap.put(categoryLevel.getCode(), categoryLevel.getWeight()); + }); + //事件按楼层分组,计算 List securityScoreDTOs = new ArrayList<>(); caseInfos.forEach(caseInfo -> { SecurityScoreDTO securityScoreDTO1 = new SecurityScoreDTO(); + securityScoreDTO1.setPosition(caseInfo.getPosition()); securityScoreDTO1.setArea(caseInfo.getArea()); - // TODO: 2022/8/4 楼层评分计算根据产品定义调整 -// caseInfo.get -// securityScoreDTO1.setScore(); + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); + Double score = 100 - Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + securityScoreDTO1.setScore(score); + securityScoreDTOs.add(securityScoreDTO1); }); - - return null; + 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); + }); + return ResponseData.success(securityScoreDTOs); } /** @@ -303,9 +375,13 @@ public Object SecurityFrequency(@RequestBody SecurityFrequencyDTO securityFrequencyDTO) { String year = securityFrequencyDTO.getYear(); String month = securityFrequencyDTO.getMonth(); - Integer quantity = caseInfoMapper.selectCountByMonth(year, month); - securityFrequencyDTO.setQuantity(quantity); - return ResponseData.success(securityFrequencyDTO); + if(!StringUtils.isEmpty(year) && StringUtils.isEmpty(month)){ + Integer quantity = caseInfoMapper.selectCountByMonth(year, month); + securityFrequencyDTO.setQuantity(quantity); + return ResponseData.success(securityFrequencyDTO); + } + List list = caseInfoMapper.selectPreMonthCount(); + return ResponseData.success(list); } } 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 ae4d770..f4f075c 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 @@ -1,20 +1,25 @@ package com.casic.missiles.modular.controller.cockpit; +import cn.hutool.core.date.DateUnit; import cn.hutool.core.date.DateUtil; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.casic.missiles.model.response.ResponseData; -import com.casic.missiles.modular.dao.AttendanceInfoMapper; -import com.casic.missiles.modular.dao.CaseInfoMapper; -import com.casic.missiles.modular.dao.HazardLevelMapper; -import com.casic.missiles.modular.dao.StaffInfoMapper; +import com.casic.missiles.modular.dao.*; +import com.casic.missiles.modular.dto.DeviceRepairLogDTO; +import com.casic.missiles.modular.dto.DeviceRepairRequest; import com.casic.missiles.modular.dto.statistics.*; +import com.casic.missiles.modular.enums.SecurityEventType; +import com.casic.missiles.modular.model.CaseCategoryLevel; import com.casic.missiles.modular.model.CaseHazardLevel; +import com.casic.missiles.modular.model.CaseInfo; import com.casic.missiles.modular.model.StaffInfo; +import com.casic.missiles.modular.service.DeviceInfoService; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.util.CollectionUtils; import org.springframework.web.bind.annotation.*; +import java.math.BigDecimal; import java.text.NumberFormat; import java.util.*; import java.util.stream.Collectors; @@ -40,6 +45,12 @@ @Autowired private HazardLevelMapper hazardLevelMapper; + @Autowired + private CategoryLevelMapper categoryLevelMapper; + + @Autowired + private DeviceInfoService deviceInfoService; + /** * 安防事件时域频次统计,每月的每天安防事件个数(原方案) * 月维度:展示每个月的每天的数据 @@ -89,15 +100,17 @@ List monthList = caseInfoMapper.selectPreMonthCountByYear(year); Map> collect = monthList.stream().collect(Collectors.groupingBy(PreMonthOrWeekCaseDTO::getHazardLevelCode)); HashMap strAvgMap = new HashMap<>(); + List resultList = new ArrayList<>(); for (String key : collect.keySet()) { List preMonthOrWeekCaseDTOS = collect.get(key); int sum = preMonthOrWeekCaseDTOS.stream().mapToInt(PreMonthOrWeekCaseDTO::getQuantity).sum(); //若年份是本年,则使用个安防级别数量/当前月份数 //若不是本年,除数为12 MonthAndWeekDTO monthAndWeekDTO = new MonthAndWeekDTO(); + String hazardName = hazardLevelMapper.selectHazardNameByCode(key); + monthAndWeekDTO.setLevelName(hazardName); if(year.equals(String.valueOf(DateUtil.thisYear()))){ monthAndWeekDTO.setMonthQuantity(sum / DateUtil.thisMonth()); -// monthAndWeekDTO.setLevelName(); strAvgMap.put(key, monthAndWeekDTO); }else{ monthAndWeekDTO.setMonthQuantity(sum / 12); @@ -113,27 +126,37 @@ if(year.equals(String.valueOf(DateUtil.thisYear()))){ if(!Objects.isNull(strAvgMap.get(key))){ MonthAndWeekDTO monthAndWeekDTO = strAvgMap.get(key); + String hazardName = hazardLevelMapper.selectHazardNameByCode(key); + monthAndWeekDTO.setLevelName(hazardName); monthAndWeekDTO.setWeekQuantity(sum / DateUtil.thisWeekOfYear()); strAvgMap.put(key, monthAndWeekDTO); }else{ MonthAndWeekDTO monthAndWeekDTO = new MonthAndWeekDTO(); + String hazardName = hazardLevelMapper.selectHazardNameByCode(key); + monthAndWeekDTO.setLevelName(hazardName); monthAndWeekDTO.setWeekQuantity(sum / DateUtil.thisWeekOfYear()); strAvgMap.put(key, monthAndWeekDTO); } }else{ if(!Objects.isNull(strAvgMap.get(key))){ MonthAndWeekDTO monthAndWeekDTO = strAvgMap.get(key); + String hazardName = hazardLevelMapper.selectHazardNameByCode(key); + monthAndWeekDTO.setLevelName(hazardName); monthAndWeekDTO.setWeekQuantity(sum / 52); strAvgMap.put(key, monthAndWeekDTO); }else{ MonthAndWeekDTO monthAndWeekDTO = new MonthAndWeekDTO(); + String hazardName = hazardLevelMapper.selectHazardNameByCode(key); + monthAndWeekDTO.setLevelName(hazardName); monthAndWeekDTO.setWeekQuantity(sum / 52); strAvgMap.put(key, monthAndWeekDTO); } } } - avgMonthAndWeekGroupDTO.setMap(strAvgMap); - return ResponseData.success(avgMonthAndWeekGroupDTO); + strAvgMap.keySet().forEach(key -> { + resultList.add(strAvgMap.get(key)); + }); + return ResponseData.success(resultList); } /** @@ -181,12 +204,178 @@ } /** - * 员工考勤人数变化,功能待定 + * 员工考勤人数变化,统计当天(横坐标为时)及近7天(横坐标为天)的考勤人数变化,只要发生一次考勤识别,次数的基数就正常增加(没有上班下班区分) */ + @PostMapping("/staff/attendanceNumber/{dimension}") + @ResponseBody + public Object attendanceNumber(@PathVariable("dimension") String dimension) { + List attendanceNumberDTOs = null; + List> resultList = new ArrayList<>(); + if("week".equals(dimension)){ + //近7天数据按天分组统计 + attendanceNumberDTOs = attendanceInfoMapper.getCountForWeek(); + }else if("day".equals(dimension)) { + //今天数据按小时分组统计 + attendanceNumberDTOs = attendanceInfoMapper.getCountForDay(); + } + if(CollectionUtils.isEmpty(attendanceNumberDTOs)){ + return ResponseData.error("该查询条件下,无员工出勤数据!"); + } + Map> collect = attendanceNumberDTOs.stream().collect(Collectors.groupingBy(AttendanceNumberDTO::getDate)); + collect.keySet().forEach(key -> { + List attendanceNumberDTOS = collect.get(key); + AttendanceNumberDTO attendanceNumberDTO = attendanceNumberDTOS.get(0); + AttendanceNumberDTO attendanceNumberDTO2 = attendanceNumberDTOS.get(1); + Map resultMap = new HashMap<>(); + resultMap.put(attendanceNumberDTO.getStaffType(), attendanceNumberDTO.getQuantity()); + resultMap.put(attendanceNumberDTO2.getStaffType(), attendanceNumberDTO2.getQuantity()); + resultMap.put("staticTime", attendanceNumberDTO.getDate()); + resultList.add(resultMap); + }); + return ResponseData.success(resultList); + } /** - * 近30天/近一周安保人员到岗排行 + * 早晚高峰区域安防评估 */ + @PostMapping("/security/assessment/{dimension}") + @ResponseBody + public Object securityAssessment(@PathVariable("dimension") String dimension) { + //查询各危险级别权重、各类别权重,放入map,避免循环中多次查数据库 + HashMap hazardScoreMap = new HashMap<>(); + List caseHazardLevelList = hazardLevelMapper.getCaseHazardLevelList(null); + caseHazardLevelList.forEach(hazardLevel -> { + hazardScoreMap.put(hazardLevel.getCode(), hazardLevel.getWeight()); + }); + HashMap categoryScoreMap = new HashMap<>(); + List categoryLevelList = categoryLevelMapper.getCaseCategoryLevelList(null); + categoryLevelList.forEach(categoryLevel -> { + categoryScoreMap.put(categoryLevel.getCode(), categoryLevel.getWeight()); + }); + HashMap hashMap = new HashMap<>(); + if("week".equals(dimension)){ + //近7天早晚高峰数据 + List caseInfos = caseInfoMapper.selectListBySevenDay(); + //按时间(天)进行分组 + caseInfos.forEach(caseInfo -> { + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); + Double score = Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + String[] array = caseInfo.getHappenTime().split(" "); + String dayTime = array[0]; + BigDecimal preScore; + if(hashMap.containsKey(dayTime)){ + Double aDouble = hashMap.get(dayTime); + preScore = new BigDecimal(aDouble.toString()); + + }else{ + preScore = new BigDecimal("100.0"); + } + BigDecimal nowScore = new BigDecimal(score.toString()); + hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); + }); + return ResponseData.success(hashMap); + }else if("day".equals(dimension)) { + //今天数据按小时分组统计 + List caseInfos = caseInfoMapper.selectListByToday(); + caseInfos.forEach(caseInfo -> { + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); + Double score = Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + String[] array = caseInfo.getHappenTime().split(":"); + String dayTime = array[0]; + BigDecimal preScore; + if(hashMap.containsKey(dayTime)){ + Double aDouble = hashMap.get(dayTime); + preScore = new BigDecimal(aDouble.toString()); + + }else{ + preScore = new BigDecimal("100.0"); + } + BigDecimal nowScore = new BigDecimal(score.toString()); + hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); + }); + return ResponseData.success(hashMap); + } + return null; + } + + /** + * 重点区域安防事态评估,统计重点区域6:00-23:00按小时分组数据 + */ + @GetMapping("/security/keyAreaStatistic") + @ResponseBody + public Object keyAreaStatistic() { + //查询各危险级别权重、各类别权重,放入map,避免循环中多次查数据库 + HashMap hazardScoreMap = new HashMap<>(); + List caseHazardLevelList = hazardLevelMapper.getCaseHazardLevelList(null); + caseHazardLevelList.forEach(hazardLevel -> { + hazardScoreMap.put(hazardLevel.getCode(), hazardLevel.getWeight()); + }); + HashMap categoryScoreMap = new HashMap<>(); + List categoryLevelList = categoryLevelMapper.getCaseCategoryLevelList(null); + categoryLevelList.forEach(categoryLevel -> { + categoryScoreMap.put(categoryLevel.getCode(), categoryLevel.getWeight()); + }); + HashMap hashMap = new HashMap<>(); + //今天数据按小时分组统计 + List caseInfos = caseInfoMapper.selectListByToday2(); + caseInfos.forEach(caseInfo -> { + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); + Double score = Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + String[] array = caseInfo.getHappenTime().split(":"); + String dayTime = array[0]; + BigDecimal preScore; + if(hashMap.containsKey(dayTime)){ + Double aDouble = hashMap.get(dayTime); + preScore = new BigDecimal(aDouble.toString()); + + }else{ + preScore = new BigDecimal("100.0"); + } + BigDecimal nowScore = new BigDecimal(score.toString()); + hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); + }); + return ResponseData.success(hashMap); + } + + /** + * 安防机动支援力量调配响应评估,根据事件已解决状态及已解决时间-发送时间,按时间(小时)分组统计 + */ + @GetMapping("/security/responseAssess") + @ResponseBody + public Object responseAssess() { + //查询各危险级别权重、各类别权重,放入map,避免循环中多次查数据库 + HashMap hazardScoreMap = new HashMap<>(); + List caseHazardLevelList = hazardLevelMapper.getCaseHazardLevelList(null); + caseHazardLevelList.forEach(hazardLevel -> { + hazardScoreMap.put(hazardLevel.getCode(), hazardLevel.getWeight()); + }); + HashMap hashMap = new HashMap<>(); + //今天数据按小时分组统计 + List caseInfos = caseInfoMapper.selectListByToday3(); + caseInfos.forEach(caseInfo -> { + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + //扣分=事件级别权重*未解决小时数 + Date updateTime = DateUtil.parse(caseInfo.getUpdateTime()); + Date happenTime = DateUtil.parse(caseInfo.getHappenTime()); + long between = DateUtil.between(updateTime, happenTime, DateUnit.HOUR); + Double score = Double.valueOf(hazardWeight)*between; + String[] array = caseInfo.getHappenTime().split(":"); + String dayTime = array[0]; + BigDecimal preScore; + if(hashMap.containsKey(dayTime)){ + Double aDouble = hashMap.get(dayTime); + preScore = new BigDecimal(aDouble.toString()); + }else{ + preScore = new BigDecimal("100.0"); + } + BigDecimal nowScore = new BigDecimal(score.toString()); + hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); + }); + return ResponseData.success(hashMap); + } /** * 重点区域威胁事件类型统计,优先级2,统计近7天和近30天 @@ -224,7 +413,34 @@ } /** - * 设备状态计算系数和评判,优先级3,需确认设备恢复时间是否可以获取 + * 近30天/近一周安保人员到岗排行 */ + + /** + * 安保等级评估,发生离岗事件减1分 + */ + @GetMapping("/security/levelAssess") + @ResponseBody + public Object securityLevelAssess() { + //今天数据按小时分组统计 + List resultList = caseInfoMapper.selectListByType(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); + resultList.forEach(result -> { + BigDecimal deScore = new BigDecimal(result.getQuantity()); + BigDecimal preScore = new BigDecimal("100.0"); + result.setScore(preScore.subtract(deScore).doubleValue()); + }); + return ResponseData.success(resultList); + } + + /** + * 设备状态计算系数和评判,即设备维修管理查询(不分页) + */ + @PostMapping("/device/repairList") + @ResponseBody + public Object repairList(@RequestBody DeviceRepairRequest deviceRepairRequest) { + List deviceRepairLogDTOS = deviceInfoService.deviceRepairListPage(deviceRepairRequest); + return ResponseData.success(deviceRepairLogDTOS); + } + } 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 fbf8ab6..c71a15a 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 @@ -1,13 +1,12 @@ package com.casic.missiles.modular.controller.hik; +import cn.hutool.core.date.DateTime; +import cn.hutool.core.date.DateUtil; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.casic.missiles.model.response.ResponseData; import com.casic.missiles.modular.dao.HikFaceGroupInfoMapper; -import com.casic.missiles.modular.dto.hik.EventSubscribeRequest; -import com.casic.missiles.modular.dto.hik.FaceGroupAdditionRequest; -import com.casic.missiles.modular.dto.hik.HikRecvEvent; -import com.casic.missiles.modular.dto.hik.OrgBatchAdd; +import com.casic.missiles.modular.dto.hik.*; import com.casic.missiles.modular.enums.HikUri; import com.casic.missiles.modular.enums.SecurityEventType; import com.casic.missiles.modular.model.CaseInfo; @@ -18,16 +17,20 @@ import com.casic.missiles.modular.util.CaseInfoFactoryUtil; import com.casic.missiles.modular.util.HikUtil; import com.casic.missiles.modular.util.ThreadPoolUtil; +import com.casic.missiles.modular.util.WebSocket; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; -import org.springframework.web.bind.annotation.*; +import org.springframework.util.CollectionUtils; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.RestController; -import java.net.InetAddress; -import java.net.UnknownHostException; import java.util.ArrayList; +import java.util.Iterator; import java.util.List; import java.util.Objects; @@ -38,7 +41,6 @@ */ @Slf4j @RestController -@RequestMapping("/hik") public class HikController { @Autowired @@ -53,28 +55,37 @@ @Autowired private HikService hikService; + @Autowired + private HikFaceGroupInfoMapper hikFaceGroupInfoMapper; + + @Autowired + private WebSocket webSocket; + @Value("${server.port}") private int serverPort; - @Autowired - private HikFaceGroupInfoMapper hikFaceGroupInfoMapper; /** * 海康事件订阅 */ - @PostMapping("/event/subscribe") + @PostMapping("/hik/event/subscribe") @ResponseBody - public Object eventSubscribe() throws UnknownHostException { + public Object eventSubscribe() { EventSubscribeRequest eventSubscribeRequest = new EventSubscribeRequest(); ArrayList list = new ArrayList<>(); list.add(SecurityEventType.DEVICE_OFFLINE); + list.add(SecurityEventType.DEVICE_ONLINE); list.add(SecurityEventType.KEY_PERSONNEL_IDENTIFY_EVENT); list.add(SecurityEventType.MONITORING_POINT_OFFLINE); + list.add(SecurityEventType.MONITORING_POINT_ONLINE); list.add(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); list.add(SecurityEventType.PERSONNEL_GATHER_EVENT); - InetAddress localHost = InetAddress.getLocalHost(); + list.add(SecurityEventType.VISITOR_REGISTER); + list.add(SecurityEventType.VISITOR_CHECKOUT); + list.add(SecurityEventType.HIGH_ALTITUDE_PARABOLIC); +// InetAddress localHost = InetAddress.getLocalHost(); eventSubscribeRequest.setEventTypes(list); - eventSubscribeRequest.setEventDest("https://" + localHost + ":" + serverPort + "/eventRcv"); + eventSubscribeRequest.setEventDest("http://" + "192.168.10.6" + ":" + serverPort + "/eventRcv"); //订阅类型,0-订阅原始事件,1-联动事件,2-原始事件和联动事件,不填使用默认值0 eventSubscribeRequest.setSubType(0); /** @@ -92,19 +103,25 @@ } /** + * 查询事件订阅信息 + */ + @PostMapping("/hik/event/query") + @ResponseBody + public Object eventQuery() { + String result = HikUtil.hikApi(HikUri.EVENT_INFO, ""); + return result; + } + + /** * 海康事件接收 */ @PostMapping("/eventRcv") @ResponseBody public Object eventRcv(@RequestBody HikRecvEvent hikRecvEvent) { //1、接收所需事件类型 - Long eventType = hikRecvEvent.getEventType(); + Number eventType = hikRecvEvent.getEventType(); log.info("接收到安防事件类型为:{}", eventType); CaseInfo caseInfo = caseInfoFactoryUtil.getCaseInfo(eventType); - //接收到不关心事件直接返回 - if(Objects.isNull(caseInfo)){ - return ResponseData.success(); - } //2、不同事件不同处理,caseInfoFactoryUtil已设置好事件基础定义信息 // 再为事件添加状态、设备编码、设备名称、位置、区域、时间 // 异步处理事件 @@ -114,19 +131,23 @@ caseHandle(hikRecvEvent, eventType, caseInfo); } })); +// caseHandle(hikRecvEvent, eventType, caseInfo); - return null; + return ResponseData.success(); } - private void caseHandle(HikRecvEvent hikRecvEvent, Long eventType, CaseInfo caseInfo) { + private void caseHandle(HikRecvEvent hikRecvEvent, Number eventType, CaseInfo caseInfo) { JSONArray eventArray = hikRecvEvent.getEventArray(); List caseInfos = new ArrayList<>(); - while (eventArray.stream().iterator().hasNext()) { + Iterator iterator = eventArray.iterator(); + while (iterator.hasNext()) { CaseInfo caseInfo1 = new CaseInfo(); - BeanUtils.copyProperties(caseInfo, caseInfo1); - JSONObject event = (JSONObject) eventArray.stream().iterator().next(); + if(!Objects.isNull(caseInfo)){ + BeanUtils.copyProperties(caseInfo, caseInfo1); + } + JSONObject event = (JSONObject) iterator.next(); //5种事件进行不同处理 - if(SecurityEventType.KEY_PERSONNEL_IDENTIFY_EVENT == eventType){ + if (SecurityEventType.KEY_PERSONNEL_IDENTIFY_EVENT.equals(eventType)) { //判断所属人脸分组 JSONObject data = (JSONObject) event.get("data"); JSONObject faceRecognitionResult = (JSONObject) data.get("faceRecognitionResult"); @@ -142,52 +163,101 @@ if (faceGroupCode.equals(blackListGroup.getFaceGroupCode())) { //黑名单分组处理 caseInfo1 = hikService.blackListHandle(event, caseInfo1); - }else if(faceGroupCode.equals(propertyPersonnelGroup.getFaceGroupCode())){ + } else if (faceGroupCode.equals(propertyPersonnelGroup.getFaceGroupCode())) { //考勤分组处理-物业人员,添加到考勤表 hikService.propertyAttendanceHandle(event); - }else if(faceGroupCode.equals(securityPersonnelGroup.getFaceGroupCode())){ + } else if (faceGroupCode.equals(securityPersonnelGroup.getFaceGroupCode())) { //考勤分组处理-安保人员,添加到考勤表 hikService.securityPersonnelHandle(event); - }else { + } else { return; } - }else if(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT == eventType){ + } else if (SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT.equals(eventType)) { //离岗事件处理 caseInfo1 = hikService.demobilizedHandle(event, caseInfo1); - }else if(SecurityEventType.PERSONNEL_GATHER_EVENT == eventType){ + } else if (SecurityEventType.PERSONNEL_GATHER_EVENT.equals(eventType)) { //人员聚集事件处理 caseInfo1 = hikService.personGatherHandle(event, caseInfo1); - }else if(SecurityEventType.MONITORING_POINT_OFFLINE == eventType){ + } else if (SecurityEventType.MONITORING_POINT_OFFLINE.equals(eventType)) { //监控点离线事件处理 caseInfo1 = hikService.monitorPointOfflineHandle(event, caseInfo1); - }else if(SecurityEventType.DEVICE_OFFLINE == eventType){ + } else if (SecurityEventType.MONITORING_POINT_ONLINE.equals(eventType)) { + //监控点上线事件处理 + hikService.monitorPointOnlineHandle(event); + } else if (SecurityEventType.DEVICE_OFFLINE.equals(eventType)) { //装置离线事件处理 caseInfo1 = hikService.deviceOfflineHandle(event, caseInfo1); - }else if(SecurityEventType.VISITOR_REGISTER == eventType){ + } else if (SecurityEventType.DEVICE_ONLINE.equals(eventType)) { + //装置上线处理 + hikService.deviceOnlineHandle(event); + } else if (SecurityEventType.VISITOR_REGISTER.equals(eventType)) { //记录访客登记记录,添加到访客记录表 hikService.visitorRegisterHandler(event); - }else if(SecurityEventType.VISITOR_CHECKOUT == eventType){ + } else if (SecurityEventType.VISITOR_CHECKOUT.equals(eventType)) { //记录访客签离记录 hikService.visitorCheckOutHandler(event); } - if(!Objects.isNull(caseInfo1) && !StringUtils.isEmpty(caseInfo1.getHappenTime())){ + if (!Objects.isNull(caseInfo1) && !StringUtils.isEmpty(caseInfo1.getHappenTime())) { caseInfos.add(caseInfo1); } } //3、安防事件入库 - if(!caseInfoService.insertCaseInfoBatch(caseInfos)){ - log.error("安防事件批量入库异常"); + if (!CollectionUtils.isEmpty(caseInfos) && !caseInfoService.insertCaseInfoBatch(caseInfos)) { + log.error("安防事件批量入库异常!"); } // TODO: 2022/8/15 webSocket推送 + if (CollectionUtils.isEmpty(caseInfos)) { + log.info("webSocket事件推送"); + webSocket.sendAllMessage(JSONObject.toJSONString(caseInfos)); + } return; } /** + * 以图搜图,前端用于轨迹追踪 + */ + @PostMapping("/hik/search/picture") + @ResponseBody + public Object searchPictures(@RequestBody SearchPicturesRequest searchPicturesRequest) { + DateTime startDateTime = DateUtil.parse(searchPicturesRequest.getStartTime()); + DateTime endDateTime = DateUtil.parse(searchPicturesRequest.getEndTime()); + String startTime = DateUtil.format(startDateTime, "yyyy-MM-dd'T'HH:mm:ss.SSSXXX"); + String endTime = DateUtil.format(endDateTime, "yyyy-MM-dd'T'HH:mm:ss.SSSXXX"); + searchPicturesRequest.setStartTime(startTime); + searchPicturesRequest.setEndTime(endTime); + String body = JSONObject.toJSONString(searchPicturesRequest); + String resultStr = HikUtil.hikApi(HikUri.SEARCH_PICTURES, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (!"0".equals(resultJson.get("code"))) { + log.error("请求海康,以图搜图失败,海康response:{}", resultStr); + return ResponseData.error("以图搜图失败"); + } + return ResponseData.success(resultJson); + } + + + /** + * 海康事件取消订阅 + */ + @PostMapping("/hik/event/cancel") + @ResponseBody + public Object eventCancelSubscribe(@RequestBody CancelSubscribeRequest cancelSubscribeRequest) { + String body = JSONObject.toJSONString(cancelSubscribeRequest); + String resultStr = HikUtil.hikApi(HikUri.EVENT_CANCEL, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (!"0".equals(resultJson.get("code"))) { + log.error("请求海康,取消订阅失败,海康response:{}", resultStr); + return ResponseData.error("取消订阅失败"); + } + return ResponseData.success(resultJson); + } + + /** * 单个添加海康人脸分组 * api->hik单个添加人脸分组api->response->mysql */ - @PostMapping("/faceGroup/single/add") + @PostMapping("/hik/faceGroup/single/add") @ResponseBody public Object faceGroupAddition(@RequestBody FaceGroupAdditionRequest faceGroupAdditionRequest) { String body = JSONObject.toJSONString(faceGroupAdditionRequest); @@ -212,7 +282,7 @@ * 批量添加海康组织 * api->hik批量添加组织api->response */ - @PostMapping("/org/batch/add") + @PostMapping("/hik/org/batch/add") @ResponseBody public Object orgBatchAdd(@RequestBody List orgBatchAddRequest) { String body = JSONObject.toJSONString(orgBatchAddRequest); @@ -232,4 +302,62 @@ return ResponseData.error("批量添加组织失败"); } + /** + * 获取人员列表 + */ + @PostMapping("/hik/person/personList") + @ResponseBody + public Object personList() { + PersonListRequest request = new PersonListRequest(); + request.setPageNo(1); + request.setPageSize(100); + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi("/api/resource/v2/person/personList", body); + return resultStr; + } + + /** + * 获取组织列表 + */ + @PostMapping("/hik/org/orgList") + @ResponseBody + public Object orgList() { + PersonListRequest request = new PersonListRequest(); + request.setPageNo(1); + request.setPageSize(100); + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi("/api/resource/v1/org/orgList", body); + return resultStr; + } + + /** + * 查询访客权限下载记录 + */ + @PostMapping("/hik/auth/result") + @ResponseBody + public Object authResult() { + PersonListRequest request = new PersonListRequest(); + request.setPageNo(1); + request.setPageSize(100); + request.setOrderId("ba101db6246711edaea66f7939a13638"); + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi("/api/visitor/v1/auth/result", body); + return resultStr; + } + + /** + * 人脸图片获取 + */ + @PostMapping("/hik/face/picture") + @ResponseBody + public Object facePicture() { + FaceRequest request = new FaceRequest(); +// List list = new ArrayList<>(); +// list.add(""); + request.setCertificateNum("wanggong"); + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi("/api/frs/v1/face", body); + return resultStr; + } + } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/AssetInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/AssetInfoMapper.java index 4f64e83..c0684ee 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/AssetInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/AssetInfoMapper.java @@ -17,6 +17,6 @@ @Mapper public interface AssetInfoMapper extends BaseMapper { - List getAssetInfoListPage(@Param("page") Page page, AssetInfoRequest assetInfoRequest); + List getAssetInfoListPage(@Param("page") Page page, @Param("assetInfoRequest") AssetInfoRequest assetInfoRequest); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/AttendanceInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/AttendanceInfoMapper.java index f9e793e..ec87e46 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/AttendanceInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/AttendanceInfoMapper.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.statistics.AttendanceNumberDTO; import com.casic.missiles.modular.dto.statistics.AttendanceRatioDTO; import com.casic.missiles.modular.model.AttendanceInfo; import org.apache.ibatis.annotations.Mapper; @@ -17,7 +18,7 @@ */ @Mapper public interface AttendanceInfoMapper extends BaseMapper { - List getAttendanceInfoListPage(@Param("page") Page page, StaffInfoRequest attendanceInfoRequest); + List getAttendanceInfoListPage(@Param("page") Page page, @Param("attendanceInfoRequest") StaffInfoRequest attendanceInfoRequest); AttendanceInfo selectByCodeAndDate(@Param("staffCode") String staffCode); @@ -26,4 +27,8 @@ List getCountByTypeAndDateForMonth(@Param("staffType")String staffType); List getCountByTypeAndDateForYear(@Param("staffType")String staffType); + + List getCountForWeek(); + + List getCountForDay(); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java index ce94b8f..6137a7d 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java @@ -17,5 +17,5 @@ @Mapper public interface BlackInfoMapper extends BaseMapper { - List getBlackInfoListPage(@Param("page") Page page, BlackInfoRequest blackInfoRequest); + List getBlackInfoListPage(@Param("page") Page page, @Param("blackInfoRequest") BlackInfoRequest blackInfoRequest); } 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 efda6b3..50aaa6f 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 @@ -20,7 +20,7 @@ List getCaseInfoListPage(@Param("page") Page page, @Param("caseInfoRequest") CaseInfoRequest caseInfoRequest); - int updateStatusById(CaseInfoRequest caseInfoRequest); + int updateStatusById(@Param("caseInfoRequest") CaseInfoRequest caseInfoRequest); List selectByLevelAndMonth(@Param("year") String year); @@ -47,4 +47,20 @@ List selectPreWeekCountByThirtyDay(); List selectPreDayCountBySevenDay(); + + Integer selectDemobilizedCount(@Param("eventType") Number personnelDemobilizedEvent); + + List selectPreMonthCount(); + + List selectListBySevenDay(); + + List selectListByToday(); + + List selectListByToday2(); + + List selectListByToday3(); + + List selectListByType(@Param("eventType") Number eventType); + + List selectDemobilizedCountByHour(@Param("eventType") Number eventType); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/CategoryLevelMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/CategoryLevelMapper.java index 52fc714..afe1650 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/CategoryLevelMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/CategoryLevelMapper.java @@ -17,9 +17,9 @@ @Mapper public interface CategoryLevelMapper extends BaseMapper { - List getCaseCategoryLevelListPage(@Param("page") Page page, CategoryLevelRequest categoryLevelRequest); + List getCaseCategoryLevelListPage(@Param("page") Page page, @Param("categoryLevelRequest") CategoryLevelRequest categoryLevelRequest); - List getCaseCategoryLevelList(CategoryLevelRequest categoryLevelRequest); + List getCaseCategoryLevelList(@Param("categoryLevelRequest") CategoryLevelRequest categoryLevelRequest); CaseCategoryLevel getCaseCategoryLevel(@Param("categoryLevelCode") String categoryLevelCode); 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 66353b1..2555a09 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 @@ -19,7 +19,7 @@ @Mapper public interface DeviceInfoMapper extends BaseMapper { - List getDeviceInfoListPage(@Param("page") Page page, DeviceInfoRequest deviceInfoRequest); + List getDeviceInfoListPage(@Param("page") Page page, @Param("deviceInfoRequest") DeviceInfoRequest deviceInfoRequest); List getDeviceInfoList(@Param("deviceInfoRequest") DeviceInfoRequest deviceInfoRequest); @@ -27,6 +27,8 @@ DeviceInfo getByIndexCode(@Param("srcIndex") String srcIndex); + DeviceInfo getByIp(@Param("ip") String ip); + List selectIndexCodesByCodes(@Param("deviceCodes") List deviceCodes); List selectByType(@Param("devType") String devType); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java index 41dd0af..5bfaf63 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java @@ -5,6 +5,7 @@ import com.casic.missiles.modular.dto.DeviceRepairRequest; import com.casic.missiles.modular.model.DeviceRepairLog; import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; import java.util.List; @@ -16,7 +17,7 @@ @Mapper public interface DeviceRepairLogMapper extends BaseMapper { - List getDeviceRepairListPage(Page page, DeviceRepairRequest deviceRepairRequest); + List getDeviceRepairListPage(@Param("page") Page page, @Param("deviceRepairRequest")DeviceRepairRequest deviceRepairRequest); - List getDeviceRepairList(DeviceRepairRequest deviceRepairRequest); + List getDeviceRepairList(@Param("deviceRepairRequest") DeviceRepairRequest deviceRepairRequest); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java index 9035c47..4823ac1 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java @@ -18,7 +18,7 @@ @Mapper public interface FireEquipInfoMapper extends BaseMapper { - List getFireEquipInfoListPage(@Param("page") Page page, FireEquipRequest fireEquipRequest); + List getFireEquipInfoListPage(@Param("page") Page page, @Param("fireEquipRequest") FireEquipRequest fireEquipRequest); FireEquipInfo getFireEquipInfo(@Param("equipCode") String equipCode); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/GateGroupMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/GateGroupMapper.java index d8c330d..977a427 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/GateGroupMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/GateGroupMapper.java @@ -17,7 +17,7 @@ */ @Mapper public interface GateGroupMapper extends BaseMapper { - List getGateGroupListPage(@Param("page") Page page, GateGroupRequest gateGroupRequest); + List getGateGroupListPage(@Param("page") Page page, @Param("gateGroupRequest") GateGroupRequest gateGroupRequest); GateGroup getGateGroupByName(@Param("groupName") String groupName); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/HazardLevelMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/HazardLevelMapper.java index 8957780..dcf47bb 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/HazardLevelMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/HazardLevelMapper.java @@ -17,11 +17,13 @@ @Mapper public interface HazardLevelMapper extends BaseMapper { - List getCaseHazardLevelListPage(@Param("page") Page page, HazardLevelRequest hazardLevelRequest); + List getCaseHazardLevelListPage(@Param("page") Page page, @Param("hazardLevelRequest") HazardLevelRequest hazardLevelRequest); - List getCaseHazardLevelList(HazardLevelRequest hazardLevelRequest); + List getCaseHazardLevelList(@Param("hazardLevelRequest") HazardLevelRequest hazardLevelRequest); CaseHazardLevel getCaseHazardLevel(@Param("hazardLevelCode") String hazardLevelCode); List selectHazardName(); + + String selectHazardNameByCode(@Param("hazardLevelCode") String hazardLevelCode); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/HikCaseDefineMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/HikCaseDefineMapper.java index 0dc47d1..f162fef 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/HikCaseDefineMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/HikCaseDefineMapper.java @@ -12,5 +12,5 @@ */ @Mapper public interface HikCaseDefineMapper extends BaseMapper { - HikCaseDefine getHikCaseDefine(@Param("caseTypeCode") Long caseTypeCode); + HikCaseDefine getHikCaseDefine(@Param("caseTypeCode") Number caseTypeCode); } 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 f8a674c..fe5afc2 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 @@ -17,11 +17,13 @@ @Mapper public interface StaffInfoMapper extends BaseMapper { - List getStaffInfoListPage(@Param("page") Page page, StaffInfoRequest staffInfoRequest); + List getStaffInfoListPage(@Param("page") Page page, @Param("staffInfoRequest") StaffInfoRequest staffInfoRequest); StaffInfo selectByCode(@Param("staffCode") String staffCode); - List getStaffInfoList(StaffInfoRequest staffInfoRequest); + List getStaffInfoList(@Param("staffInfoRequest") StaffInfoRequest staffInfoRequest); - List selectBatchCodes(List list); + List selectBatchCodes(@Param("list") List list); + + int updateByCodeForCard(@Param("staffCode") String staffCode, @Param("cardNo") String cardNo); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitInfoMapper.java index b1217c5..6c52542 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitInfoMapper.java @@ -16,7 +16,7 @@ */ @Mapper public interface VisitInfoMapper extends BaseMapper { - List getVisitInfoListPage(@Param("page") Page page, VisitorRequest visitorRequest); + List getVisitInfoListPage(@Param("page") Page page, @Param("visitorRequest") VisitorRequest visitorRequest); VisitInfo selectByOrderId(@Param("orderId") String orderId); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitorApplyMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitorApplyMapper.java index c09f3c0..6ea55bd 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitorApplyMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitorApplyMapper.java @@ -18,7 +18,7 @@ @Mapper public interface VisitorApplyMapper extends BaseMapper { - List getVisitorApplyListPage(@Param("page") Page page, VisitorApplyRequest visitorApplyRequest); + List getVisitorApplyListPage(@Param("page") Page page, @Param("visitorApplyRequest") VisitorApplyRequest visitorApplyRequest); List selectByVisitReason(); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/AttendanceInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/AttendanceInfoMapper.xml index b2ece71..f8bdd6e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/AttendanceInfoMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/AttendanceInfoMapper.xml @@ -43,7 +43,8 @@ and staff_type = #{staffType} - and YEARWEEK(date_format(atte_date, '%Y-%m-%d'), 1) = YEARWEEK(now(),1); + AND DATE_SUB(CURDATE(), INTERVAL 7 DAY) <= DATE(atte_date) + GROUP BY DATE_FORMAT(atte_date, '%Y-%m-%d') @@ -69,4 +70,20 @@ GROUP BY DATE_FORMAT(atte_date, '%Y-%m') + + + \ No newline at end of file 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 2b6953f..06ec0a8 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 @@ -28,7 +28,9 @@ @@ -87,7 +89,8 @@ SELECT hazard_level_code as levelCode, count(id) as quantity FROM bus_case_info WHERE hazard_level_code is not null - AND DATE_SUB(CURDATE(), INTERVAL 7 DAY) <= date(happen_time); + AND is_key_area = 1 + AND DATE_SUB(CURDATE(), INTERVAL 7 DAY) <= date(happen_time) GROUP BY hazard_level_code @@ -95,7 +98,8 @@ SELECT hazard_level_code as levelCode, count(id) as quantity FROM bus_case_info WHERE hazard_level_code is not null - AND DATE_SUB(CURDATE(), INTERVAL 30 DAY) <= date(happen_time); + AND is_key_area = 1 + AND DATE_SUB(CURDATE(), INTERVAL 30 DAY) <= date(happen_time) GROUP BY hazard_level_code @@ -122,4 +126,71 @@ AND hazard_level_code is not null GROUP BY DATE_FORMAT(happen_time,'%Y-%m-%d') + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/CategoryLevelMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/CategoryLevelMapper.xml index 4670b1f..1d25cbd 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/CategoryLevelMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/CategoryLevelMapper.xml @@ -20,11 +20,11 @@ SELECT * FROM bus_case_category_level WHERE 1=1 - - and code = #{code} + + and code = #{categoryLevelRequest.code} - - and name = #{name} + + and name = #{categoryLevelRequest.name} ORDER by create_time DESC 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 9b66fd8..bfd84b7 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 @@ -98,4 +98,10 @@ #{item} + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceRepairLogMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceRepairLogMapper.xml index 078ed3c..cf1a481 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceRepairLogMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceRepairLogMapper.xml @@ -22,14 +22,14 @@ SELECT * FROM bus_device_repair_log WHERE 1=1 - - and device_code = #{devCode} + + and device_code = #{deviceRepairRequest.devCode} - - and device_name = #{devName} + + and device_name = #{deviceRepairRequest.devName} - - and DATE_FORMAT(create_time,"%y%m%d") = DATE_FORMAT(#{createTime},"%y%m%d") + + and DATE_FORMAT(create_time,"%y%m%d") = DATE_FORMAT(#{deviceRepairRequest.createTime},"%y%m%d") ORDER by create_time DESC diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/HazardLevelMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/HazardLevelMapper.xml index f16f2b9..458322b 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/HazardLevelMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/HazardLevelMapper.xml @@ -20,11 +20,11 @@ SELECT * FROM bus_case_hazard_level WHERE 1=1 - - and code = #{code} + + and code = #{hazardLevelRequest.code} - - and name = #{name} + + and name = #{hazardLevelRequest.name} ORDER by create_time DESC @@ -42,4 +42,10 @@ SELECT name FROM bus_case_hazard_level + + \ 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 557237e..b6a183a 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 @@ -50,4 +50,10 @@ + + + UPDATE bus_staff_info + SET card_no = #{cardNo} + WHERE staff_code = #{staffCode} + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitInfoMapper.xml index 84aa84f..230529a 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitInfoMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitInfoMapper.xml @@ -27,5 +27,6 @@ SELECT * FROM bus_visit_info WHERE order_id = #{orderId} and DATE_FORMAT(in_time,'%Y-%m-%d') = CURRENT_DATE + limit 1 \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/BlackPictureRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/BlackPictureRequest.java new file mode 100644 index 0000000..fc92701 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/BlackPictureRequest.java @@ -0,0 +1,14 @@ +package com.casic.missiles.modular.dto; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/29 19:26 + */ +@Data +public class BlackPictureRequest { + private String picUri; + private String serverIndexCode; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/CancelSubscribeRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/CancelSubscribeRequest.java new file mode 100644 index 0000000..e2d390a --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/CancelSubscribeRequest.java @@ -0,0 +1,15 @@ +package com.casic.missiles.modular.dto.hik; + +import lombok.Data; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/24 15:14 + */ +@Data +public class CancelSubscribeRequest { + private List eventTypes; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/CardInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/CardInfo.java new file mode 100644 index 0000000..341457d --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/CardInfo.java @@ -0,0 +1,24 @@ +package com.casic.missiles.modular.dto.hik; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/26 16:08 + */ +@Data +public class CardInfo { + //卡号,8~20个字符,支持数字和大写字母 + private String cardNo; + //人员ID,员工工号 + private String personId; + //人员所属组织IndexCode + private String orgIndexCode; + //卡片类型,默认是1:IC卡 + //1:IC卡 + //2:CPU卡 + //3:远距离卡 + //4:MIFARE卡 + private Number cardType; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/FaceRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/FaceRequest.java new file mode 100644 index 0000000..edc04bf --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/FaceRequest.java @@ -0,0 +1,16 @@ +package com.casic.missiles.modular.dto.hik; + +import lombok.Data; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/25 16:53 + */ +@Data +public class FaceRequest { + private String certificateNum; + private List indexCodes; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/HikRecvEvent.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/HikRecvEvent.java index a3e9845..1b2b2b1 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/HikRecvEvent.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/HikRecvEvent.java @@ -28,12 +28,12 @@ /** * 事件类型,用于判断所需接收到的事件类型 */ - public Long getEventType(){ + public Number getEventType(){ JSONObject jsonObject = (JSONObject)JSONObject.toJSON(params); //事件类别对应SecurityEventTypeEnum JSONArray eventTypeArray = (JSONArray)jsonObject.get("events"); JSONObject eventJsonObject = (JSONObject)JSONObject.toJSON(eventTypeArray.get(0)); - Long eventType = (Long) eventJsonObject.get("eventType"); + Number eventType = (Number) eventJsonObject.get("eventType"); return eventType; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonBatchDeleteRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonBatchDeleteRequest.java index 027d31d..9751929 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonBatchDeleteRequest.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonBatchDeleteRequest.java @@ -12,4 +12,6 @@ @Data public class PersonBatchDeleteRequest { private List personIds; + //删除人脸接口使用 + private String faceId; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonInfoRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonInfoRequest.java new file mode 100644 index 0000000..05dc9e1 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonInfoRequest.java @@ -0,0 +1,20 @@ +package com.casic.missiles.modular.dto.hik; + +import lombok.Data; + +import java.util.List; + +/** + * @Description: 获取员工照片请求实体 + * @Author: wangpeng + * @Date: 2022/8/25 16:53 + */ +@Data +public class PersonInfoRequest { + //获取员工详细信息使用 + private String paramName; + private List paramValue; + //获取照片使用 + private String picUri; + private String serverIndexCode; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonListRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonListRequest.java new file mode 100644 index 0000000..3f7149b --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonListRequest.java @@ -0,0 +1,16 @@ +package com.casic.missiles.modular.dto.hik; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/25 16:53 + */ +@Data +public class PersonListRequest { + private Number pageNo; + private Number pageSize; + + private String orderId; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/BlackListController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/BlackListController.java index a27f9f8..0c06661 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/BlackListController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/BlackListController.java @@ -1,13 +1,18 @@ package com.casic.missiles.modular.controller; +import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.base.controller.ExportController; import com.casic.missiles.core.page.PageFactory; import com.casic.missiles.model.response.ResponseData; import com.casic.missiles.modular.dto.BlackInfoRequest; +import com.casic.missiles.modular.dto.BlackPictureRequest; +import com.casic.missiles.modular.dto.hik.PersonInfoRequest; +import com.casic.missiles.modular.enums.HikUri; import com.casic.missiles.modular.enums.OperateTypeEnum; import com.casic.missiles.modular.model.BlackInfo; import com.casic.missiles.modular.service.BlackInfoService; +import com.casic.missiles.modular.util.HikUtil; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; @@ -56,4 +61,22 @@ return null; } + /** + * 黑名单人员照片 + */ + @PostMapping("/personPicture") + @ResponseBody + public Object personPicture(@RequestBody BlackPictureRequest blackPictureRequest){ + //获取照片 + String picUri = blackPictureRequest.getPicUri(); + String serverIndexCode = blackPictureRequest.getServerIndexCode(); + PersonInfoRequest picRequest = new PersonInfoRequest(); + picRequest.setPicUri(picUri); + picRequest.setServerIndexCode(serverIndexCode); + String reBody = JSONObject.toJSONString(picRequest); + //重定向地址获取 + String url = HikUtil.hikApiFor302(HikUri.PERSON_PICTURE, reBody); + return ResponseData.success(url); + } + } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/DeviceController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/DeviceController.java index e1c4eba..666bbee 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/DeviceController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/DeviceController.java @@ -107,7 +107,7 @@ } /** - * 设备维修管理查询(分页),需计算MTTR=总维修时间/故障次数 + * 设备状态计算与评判/设备维修管理查询(分页),需计算MTTR=总维修时间/故障次数 */ @PostMapping("/repair/listPage") @ResponseBody @@ -211,7 +211,7 @@ //需根据设备编号获取到对应的门禁点唯一标识 doorControlRequest.setDoorIndexCodes(indexCodes); doorControlRequest.setControlType(Integer.valueOf(gateGroupDTO.getStatus())); - String body = JSONObject.toJSONString(deviceCodes); + String body = JSONObject.toJSONString(doorControlRequest); String resultStr = HikUtil.hikApi(HikUri.DOOR_CONTROL, body); JSONObject resultJson = (JSONObject)JSONObject.parse(resultStr); if (!"0".equals(resultJson.get("code"))) { diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/StaffController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/StaffController.java index b58ccab..704093c 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/StaffController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/StaffController.java @@ -2,15 +2,21 @@ import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.util.StrUtil; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.base.controller.ExportController; import com.casic.missiles.core.page.PageFactory; import com.casic.missiles.model.response.ErrorResponseData; import com.casic.missiles.model.response.ResponseData; import com.casic.missiles.modular.dto.StaffInfoRequest; +import com.casic.missiles.modular.dto.hik.PersonInfoRequest; +import com.casic.missiles.modular.dto.hik.StaffCardRequest; +import com.casic.missiles.modular.enums.HikUri; import com.casic.missiles.modular.enums.OperateTypeEnum; import com.casic.missiles.modular.model.StaffInfo; import com.casic.missiles.modular.service.StaffInfoService; +import com.casic.missiles.modular.util.HikUtil; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; @@ -110,4 +116,60 @@ } return ResponseData.success(); } + + /** + * 批量开卡,添加人员之后调用,若在一个接口中添加人员成功开卡失败则第二次添加时会有问题 + */ + @PostMapping("/cardBinding") + @ResponseBody + public Object cardBinding(@RequestBody StaffCardRequest staffCardRequest) { + String body = JSONObject.toJSONString(staffCardRequest); + String resultStr = HikUtil.hikApi(HikUri.CARD_BINDING, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (!"0".equals(resultJson.get("code"))) { + log.error("请求海康,批量开卡失败,海康response:{}", resultStr); + return ResponseData.error("批量开卡失败"); + } + //保存卡号 + if(staffInfoService.saveCardInfo(staffCardRequest) > 0){ + return ResponseData.success(); + } + return ResponseData.error("批量开卡失败"); + } + + /** + * 获取员工照片,海康存储 + */ + @PostMapping("/personPicture/{staffCode}") + @ResponseBody + public Object personPicture(@PathVariable("staffCode") String staffCode){ + //获取员工详细信息,含图片服务器、uri + PersonInfoRequest request = new PersonInfoRequest(); + List list = new ArrayList<>(); + list.add(staffCode); + request.setParamName("personId"); + request.setParamValue(list); + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi(HikUri.PERSON_INFO, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (!"0".equals(resultJson.get("code"))) { + log.error("请求海康,根据人员唯一字段获取人员详细信息失败,海康response:{}", resultStr); + return ResponseData.error("获取员工照片失败"); + } + //获取照片 + JSONObject data = (JSONObject) resultJson.get("data"); + JSONArray dataArray = (JSONArray) data.get("list"); + JSONObject jsonObject = (JSONObject) dataArray.get(0); + JSONArray personPhoto = (JSONArray) jsonObject.get("personPhoto"); + JSONObject photo = (JSONObject) personPhoto.get(0); + String picUri = photo.getString("picUri"); + String serverIndexCode = photo.getString("serverIndexCode"); + PersonInfoRequest picRequest = new PersonInfoRequest(); + picRequest.setPicUri(picUri); + picRequest.setServerIndexCode(serverIndexCode); + String reBody = JSONObject.toJSONString(picRequest); + //重定向地址获取 + String url = HikUtil.hikApiFor302(HikUri.PERSON_PICTURE, reBody); + return ResponseData.success(url); + } } 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 4a07dd9..7b1dcf6 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 @@ -16,6 +16,7 @@ import com.casic.missiles.modular.redis.key.CacheKeys; import com.casic.missiles.modular.service.CockpitService; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.util.CollectionUtils; import org.springframework.web.bind.annotation.*; @@ -24,10 +25,7 @@ import java.text.NumberFormat; import java.time.LocalDateTime; import java.time.temporal.ChronoUnit; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.util.*; import java.util.stream.Collectors; /** @@ -73,6 +71,9 @@ private StatisticNumberMapper numberMapper; @Autowired + private HazardLevelMapper hazardLevelMapper; + + @Autowired private AccessGroupConfig accessGroupConfig; /** @@ -104,8 +105,24 @@ public Object buildingNumberPerHour(){ //当天按小时分组的人数 List list = numberMapper.selectListByTime(); - Map> collect = list.stream().collect(Collectors.groupingBy(BuildingNumberDTO::getStatisticPosition)); - return ResponseData.success(collect); + Map> collect = list.stream().collect(Collectors.groupingBy(BuildingNumberDTO::getStatisticTime)); + //定时任务中已将每小时三栋楼人数存到数据库 + //将一期主楼和录制楼人数合并,二期单算 + List> resultList = new ArrayList<>(); + collect.keySet().forEach(key -> { + List buildingNumberDTOS = collect.get(key); + BuildingNumberDTO mainBuildingOne = buildingNumberDTOS.get(0); + BuildingNumberDTO mainBuildingTwo = buildingNumberDTOS.get(1); + BuildingNumberDTO recordingBuilding = buildingNumberDTOS.get(2); + HashMap resultMap = new HashMap<>(); + Integer oneQuantity = Integer.valueOf(mainBuildingOne.getStatisticQuantity()); + Integer recordingQuantity = Integer.valueOf(recordingBuilding.getStatisticQuantity()); + resultMap.put("staticTime", mainBuildingOne.getStatisticTime()); + resultMap.put(mainBuildingOne.getStatisticPositionName()+"、"+recordingBuilding.getStatisticPositionName(), String.valueOf(oneQuantity+recordingQuantity)); + resultMap.put(mainBuildingTwo.getStatisticPositionName(), mainBuildingTwo.getStatisticQuantity()); + resultList.add(resultMap); + }); + return ResponseData.success(resultList); } /** @@ -151,12 +168,11 @@ public Object securityNumber() { QueryWrapper wrapper = new QueryWrapper<>(); wrapper.eq("staff_type", 2); + // TODO: 2022/9/2 后续使用产品确定的每天出勤的安保人员的数量 Integer total = staffInfoMapper.selectCount(wrapper); - //当日离岗事件个数 - QueryWrapper wrapper1 = new QueryWrapper<>(); - wrapper1.eq("hik_event_type", SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); - wrapper1.apply("date_format(now(),'%Y-%m-%d') = date_format(happen_time,'%Y-%m-%d')"); - Integer leave = caseInfoMapper.selectCount(wrapper1); + //当日离岗事件按设备去重后的个数 + // TODO: 2022/9/2 目前相当于24小时内的计算,之后看需要可改成自定义小时数计算离岗率,即离岗+6小时内仅一次离岗则恢复为100%,多次则累加离岗次数计算离岗率 + Integer leave = caseInfoMapper.selectDemobilizedCount(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); NumberFormat numberFormat = NumberFormat.getInstance(); // 设置精确到小数点后2位 numberFormat.setMaximumFractionDigits(2); @@ -179,7 +195,6 @@ @ResponseBody public Object visitorApplyDetail() { List reasonGroup = applyMapper.selectByVisitReason(); - HashMap resultMap = new HashMap<>(); NumberFormat numberFormat = NumberFormat.getInstance(); // 设置精确到小数点后2位 numberFormat.setMaximumFractionDigits(2); @@ -187,12 +202,17 @@ if(0 == sum){ return ResponseData.success(); } + List resultList = new ArrayList<>(); reasonGroup.forEach(group -> { String reasonName = dictService.getDictNameByCode(SecurityEventDict.VISIT_REASON, group.getVisitReason()); String result = numberFormat.format((float) group.getQuantity() / (float) sum * 100); - resultMap.put(reasonName, result+"%"); + ApplyReasonGroupDTO applyReasonGroupDTO = new ApplyReasonGroupDTO(); + applyReasonGroupDTO.setQuantity(group.getQuantity()); + applyReasonGroupDTO.setVisitReason(reasonName); + applyReasonGroupDTO.setRatio(result+"%"); + resultList.add(applyReasonGroupDTO); }); - return ResponseData.success(resultMap); + return ResponseData.success(resultList); } /** @@ -247,6 +267,32 @@ } /** + * 机动力量实时在岗率,在岗人数除以总应在岗人数,用离岗+6小时内恢复为100%,6小时外再计算 + */ + @GetMapping("/staff/beOnDutyRatio") + @ResponseBody + public Object beOnDutyRatio() { + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("staff_type", 2); + // TODO: 2022/9/2 后续使用产品确定的每天出勤的安保人员的数量 + Integer total = staffInfoMapper.selectCount(wrapper); + if(0 == total){ + return ResponseData.success(null); + } + //当日离岗事件按设备去重后的个数 + // TODO: 2022/9/2 目前相当于24小时内的计算,之后看需要可改成自定义小时数计算离岗率,即离岗+6小时内仅一次离岗则恢复为100%,多次则累加离岗次数计算离岗率 + List onDutyRatioDTOS = caseInfoMapper.selectDemobilizedCountByHour(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); + onDutyRatioDTOS.forEach(dto -> { + NumberFormat numberFormat = NumberFormat.getInstance(); + // 设置精确到小数点后2位 + numberFormat.setMaximumFractionDigits(2); + String result = numberFormat.format(100 - Float.valueOf(dto.getQuantity()) / (float) total * 100); + dto.setRatio(result+"%"); + }); + return ResponseData.success(onDutyRatioDTOS); + } + + /** * 闸机速通门统计-设备状态分组计算数量,devType传闸机字典key * 视频频监控摄像机统计-设备状态分组计算数量,devType传摄像头字典key */ @@ -262,12 +308,17 @@ if(sum <= 0){ return ResponseData.error("无该类设备信息"); } + List resultList = new ArrayList<>(); gateStatusGroup.forEach(group -> { String devStatus = dictService.getDictNameByCode(SecurityEventDict.DEVICE_STATUS, group.getStatus()); String result = numberFormat.format((float) group.getQuantity() / (float) sum * 100); - resultMap.put(devStatus, result+"%"); + GateStatusGroupResponse gateStatusGroupResponse = new GateStatusGroupResponse(); + gateStatusGroupResponse.setStatus(devStatus); + gateStatusGroupResponse.setRatio(result+"%"); + resultList.add(gateStatusGroupResponse); }); - resultMap.put("总", sum); + resultMap.put("total", sum); + resultMap.put("list", resultList); return ResponseData.success(resultMap); } @@ -282,17 +333,38 @@ String position = securityScoreDTO.getPosition(); List caseInfos = caseInfoMapper.selectByPosition(position); //查询各危险级别权重、各类别权重,放入map,避免循环中多次查数据库 - + HashMap hazardScoreMap = new HashMap<>(); + List caseHazardLevelList = hazardLevelMapper.getCaseHazardLevelList(null); + caseHazardLevelList.forEach(hazardLevel -> { + hazardScoreMap.put(hazardLevel.getCode(), hazardLevel.getWeight()); + }); + HashMap categoryScoreMap = new HashMap<>(); + List categoryLevelList = categoryLevelMapper.getCaseCategoryLevelList(null); + categoryLevelList.forEach(categoryLevel -> { + categoryScoreMap.put(categoryLevel.getCode(), categoryLevel.getWeight()); + }); + //事件按楼层分组,计算 List securityScoreDTOs = new ArrayList<>(); caseInfos.forEach(caseInfo -> { SecurityScoreDTO securityScoreDTO1 = new SecurityScoreDTO(); + securityScoreDTO1.setPosition(caseInfo.getPosition()); securityScoreDTO1.setArea(caseInfo.getArea()); - // TODO: 2022/8/4 楼层评分计算根据产品定义调整 -// caseInfo.get -// securityScoreDTO1.setScore(); + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); + Double score = 100 - Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + securityScoreDTO1.setScore(score); + securityScoreDTOs.add(securityScoreDTO1); }); - - return null; + 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); + }); + return ResponseData.success(securityScoreDTOs); } /** @@ -303,9 +375,13 @@ public Object SecurityFrequency(@RequestBody SecurityFrequencyDTO securityFrequencyDTO) { String year = securityFrequencyDTO.getYear(); String month = securityFrequencyDTO.getMonth(); - Integer quantity = caseInfoMapper.selectCountByMonth(year, month); - securityFrequencyDTO.setQuantity(quantity); - return ResponseData.success(securityFrequencyDTO); + if(!StringUtils.isEmpty(year) && StringUtils.isEmpty(month)){ + Integer quantity = caseInfoMapper.selectCountByMonth(year, month); + securityFrequencyDTO.setQuantity(quantity); + return ResponseData.success(securityFrequencyDTO); + } + List list = caseInfoMapper.selectPreMonthCount(); + return ResponseData.success(list); } } 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 ae4d770..f4f075c 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 @@ -1,20 +1,25 @@ package com.casic.missiles.modular.controller.cockpit; +import cn.hutool.core.date.DateUnit; import cn.hutool.core.date.DateUtil; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.casic.missiles.model.response.ResponseData; -import com.casic.missiles.modular.dao.AttendanceInfoMapper; -import com.casic.missiles.modular.dao.CaseInfoMapper; -import com.casic.missiles.modular.dao.HazardLevelMapper; -import com.casic.missiles.modular.dao.StaffInfoMapper; +import com.casic.missiles.modular.dao.*; +import com.casic.missiles.modular.dto.DeviceRepairLogDTO; +import com.casic.missiles.modular.dto.DeviceRepairRequest; import com.casic.missiles.modular.dto.statistics.*; +import com.casic.missiles.modular.enums.SecurityEventType; +import com.casic.missiles.modular.model.CaseCategoryLevel; import com.casic.missiles.modular.model.CaseHazardLevel; +import com.casic.missiles.modular.model.CaseInfo; import com.casic.missiles.modular.model.StaffInfo; +import com.casic.missiles.modular.service.DeviceInfoService; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.util.CollectionUtils; import org.springframework.web.bind.annotation.*; +import java.math.BigDecimal; import java.text.NumberFormat; import java.util.*; import java.util.stream.Collectors; @@ -40,6 +45,12 @@ @Autowired private HazardLevelMapper hazardLevelMapper; + @Autowired + private CategoryLevelMapper categoryLevelMapper; + + @Autowired + private DeviceInfoService deviceInfoService; + /** * 安防事件时域频次统计,每月的每天安防事件个数(原方案) * 月维度:展示每个月的每天的数据 @@ -89,15 +100,17 @@ List monthList = caseInfoMapper.selectPreMonthCountByYear(year); Map> collect = monthList.stream().collect(Collectors.groupingBy(PreMonthOrWeekCaseDTO::getHazardLevelCode)); HashMap strAvgMap = new HashMap<>(); + List resultList = new ArrayList<>(); for (String key : collect.keySet()) { List preMonthOrWeekCaseDTOS = collect.get(key); int sum = preMonthOrWeekCaseDTOS.stream().mapToInt(PreMonthOrWeekCaseDTO::getQuantity).sum(); //若年份是本年,则使用个安防级别数量/当前月份数 //若不是本年,除数为12 MonthAndWeekDTO monthAndWeekDTO = new MonthAndWeekDTO(); + String hazardName = hazardLevelMapper.selectHazardNameByCode(key); + monthAndWeekDTO.setLevelName(hazardName); if(year.equals(String.valueOf(DateUtil.thisYear()))){ monthAndWeekDTO.setMonthQuantity(sum / DateUtil.thisMonth()); -// monthAndWeekDTO.setLevelName(); strAvgMap.put(key, monthAndWeekDTO); }else{ monthAndWeekDTO.setMonthQuantity(sum / 12); @@ -113,27 +126,37 @@ if(year.equals(String.valueOf(DateUtil.thisYear()))){ if(!Objects.isNull(strAvgMap.get(key))){ MonthAndWeekDTO monthAndWeekDTO = strAvgMap.get(key); + String hazardName = hazardLevelMapper.selectHazardNameByCode(key); + monthAndWeekDTO.setLevelName(hazardName); monthAndWeekDTO.setWeekQuantity(sum / DateUtil.thisWeekOfYear()); strAvgMap.put(key, monthAndWeekDTO); }else{ MonthAndWeekDTO monthAndWeekDTO = new MonthAndWeekDTO(); + String hazardName = hazardLevelMapper.selectHazardNameByCode(key); + monthAndWeekDTO.setLevelName(hazardName); monthAndWeekDTO.setWeekQuantity(sum / DateUtil.thisWeekOfYear()); strAvgMap.put(key, monthAndWeekDTO); } }else{ if(!Objects.isNull(strAvgMap.get(key))){ MonthAndWeekDTO monthAndWeekDTO = strAvgMap.get(key); + String hazardName = hazardLevelMapper.selectHazardNameByCode(key); + monthAndWeekDTO.setLevelName(hazardName); monthAndWeekDTO.setWeekQuantity(sum / 52); strAvgMap.put(key, monthAndWeekDTO); }else{ MonthAndWeekDTO monthAndWeekDTO = new MonthAndWeekDTO(); + String hazardName = hazardLevelMapper.selectHazardNameByCode(key); + monthAndWeekDTO.setLevelName(hazardName); monthAndWeekDTO.setWeekQuantity(sum / 52); strAvgMap.put(key, monthAndWeekDTO); } } } - avgMonthAndWeekGroupDTO.setMap(strAvgMap); - return ResponseData.success(avgMonthAndWeekGroupDTO); + strAvgMap.keySet().forEach(key -> { + resultList.add(strAvgMap.get(key)); + }); + return ResponseData.success(resultList); } /** @@ -181,12 +204,178 @@ } /** - * 员工考勤人数变化,功能待定 + * 员工考勤人数变化,统计当天(横坐标为时)及近7天(横坐标为天)的考勤人数变化,只要发生一次考勤识别,次数的基数就正常增加(没有上班下班区分) */ + @PostMapping("/staff/attendanceNumber/{dimension}") + @ResponseBody + public Object attendanceNumber(@PathVariable("dimension") String dimension) { + List attendanceNumberDTOs = null; + List> resultList = new ArrayList<>(); + if("week".equals(dimension)){ + //近7天数据按天分组统计 + attendanceNumberDTOs = attendanceInfoMapper.getCountForWeek(); + }else if("day".equals(dimension)) { + //今天数据按小时分组统计 + attendanceNumberDTOs = attendanceInfoMapper.getCountForDay(); + } + if(CollectionUtils.isEmpty(attendanceNumberDTOs)){ + return ResponseData.error("该查询条件下,无员工出勤数据!"); + } + Map> collect = attendanceNumberDTOs.stream().collect(Collectors.groupingBy(AttendanceNumberDTO::getDate)); + collect.keySet().forEach(key -> { + List attendanceNumberDTOS = collect.get(key); + AttendanceNumberDTO attendanceNumberDTO = attendanceNumberDTOS.get(0); + AttendanceNumberDTO attendanceNumberDTO2 = attendanceNumberDTOS.get(1); + Map resultMap = new HashMap<>(); + resultMap.put(attendanceNumberDTO.getStaffType(), attendanceNumberDTO.getQuantity()); + resultMap.put(attendanceNumberDTO2.getStaffType(), attendanceNumberDTO2.getQuantity()); + resultMap.put("staticTime", attendanceNumberDTO.getDate()); + resultList.add(resultMap); + }); + return ResponseData.success(resultList); + } /** - * 近30天/近一周安保人员到岗排行 + * 早晚高峰区域安防评估 */ + @PostMapping("/security/assessment/{dimension}") + @ResponseBody + public Object securityAssessment(@PathVariable("dimension") String dimension) { + //查询各危险级别权重、各类别权重,放入map,避免循环中多次查数据库 + HashMap hazardScoreMap = new HashMap<>(); + List caseHazardLevelList = hazardLevelMapper.getCaseHazardLevelList(null); + caseHazardLevelList.forEach(hazardLevel -> { + hazardScoreMap.put(hazardLevel.getCode(), hazardLevel.getWeight()); + }); + HashMap categoryScoreMap = new HashMap<>(); + List categoryLevelList = categoryLevelMapper.getCaseCategoryLevelList(null); + categoryLevelList.forEach(categoryLevel -> { + categoryScoreMap.put(categoryLevel.getCode(), categoryLevel.getWeight()); + }); + HashMap hashMap = new HashMap<>(); + if("week".equals(dimension)){ + //近7天早晚高峰数据 + List caseInfos = caseInfoMapper.selectListBySevenDay(); + //按时间(天)进行分组 + caseInfos.forEach(caseInfo -> { + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); + Double score = Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + String[] array = caseInfo.getHappenTime().split(" "); + String dayTime = array[0]; + BigDecimal preScore; + if(hashMap.containsKey(dayTime)){ + Double aDouble = hashMap.get(dayTime); + preScore = new BigDecimal(aDouble.toString()); + + }else{ + preScore = new BigDecimal("100.0"); + } + BigDecimal nowScore = new BigDecimal(score.toString()); + hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); + }); + return ResponseData.success(hashMap); + }else if("day".equals(dimension)) { + //今天数据按小时分组统计 + List caseInfos = caseInfoMapper.selectListByToday(); + caseInfos.forEach(caseInfo -> { + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); + Double score = Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + String[] array = caseInfo.getHappenTime().split(":"); + String dayTime = array[0]; + BigDecimal preScore; + if(hashMap.containsKey(dayTime)){ + Double aDouble = hashMap.get(dayTime); + preScore = new BigDecimal(aDouble.toString()); + + }else{ + preScore = new BigDecimal("100.0"); + } + BigDecimal nowScore = new BigDecimal(score.toString()); + hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); + }); + return ResponseData.success(hashMap); + } + return null; + } + + /** + * 重点区域安防事态评估,统计重点区域6:00-23:00按小时分组数据 + */ + @GetMapping("/security/keyAreaStatistic") + @ResponseBody + public Object keyAreaStatistic() { + //查询各危险级别权重、各类别权重,放入map,避免循环中多次查数据库 + HashMap hazardScoreMap = new HashMap<>(); + List caseHazardLevelList = hazardLevelMapper.getCaseHazardLevelList(null); + caseHazardLevelList.forEach(hazardLevel -> { + hazardScoreMap.put(hazardLevel.getCode(), hazardLevel.getWeight()); + }); + HashMap categoryScoreMap = new HashMap<>(); + List categoryLevelList = categoryLevelMapper.getCaseCategoryLevelList(null); + categoryLevelList.forEach(categoryLevel -> { + categoryScoreMap.put(categoryLevel.getCode(), categoryLevel.getWeight()); + }); + HashMap hashMap = new HashMap<>(); + //今天数据按小时分组统计 + List caseInfos = caseInfoMapper.selectListByToday2(); + caseInfos.forEach(caseInfo -> { + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); + Double score = Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + String[] array = caseInfo.getHappenTime().split(":"); + String dayTime = array[0]; + BigDecimal preScore; + if(hashMap.containsKey(dayTime)){ + Double aDouble = hashMap.get(dayTime); + preScore = new BigDecimal(aDouble.toString()); + + }else{ + preScore = new BigDecimal("100.0"); + } + BigDecimal nowScore = new BigDecimal(score.toString()); + hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); + }); + return ResponseData.success(hashMap); + } + + /** + * 安防机动支援力量调配响应评估,根据事件已解决状态及已解决时间-发送时间,按时间(小时)分组统计 + */ + @GetMapping("/security/responseAssess") + @ResponseBody + public Object responseAssess() { + //查询各危险级别权重、各类别权重,放入map,避免循环中多次查数据库 + HashMap hazardScoreMap = new HashMap<>(); + List caseHazardLevelList = hazardLevelMapper.getCaseHazardLevelList(null); + caseHazardLevelList.forEach(hazardLevel -> { + hazardScoreMap.put(hazardLevel.getCode(), hazardLevel.getWeight()); + }); + HashMap hashMap = new HashMap<>(); + //今天数据按小时分组统计 + List caseInfos = caseInfoMapper.selectListByToday3(); + caseInfos.forEach(caseInfo -> { + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + //扣分=事件级别权重*未解决小时数 + Date updateTime = DateUtil.parse(caseInfo.getUpdateTime()); + Date happenTime = DateUtil.parse(caseInfo.getHappenTime()); + long between = DateUtil.between(updateTime, happenTime, DateUnit.HOUR); + Double score = Double.valueOf(hazardWeight)*between; + String[] array = caseInfo.getHappenTime().split(":"); + String dayTime = array[0]; + BigDecimal preScore; + if(hashMap.containsKey(dayTime)){ + Double aDouble = hashMap.get(dayTime); + preScore = new BigDecimal(aDouble.toString()); + }else{ + preScore = new BigDecimal("100.0"); + } + BigDecimal nowScore = new BigDecimal(score.toString()); + hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); + }); + return ResponseData.success(hashMap); + } /** * 重点区域威胁事件类型统计,优先级2,统计近7天和近30天 @@ -224,7 +413,34 @@ } /** - * 设备状态计算系数和评判,优先级3,需确认设备恢复时间是否可以获取 + * 近30天/近一周安保人员到岗排行 */ + + /** + * 安保等级评估,发生离岗事件减1分 + */ + @GetMapping("/security/levelAssess") + @ResponseBody + public Object securityLevelAssess() { + //今天数据按小时分组统计 + List resultList = caseInfoMapper.selectListByType(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); + resultList.forEach(result -> { + BigDecimal deScore = new BigDecimal(result.getQuantity()); + BigDecimal preScore = new BigDecimal("100.0"); + result.setScore(preScore.subtract(deScore).doubleValue()); + }); + return ResponseData.success(resultList); + } + + /** + * 设备状态计算系数和评判,即设备维修管理查询(不分页) + */ + @PostMapping("/device/repairList") + @ResponseBody + public Object repairList(@RequestBody DeviceRepairRequest deviceRepairRequest) { + List deviceRepairLogDTOS = deviceInfoService.deviceRepairListPage(deviceRepairRequest); + return ResponseData.success(deviceRepairLogDTOS); + } + } 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 fbf8ab6..c71a15a 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 @@ -1,13 +1,12 @@ package com.casic.missiles.modular.controller.hik; +import cn.hutool.core.date.DateTime; +import cn.hutool.core.date.DateUtil; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.casic.missiles.model.response.ResponseData; import com.casic.missiles.modular.dao.HikFaceGroupInfoMapper; -import com.casic.missiles.modular.dto.hik.EventSubscribeRequest; -import com.casic.missiles.modular.dto.hik.FaceGroupAdditionRequest; -import com.casic.missiles.modular.dto.hik.HikRecvEvent; -import com.casic.missiles.modular.dto.hik.OrgBatchAdd; +import com.casic.missiles.modular.dto.hik.*; import com.casic.missiles.modular.enums.HikUri; import com.casic.missiles.modular.enums.SecurityEventType; import com.casic.missiles.modular.model.CaseInfo; @@ -18,16 +17,20 @@ import com.casic.missiles.modular.util.CaseInfoFactoryUtil; import com.casic.missiles.modular.util.HikUtil; import com.casic.missiles.modular.util.ThreadPoolUtil; +import com.casic.missiles.modular.util.WebSocket; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; -import org.springframework.web.bind.annotation.*; +import org.springframework.util.CollectionUtils; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.RestController; -import java.net.InetAddress; -import java.net.UnknownHostException; import java.util.ArrayList; +import java.util.Iterator; import java.util.List; import java.util.Objects; @@ -38,7 +41,6 @@ */ @Slf4j @RestController -@RequestMapping("/hik") public class HikController { @Autowired @@ -53,28 +55,37 @@ @Autowired private HikService hikService; + @Autowired + private HikFaceGroupInfoMapper hikFaceGroupInfoMapper; + + @Autowired + private WebSocket webSocket; + @Value("${server.port}") private int serverPort; - @Autowired - private HikFaceGroupInfoMapper hikFaceGroupInfoMapper; /** * 海康事件订阅 */ - @PostMapping("/event/subscribe") + @PostMapping("/hik/event/subscribe") @ResponseBody - public Object eventSubscribe() throws UnknownHostException { + public Object eventSubscribe() { EventSubscribeRequest eventSubscribeRequest = new EventSubscribeRequest(); ArrayList list = new ArrayList<>(); list.add(SecurityEventType.DEVICE_OFFLINE); + list.add(SecurityEventType.DEVICE_ONLINE); list.add(SecurityEventType.KEY_PERSONNEL_IDENTIFY_EVENT); list.add(SecurityEventType.MONITORING_POINT_OFFLINE); + list.add(SecurityEventType.MONITORING_POINT_ONLINE); list.add(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); list.add(SecurityEventType.PERSONNEL_GATHER_EVENT); - InetAddress localHost = InetAddress.getLocalHost(); + list.add(SecurityEventType.VISITOR_REGISTER); + list.add(SecurityEventType.VISITOR_CHECKOUT); + list.add(SecurityEventType.HIGH_ALTITUDE_PARABOLIC); +// InetAddress localHost = InetAddress.getLocalHost(); eventSubscribeRequest.setEventTypes(list); - eventSubscribeRequest.setEventDest("https://" + localHost + ":" + serverPort + "/eventRcv"); + eventSubscribeRequest.setEventDest("http://" + "192.168.10.6" + ":" + serverPort + "/eventRcv"); //订阅类型,0-订阅原始事件,1-联动事件,2-原始事件和联动事件,不填使用默认值0 eventSubscribeRequest.setSubType(0); /** @@ -92,19 +103,25 @@ } /** + * 查询事件订阅信息 + */ + @PostMapping("/hik/event/query") + @ResponseBody + public Object eventQuery() { + String result = HikUtil.hikApi(HikUri.EVENT_INFO, ""); + return result; + } + + /** * 海康事件接收 */ @PostMapping("/eventRcv") @ResponseBody public Object eventRcv(@RequestBody HikRecvEvent hikRecvEvent) { //1、接收所需事件类型 - Long eventType = hikRecvEvent.getEventType(); + Number eventType = hikRecvEvent.getEventType(); log.info("接收到安防事件类型为:{}", eventType); CaseInfo caseInfo = caseInfoFactoryUtil.getCaseInfo(eventType); - //接收到不关心事件直接返回 - if(Objects.isNull(caseInfo)){ - return ResponseData.success(); - } //2、不同事件不同处理,caseInfoFactoryUtil已设置好事件基础定义信息 // 再为事件添加状态、设备编码、设备名称、位置、区域、时间 // 异步处理事件 @@ -114,19 +131,23 @@ caseHandle(hikRecvEvent, eventType, caseInfo); } })); +// caseHandle(hikRecvEvent, eventType, caseInfo); - return null; + return ResponseData.success(); } - private void caseHandle(HikRecvEvent hikRecvEvent, Long eventType, CaseInfo caseInfo) { + private void caseHandle(HikRecvEvent hikRecvEvent, Number eventType, CaseInfo caseInfo) { JSONArray eventArray = hikRecvEvent.getEventArray(); List caseInfos = new ArrayList<>(); - while (eventArray.stream().iterator().hasNext()) { + Iterator iterator = eventArray.iterator(); + while (iterator.hasNext()) { CaseInfo caseInfo1 = new CaseInfo(); - BeanUtils.copyProperties(caseInfo, caseInfo1); - JSONObject event = (JSONObject) eventArray.stream().iterator().next(); + if(!Objects.isNull(caseInfo)){ + BeanUtils.copyProperties(caseInfo, caseInfo1); + } + JSONObject event = (JSONObject) iterator.next(); //5种事件进行不同处理 - if(SecurityEventType.KEY_PERSONNEL_IDENTIFY_EVENT == eventType){ + if (SecurityEventType.KEY_PERSONNEL_IDENTIFY_EVENT.equals(eventType)) { //判断所属人脸分组 JSONObject data = (JSONObject) event.get("data"); JSONObject faceRecognitionResult = (JSONObject) data.get("faceRecognitionResult"); @@ -142,52 +163,101 @@ if (faceGroupCode.equals(blackListGroup.getFaceGroupCode())) { //黑名单分组处理 caseInfo1 = hikService.blackListHandle(event, caseInfo1); - }else if(faceGroupCode.equals(propertyPersonnelGroup.getFaceGroupCode())){ + } else if (faceGroupCode.equals(propertyPersonnelGroup.getFaceGroupCode())) { //考勤分组处理-物业人员,添加到考勤表 hikService.propertyAttendanceHandle(event); - }else if(faceGroupCode.equals(securityPersonnelGroup.getFaceGroupCode())){ + } else if (faceGroupCode.equals(securityPersonnelGroup.getFaceGroupCode())) { //考勤分组处理-安保人员,添加到考勤表 hikService.securityPersonnelHandle(event); - }else { + } else { return; } - }else if(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT == eventType){ + } else if (SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT.equals(eventType)) { //离岗事件处理 caseInfo1 = hikService.demobilizedHandle(event, caseInfo1); - }else if(SecurityEventType.PERSONNEL_GATHER_EVENT == eventType){ + } else if (SecurityEventType.PERSONNEL_GATHER_EVENT.equals(eventType)) { //人员聚集事件处理 caseInfo1 = hikService.personGatherHandle(event, caseInfo1); - }else if(SecurityEventType.MONITORING_POINT_OFFLINE == eventType){ + } else if (SecurityEventType.MONITORING_POINT_OFFLINE.equals(eventType)) { //监控点离线事件处理 caseInfo1 = hikService.monitorPointOfflineHandle(event, caseInfo1); - }else if(SecurityEventType.DEVICE_OFFLINE == eventType){ + } else if (SecurityEventType.MONITORING_POINT_ONLINE.equals(eventType)) { + //监控点上线事件处理 + hikService.monitorPointOnlineHandle(event); + } else if (SecurityEventType.DEVICE_OFFLINE.equals(eventType)) { //装置离线事件处理 caseInfo1 = hikService.deviceOfflineHandle(event, caseInfo1); - }else if(SecurityEventType.VISITOR_REGISTER == eventType){ + } else if (SecurityEventType.DEVICE_ONLINE.equals(eventType)) { + //装置上线处理 + hikService.deviceOnlineHandle(event); + } else if (SecurityEventType.VISITOR_REGISTER.equals(eventType)) { //记录访客登记记录,添加到访客记录表 hikService.visitorRegisterHandler(event); - }else if(SecurityEventType.VISITOR_CHECKOUT == eventType){ + } else if (SecurityEventType.VISITOR_CHECKOUT.equals(eventType)) { //记录访客签离记录 hikService.visitorCheckOutHandler(event); } - if(!Objects.isNull(caseInfo1) && !StringUtils.isEmpty(caseInfo1.getHappenTime())){ + if (!Objects.isNull(caseInfo1) && !StringUtils.isEmpty(caseInfo1.getHappenTime())) { caseInfos.add(caseInfo1); } } //3、安防事件入库 - if(!caseInfoService.insertCaseInfoBatch(caseInfos)){ - log.error("安防事件批量入库异常"); + if (!CollectionUtils.isEmpty(caseInfos) && !caseInfoService.insertCaseInfoBatch(caseInfos)) { + log.error("安防事件批量入库异常!"); } // TODO: 2022/8/15 webSocket推送 + if (CollectionUtils.isEmpty(caseInfos)) { + log.info("webSocket事件推送"); + webSocket.sendAllMessage(JSONObject.toJSONString(caseInfos)); + } return; } /** + * 以图搜图,前端用于轨迹追踪 + */ + @PostMapping("/hik/search/picture") + @ResponseBody + public Object searchPictures(@RequestBody SearchPicturesRequest searchPicturesRequest) { + DateTime startDateTime = DateUtil.parse(searchPicturesRequest.getStartTime()); + DateTime endDateTime = DateUtil.parse(searchPicturesRequest.getEndTime()); + String startTime = DateUtil.format(startDateTime, "yyyy-MM-dd'T'HH:mm:ss.SSSXXX"); + String endTime = DateUtil.format(endDateTime, "yyyy-MM-dd'T'HH:mm:ss.SSSXXX"); + searchPicturesRequest.setStartTime(startTime); + searchPicturesRequest.setEndTime(endTime); + String body = JSONObject.toJSONString(searchPicturesRequest); + String resultStr = HikUtil.hikApi(HikUri.SEARCH_PICTURES, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (!"0".equals(resultJson.get("code"))) { + log.error("请求海康,以图搜图失败,海康response:{}", resultStr); + return ResponseData.error("以图搜图失败"); + } + return ResponseData.success(resultJson); + } + + + /** + * 海康事件取消订阅 + */ + @PostMapping("/hik/event/cancel") + @ResponseBody + public Object eventCancelSubscribe(@RequestBody CancelSubscribeRequest cancelSubscribeRequest) { + String body = JSONObject.toJSONString(cancelSubscribeRequest); + String resultStr = HikUtil.hikApi(HikUri.EVENT_CANCEL, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (!"0".equals(resultJson.get("code"))) { + log.error("请求海康,取消订阅失败,海康response:{}", resultStr); + return ResponseData.error("取消订阅失败"); + } + return ResponseData.success(resultJson); + } + + /** * 单个添加海康人脸分组 * api->hik单个添加人脸分组api->response->mysql */ - @PostMapping("/faceGroup/single/add") + @PostMapping("/hik/faceGroup/single/add") @ResponseBody public Object faceGroupAddition(@RequestBody FaceGroupAdditionRequest faceGroupAdditionRequest) { String body = JSONObject.toJSONString(faceGroupAdditionRequest); @@ -212,7 +282,7 @@ * 批量添加海康组织 * api->hik批量添加组织api->response */ - @PostMapping("/org/batch/add") + @PostMapping("/hik/org/batch/add") @ResponseBody public Object orgBatchAdd(@RequestBody List orgBatchAddRequest) { String body = JSONObject.toJSONString(orgBatchAddRequest); @@ -232,4 +302,62 @@ return ResponseData.error("批量添加组织失败"); } + /** + * 获取人员列表 + */ + @PostMapping("/hik/person/personList") + @ResponseBody + public Object personList() { + PersonListRequest request = new PersonListRequest(); + request.setPageNo(1); + request.setPageSize(100); + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi("/api/resource/v2/person/personList", body); + return resultStr; + } + + /** + * 获取组织列表 + */ + @PostMapping("/hik/org/orgList") + @ResponseBody + public Object orgList() { + PersonListRequest request = new PersonListRequest(); + request.setPageNo(1); + request.setPageSize(100); + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi("/api/resource/v1/org/orgList", body); + return resultStr; + } + + /** + * 查询访客权限下载记录 + */ + @PostMapping("/hik/auth/result") + @ResponseBody + public Object authResult() { + PersonListRequest request = new PersonListRequest(); + request.setPageNo(1); + request.setPageSize(100); + request.setOrderId("ba101db6246711edaea66f7939a13638"); + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi("/api/visitor/v1/auth/result", body); + return resultStr; + } + + /** + * 人脸图片获取 + */ + @PostMapping("/hik/face/picture") + @ResponseBody + public Object facePicture() { + FaceRequest request = new FaceRequest(); +// List list = new ArrayList<>(); +// list.add(""); + request.setCertificateNum("wanggong"); + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi("/api/frs/v1/face", body); + return resultStr; + } + } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/AssetInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/AssetInfoMapper.java index 4f64e83..c0684ee 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/AssetInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/AssetInfoMapper.java @@ -17,6 +17,6 @@ @Mapper public interface AssetInfoMapper extends BaseMapper { - List getAssetInfoListPage(@Param("page") Page page, AssetInfoRequest assetInfoRequest); + List getAssetInfoListPage(@Param("page") Page page, @Param("assetInfoRequest") AssetInfoRequest assetInfoRequest); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/AttendanceInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/AttendanceInfoMapper.java index f9e793e..ec87e46 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/AttendanceInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/AttendanceInfoMapper.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.statistics.AttendanceNumberDTO; import com.casic.missiles.modular.dto.statistics.AttendanceRatioDTO; import com.casic.missiles.modular.model.AttendanceInfo; import org.apache.ibatis.annotations.Mapper; @@ -17,7 +18,7 @@ */ @Mapper public interface AttendanceInfoMapper extends BaseMapper { - List getAttendanceInfoListPage(@Param("page") Page page, StaffInfoRequest attendanceInfoRequest); + List getAttendanceInfoListPage(@Param("page") Page page, @Param("attendanceInfoRequest") StaffInfoRequest attendanceInfoRequest); AttendanceInfo selectByCodeAndDate(@Param("staffCode") String staffCode); @@ -26,4 +27,8 @@ List getCountByTypeAndDateForMonth(@Param("staffType")String staffType); List getCountByTypeAndDateForYear(@Param("staffType")String staffType); + + List getCountForWeek(); + + List getCountForDay(); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java index ce94b8f..6137a7d 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java @@ -17,5 +17,5 @@ @Mapper public interface BlackInfoMapper extends BaseMapper { - List getBlackInfoListPage(@Param("page") Page page, BlackInfoRequest blackInfoRequest); + List getBlackInfoListPage(@Param("page") Page page, @Param("blackInfoRequest") BlackInfoRequest blackInfoRequest); } 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 efda6b3..50aaa6f 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 @@ -20,7 +20,7 @@ List getCaseInfoListPage(@Param("page") Page page, @Param("caseInfoRequest") CaseInfoRequest caseInfoRequest); - int updateStatusById(CaseInfoRequest caseInfoRequest); + int updateStatusById(@Param("caseInfoRequest") CaseInfoRequest caseInfoRequest); List selectByLevelAndMonth(@Param("year") String year); @@ -47,4 +47,20 @@ List selectPreWeekCountByThirtyDay(); List selectPreDayCountBySevenDay(); + + Integer selectDemobilizedCount(@Param("eventType") Number personnelDemobilizedEvent); + + List selectPreMonthCount(); + + List selectListBySevenDay(); + + List selectListByToday(); + + List selectListByToday2(); + + List selectListByToday3(); + + List selectListByType(@Param("eventType") Number eventType); + + List selectDemobilizedCountByHour(@Param("eventType") Number eventType); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/CategoryLevelMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/CategoryLevelMapper.java index 52fc714..afe1650 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/CategoryLevelMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/CategoryLevelMapper.java @@ -17,9 +17,9 @@ @Mapper public interface CategoryLevelMapper extends BaseMapper { - List getCaseCategoryLevelListPage(@Param("page") Page page, CategoryLevelRequest categoryLevelRequest); + List getCaseCategoryLevelListPage(@Param("page") Page page, @Param("categoryLevelRequest") CategoryLevelRequest categoryLevelRequest); - List getCaseCategoryLevelList(CategoryLevelRequest categoryLevelRequest); + List getCaseCategoryLevelList(@Param("categoryLevelRequest") CategoryLevelRequest categoryLevelRequest); CaseCategoryLevel getCaseCategoryLevel(@Param("categoryLevelCode") String categoryLevelCode); 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 66353b1..2555a09 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 @@ -19,7 +19,7 @@ @Mapper public interface DeviceInfoMapper extends BaseMapper { - List getDeviceInfoListPage(@Param("page") Page page, DeviceInfoRequest deviceInfoRequest); + List getDeviceInfoListPage(@Param("page") Page page, @Param("deviceInfoRequest") DeviceInfoRequest deviceInfoRequest); List getDeviceInfoList(@Param("deviceInfoRequest") DeviceInfoRequest deviceInfoRequest); @@ -27,6 +27,8 @@ DeviceInfo getByIndexCode(@Param("srcIndex") String srcIndex); + DeviceInfo getByIp(@Param("ip") String ip); + List selectIndexCodesByCodes(@Param("deviceCodes") List deviceCodes); List selectByType(@Param("devType") String devType); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java index 41dd0af..5bfaf63 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java @@ -5,6 +5,7 @@ import com.casic.missiles.modular.dto.DeviceRepairRequest; import com.casic.missiles.modular.model.DeviceRepairLog; import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; import java.util.List; @@ -16,7 +17,7 @@ @Mapper public interface DeviceRepairLogMapper extends BaseMapper { - List getDeviceRepairListPage(Page page, DeviceRepairRequest deviceRepairRequest); + List getDeviceRepairListPage(@Param("page") Page page, @Param("deviceRepairRequest")DeviceRepairRequest deviceRepairRequest); - List getDeviceRepairList(DeviceRepairRequest deviceRepairRequest); + List getDeviceRepairList(@Param("deviceRepairRequest") DeviceRepairRequest deviceRepairRequest); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java index 9035c47..4823ac1 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java @@ -18,7 +18,7 @@ @Mapper public interface FireEquipInfoMapper extends BaseMapper { - List getFireEquipInfoListPage(@Param("page") Page page, FireEquipRequest fireEquipRequest); + List getFireEquipInfoListPage(@Param("page") Page page, @Param("fireEquipRequest") FireEquipRequest fireEquipRequest); FireEquipInfo getFireEquipInfo(@Param("equipCode") String equipCode); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/GateGroupMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/GateGroupMapper.java index d8c330d..977a427 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/GateGroupMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/GateGroupMapper.java @@ -17,7 +17,7 @@ */ @Mapper public interface GateGroupMapper extends BaseMapper { - List getGateGroupListPage(@Param("page") Page page, GateGroupRequest gateGroupRequest); + List getGateGroupListPage(@Param("page") Page page, @Param("gateGroupRequest") GateGroupRequest gateGroupRequest); GateGroup getGateGroupByName(@Param("groupName") String groupName); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/HazardLevelMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/HazardLevelMapper.java index 8957780..dcf47bb 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/HazardLevelMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/HazardLevelMapper.java @@ -17,11 +17,13 @@ @Mapper public interface HazardLevelMapper extends BaseMapper { - List getCaseHazardLevelListPage(@Param("page") Page page, HazardLevelRequest hazardLevelRequest); + List getCaseHazardLevelListPage(@Param("page") Page page, @Param("hazardLevelRequest") HazardLevelRequest hazardLevelRequest); - List getCaseHazardLevelList(HazardLevelRequest hazardLevelRequest); + List getCaseHazardLevelList(@Param("hazardLevelRequest") HazardLevelRequest hazardLevelRequest); CaseHazardLevel getCaseHazardLevel(@Param("hazardLevelCode") String hazardLevelCode); List selectHazardName(); + + String selectHazardNameByCode(@Param("hazardLevelCode") String hazardLevelCode); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/HikCaseDefineMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/HikCaseDefineMapper.java index 0dc47d1..f162fef 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/HikCaseDefineMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/HikCaseDefineMapper.java @@ -12,5 +12,5 @@ */ @Mapper public interface HikCaseDefineMapper extends BaseMapper { - HikCaseDefine getHikCaseDefine(@Param("caseTypeCode") Long caseTypeCode); + HikCaseDefine getHikCaseDefine(@Param("caseTypeCode") Number caseTypeCode); } 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 f8a674c..fe5afc2 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 @@ -17,11 +17,13 @@ @Mapper public interface StaffInfoMapper extends BaseMapper { - List getStaffInfoListPage(@Param("page") Page page, StaffInfoRequest staffInfoRequest); + List getStaffInfoListPage(@Param("page") Page page, @Param("staffInfoRequest") StaffInfoRequest staffInfoRequest); StaffInfo selectByCode(@Param("staffCode") String staffCode); - List getStaffInfoList(StaffInfoRequest staffInfoRequest); + List getStaffInfoList(@Param("staffInfoRequest") StaffInfoRequest staffInfoRequest); - List selectBatchCodes(List list); + List selectBatchCodes(@Param("list") List list); + + int updateByCodeForCard(@Param("staffCode") String staffCode, @Param("cardNo") String cardNo); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitInfoMapper.java index b1217c5..6c52542 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitInfoMapper.java @@ -16,7 +16,7 @@ */ @Mapper public interface VisitInfoMapper extends BaseMapper { - List getVisitInfoListPage(@Param("page") Page page, VisitorRequest visitorRequest); + List getVisitInfoListPage(@Param("page") Page page, @Param("visitorRequest") VisitorRequest visitorRequest); VisitInfo selectByOrderId(@Param("orderId") String orderId); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitorApplyMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitorApplyMapper.java index c09f3c0..6ea55bd 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitorApplyMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitorApplyMapper.java @@ -18,7 +18,7 @@ @Mapper public interface VisitorApplyMapper extends BaseMapper { - List getVisitorApplyListPage(@Param("page") Page page, VisitorApplyRequest visitorApplyRequest); + List getVisitorApplyListPage(@Param("page") Page page, @Param("visitorApplyRequest") VisitorApplyRequest visitorApplyRequest); List selectByVisitReason(); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/AttendanceInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/AttendanceInfoMapper.xml index b2ece71..f8bdd6e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/AttendanceInfoMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/AttendanceInfoMapper.xml @@ -43,7 +43,8 @@ and staff_type = #{staffType} - and YEARWEEK(date_format(atte_date, '%Y-%m-%d'), 1) = YEARWEEK(now(),1); + AND DATE_SUB(CURDATE(), INTERVAL 7 DAY) <= DATE(atte_date) + GROUP BY DATE_FORMAT(atte_date, '%Y-%m-%d') @@ -69,4 +70,20 @@ GROUP BY DATE_FORMAT(atte_date, '%Y-%m') + + + \ No newline at end of file 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 2b6953f..06ec0a8 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 @@ -28,7 +28,9 @@ @@ -87,7 +89,8 @@ SELECT hazard_level_code as levelCode, count(id) as quantity FROM bus_case_info WHERE hazard_level_code is not null - AND DATE_SUB(CURDATE(), INTERVAL 7 DAY) <= date(happen_time); + AND is_key_area = 1 + AND DATE_SUB(CURDATE(), INTERVAL 7 DAY) <= date(happen_time) GROUP BY hazard_level_code @@ -95,7 +98,8 @@ SELECT hazard_level_code as levelCode, count(id) as quantity FROM bus_case_info WHERE hazard_level_code is not null - AND DATE_SUB(CURDATE(), INTERVAL 30 DAY) <= date(happen_time); + AND is_key_area = 1 + AND DATE_SUB(CURDATE(), INTERVAL 30 DAY) <= date(happen_time) GROUP BY hazard_level_code @@ -122,4 +126,71 @@ AND hazard_level_code is not null GROUP BY DATE_FORMAT(happen_time,'%Y-%m-%d') + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/CategoryLevelMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/CategoryLevelMapper.xml index 4670b1f..1d25cbd 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/CategoryLevelMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/CategoryLevelMapper.xml @@ -20,11 +20,11 @@ SELECT * FROM bus_case_category_level WHERE 1=1 - - and code = #{code} + + and code = #{categoryLevelRequest.code} - - and name = #{name} + + and name = #{categoryLevelRequest.name} ORDER by create_time DESC 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 9b66fd8..bfd84b7 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 @@ -98,4 +98,10 @@ #{item} + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceRepairLogMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceRepairLogMapper.xml index 078ed3c..cf1a481 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceRepairLogMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceRepairLogMapper.xml @@ -22,14 +22,14 @@ SELECT * FROM bus_device_repair_log WHERE 1=1 - - and device_code = #{devCode} + + and device_code = #{deviceRepairRequest.devCode} - - and device_name = #{devName} + + and device_name = #{deviceRepairRequest.devName} - - and DATE_FORMAT(create_time,"%y%m%d") = DATE_FORMAT(#{createTime},"%y%m%d") + + and DATE_FORMAT(create_time,"%y%m%d") = DATE_FORMAT(#{deviceRepairRequest.createTime},"%y%m%d") ORDER by create_time DESC diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/HazardLevelMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/HazardLevelMapper.xml index f16f2b9..458322b 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/HazardLevelMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/HazardLevelMapper.xml @@ -20,11 +20,11 @@ SELECT * FROM bus_case_hazard_level WHERE 1=1 - - and code = #{code} + + and code = #{hazardLevelRequest.code} - - and name = #{name} + + and name = #{hazardLevelRequest.name} ORDER by create_time DESC @@ -42,4 +42,10 @@ SELECT name FROM bus_case_hazard_level + + \ 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 557237e..b6a183a 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 @@ -50,4 +50,10 @@ + + + UPDATE bus_staff_info + SET card_no = #{cardNo} + WHERE staff_code = #{staffCode} + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitInfoMapper.xml index 84aa84f..230529a 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitInfoMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitInfoMapper.xml @@ -27,5 +27,6 @@ SELECT * FROM bus_visit_info WHERE order_id = #{orderId} and DATE_FORMAT(in_time,'%Y-%m-%d') = CURRENT_DATE + limit 1 \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/BlackPictureRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/BlackPictureRequest.java new file mode 100644 index 0000000..fc92701 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/BlackPictureRequest.java @@ -0,0 +1,14 @@ +package com.casic.missiles.modular.dto; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/29 19:26 + */ +@Data +public class BlackPictureRequest { + private String picUri; + private String serverIndexCode; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/CancelSubscribeRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/CancelSubscribeRequest.java new file mode 100644 index 0000000..e2d390a --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/CancelSubscribeRequest.java @@ -0,0 +1,15 @@ +package com.casic.missiles.modular.dto.hik; + +import lombok.Data; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/24 15:14 + */ +@Data +public class CancelSubscribeRequest { + private List eventTypes; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/CardInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/CardInfo.java new file mode 100644 index 0000000..341457d --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/CardInfo.java @@ -0,0 +1,24 @@ +package com.casic.missiles.modular.dto.hik; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/26 16:08 + */ +@Data +public class CardInfo { + //卡号,8~20个字符,支持数字和大写字母 + private String cardNo; + //人员ID,员工工号 + private String personId; + //人员所属组织IndexCode + private String orgIndexCode; + //卡片类型,默认是1:IC卡 + //1:IC卡 + //2:CPU卡 + //3:远距离卡 + //4:MIFARE卡 + private Number cardType; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/FaceRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/FaceRequest.java new file mode 100644 index 0000000..edc04bf --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/FaceRequest.java @@ -0,0 +1,16 @@ +package com.casic.missiles.modular.dto.hik; + +import lombok.Data; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/25 16:53 + */ +@Data +public class FaceRequest { + private String certificateNum; + private List indexCodes; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/HikRecvEvent.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/HikRecvEvent.java index a3e9845..1b2b2b1 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/HikRecvEvent.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/HikRecvEvent.java @@ -28,12 +28,12 @@ /** * 事件类型,用于判断所需接收到的事件类型 */ - public Long getEventType(){ + public Number getEventType(){ JSONObject jsonObject = (JSONObject)JSONObject.toJSON(params); //事件类别对应SecurityEventTypeEnum JSONArray eventTypeArray = (JSONArray)jsonObject.get("events"); JSONObject eventJsonObject = (JSONObject)JSONObject.toJSON(eventTypeArray.get(0)); - Long eventType = (Long) eventJsonObject.get("eventType"); + Number eventType = (Number) eventJsonObject.get("eventType"); return eventType; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonBatchDeleteRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonBatchDeleteRequest.java index 027d31d..9751929 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonBatchDeleteRequest.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonBatchDeleteRequest.java @@ -12,4 +12,6 @@ @Data public class PersonBatchDeleteRequest { private List personIds; + //删除人脸接口使用 + private String faceId; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonInfoRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonInfoRequest.java new file mode 100644 index 0000000..05dc9e1 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonInfoRequest.java @@ -0,0 +1,20 @@ +package com.casic.missiles.modular.dto.hik; + +import lombok.Data; + +import java.util.List; + +/** + * @Description: 获取员工照片请求实体 + * @Author: wangpeng + * @Date: 2022/8/25 16:53 + */ +@Data +public class PersonInfoRequest { + //获取员工详细信息使用 + private String paramName; + private List paramValue; + //获取照片使用 + private String picUri; + private String serverIndexCode; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonListRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonListRequest.java new file mode 100644 index 0000000..3f7149b --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonListRequest.java @@ -0,0 +1,16 @@ +package com.casic.missiles.modular.dto.hik; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/25 16:53 + */ +@Data +public class PersonListRequest { + private Number pageNo; + private Number pageSize; + + private String orderId; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/SearchPicturesRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/SearchPicturesRequest.java new file mode 100644 index 0000000..0a95966 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/SearchPicturesRequest.java @@ -0,0 +1,24 @@ +package com.casic.missiles.modular.dto.hik; + +import lombok.Data; + +import java.util.List; + +/** + * @Description: 以图搜图请求 + * @Author: wangpeng + * @Date: 2022/8/29 10:46 + */ +@Data +public class SearchPicturesRequest { + private String facePicBinaryData; + private String facePicUrl; + private List cameraIndexCodes; + private String startTime; + private String endTime; + //指定搜图的最小相似度,最小为1,最大为100 + private String minSimilarity; + private Number age; + //male-男性,female-女性 + private String sex; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/BlackListController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/BlackListController.java index a27f9f8..0c06661 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/BlackListController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/BlackListController.java @@ -1,13 +1,18 @@ package com.casic.missiles.modular.controller; +import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.base.controller.ExportController; import com.casic.missiles.core.page.PageFactory; import com.casic.missiles.model.response.ResponseData; import com.casic.missiles.modular.dto.BlackInfoRequest; +import com.casic.missiles.modular.dto.BlackPictureRequest; +import com.casic.missiles.modular.dto.hik.PersonInfoRequest; +import com.casic.missiles.modular.enums.HikUri; import com.casic.missiles.modular.enums.OperateTypeEnum; import com.casic.missiles.modular.model.BlackInfo; import com.casic.missiles.modular.service.BlackInfoService; +import com.casic.missiles.modular.util.HikUtil; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; @@ -56,4 +61,22 @@ return null; } + /** + * 黑名单人员照片 + */ + @PostMapping("/personPicture") + @ResponseBody + public Object personPicture(@RequestBody BlackPictureRequest blackPictureRequest){ + //获取照片 + String picUri = blackPictureRequest.getPicUri(); + String serverIndexCode = blackPictureRequest.getServerIndexCode(); + PersonInfoRequest picRequest = new PersonInfoRequest(); + picRequest.setPicUri(picUri); + picRequest.setServerIndexCode(serverIndexCode); + String reBody = JSONObject.toJSONString(picRequest); + //重定向地址获取 + String url = HikUtil.hikApiFor302(HikUri.PERSON_PICTURE, reBody); + return ResponseData.success(url); + } + } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/DeviceController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/DeviceController.java index e1c4eba..666bbee 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/DeviceController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/DeviceController.java @@ -107,7 +107,7 @@ } /** - * 设备维修管理查询(分页),需计算MTTR=总维修时间/故障次数 + * 设备状态计算与评判/设备维修管理查询(分页),需计算MTTR=总维修时间/故障次数 */ @PostMapping("/repair/listPage") @ResponseBody @@ -211,7 +211,7 @@ //需根据设备编号获取到对应的门禁点唯一标识 doorControlRequest.setDoorIndexCodes(indexCodes); doorControlRequest.setControlType(Integer.valueOf(gateGroupDTO.getStatus())); - String body = JSONObject.toJSONString(deviceCodes); + String body = JSONObject.toJSONString(doorControlRequest); String resultStr = HikUtil.hikApi(HikUri.DOOR_CONTROL, body); JSONObject resultJson = (JSONObject)JSONObject.parse(resultStr); if (!"0".equals(resultJson.get("code"))) { diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/StaffController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/StaffController.java index b58ccab..704093c 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/StaffController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/StaffController.java @@ -2,15 +2,21 @@ import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.util.StrUtil; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.base.controller.ExportController; import com.casic.missiles.core.page.PageFactory; import com.casic.missiles.model.response.ErrorResponseData; import com.casic.missiles.model.response.ResponseData; import com.casic.missiles.modular.dto.StaffInfoRequest; +import com.casic.missiles.modular.dto.hik.PersonInfoRequest; +import com.casic.missiles.modular.dto.hik.StaffCardRequest; +import com.casic.missiles.modular.enums.HikUri; import com.casic.missiles.modular.enums.OperateTypeEnum; import com.casic.missiles.modular.model.StaffInfo; import com.casic.missiles.modular.service.StaffInfoService; +import com.casic.missiles.modular.util.HikUtil; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; @@ -110,4 +116,60 @@ } return ResponseData.success(); } + + /** + * 批量开卡,添加人员之后调用,若在一个接口中添加人员成功开卡失败则第二次添加时会有问题 + */ + @PostMapping("/cardBinding") + @ResponseBody + public Object cardBinding(@RequestBody StaffCardRequest staffCardRequest) { + String body = JSONObject.toJSONString(staffCardRequest); + String resultStr = HikUtil.hikApi(HikUri.CARD_BINDING, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (!"0".equals(resultJson.get("code"))) { + log.error("请求海康,批量开卡失败,海康response:{}", resultStr); + return ResponseData.error("批量开卡失败"); + } + //保存卡号 + if(staffInfoService.saveCardInfo(staffCardRequest) > 0){ + return ResponseData.success(); + } + return ResponseData.error("批量开卡失败"); + } + + /** + * 获取员工照片,海康存储 + */ + @PostMapping("/personPicture/{staffCode}") + @ResponseBody + public Object personPicture(@PathVariable("staffCode") String staffCode){ + //获取员工详细信息,含图片服务器、uri + PersonInfoRequest request = new PersonInfoRequest(); + List list = new ArrayList<>(); + list.add(staffCode); + request.setParamName("personId"); + request.setParamValue(list); + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi(HikUri.PERSON_INFO, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (!"0".equals(resultJson.get("code"))) { + log.error("请求海康,根据人员唯一字段获取人员详细信息失败,海康response:{}", resultStr); + return ResponseData.error("获取员工照片失败"); + } + //获取照片 + JSONObject data = (JSONObject) resultJson.get("data"); + JSONArray dataArray = (JSONArray) data.get("list"); + JSONObject jsonObject = (JSONObject) dataArray.get(0); + JSONArray personPhoto = (JSONArray) jsonObject.get("personPhoto"); + JSONObject photo = (JSONObject) personPhoto.get(0); + String picUri = photo.getString("picUri"); + String serverIndexCode = photo.getString("serverIndexCode"); + PersonInfoRequest picRequest = new PersonInfoRequest(); + picRequest.setPicUri(picUri); + picRequest.setServerIndexCode(serverIndexCode); + String reBody = JSONObject.toJSONString(picRequest); + //重定向地址获取 + String url = HikUtil.hikApiFor302(HikUri.PERSON_PICTURE, reBody); + return ResponseData.success(url); + } } 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 4a07dd9..7b1dcf6 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 @@ -16,6 +16,7 @@ import com.casic.missiles.modular.redis.key.CacheKeys; import com.casic.missiles.modular.service.CockpitService; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.util.CollectionUtils; import org.springframework.web.bind.annotation.*; @@ -24,10 +25,7 @@ import java.text.NumberFormat; import java.time.LocalDateTime; import java.time.temporal.ChronoUnit; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.util.*; import java.util.stream.Collectors; /** @@ -73,6 +71,9 @@ private StatisticNumberMapper numberMapper; @Autowired + private HazardLevelMapper hazardLevelMapper; + + @Autowired private AccessGroupConfig accessGroupConfig; /** @@ -104,8 +105,24 @@ public Object buildingNumberPerHour(){ //当天按小时分组的人数 List list = numberMapper.selectListByTime(); - Map> collect = list.stream().collect(Collectors.groupingBy(BuildingNumberDTO::getStatisticPosition)); - return ResponseData.success(collect); + Map> collect = list.stream().collect(Collectors.groupingBy(BuildingNumberDTO::getStatisticTime)); + //定时任务中已将每小时三栋楼人数存到数据库 + //将一期主楼和录制楼人数合并,二期单算 + List> resultList = new ArrayList<>(); + collect.keySet().forEach(key -> { + List buildingNumberDTOS = collect.get(key); + BuildingNumberDTO mainBuildingOne = buildingNumberDTOS.get(0); + BuildingNumberDTO mainBuildingTwo = buildingNumberDTOS.get(1); + BuildingNumberDTO recordingBuilding = buildingNumberDTOS.get(2); + HashMap resultMap = new HashMap<>(); + Integer oneQuantity = Integer.valueOf(mainBuildingOne.getStatisticQuantity()); + Integer recordingQuantity = Integer.valueOf(recordingBuilding.getStatisticQuantity()); + resultMap.put("staticTime", mainBuildingOne.getStatisticTime()); + resultMap.put(mainBuildingOne.getStatisticPositionName()+"、"+recordingBuilding.getStatisticPositionName(), String.valueOf(oneQuantity+recordingQuantity)); + resultMap.put(mainBuildingTwo.getStatisticPositionName(), mainBuildingTwo.getStatisticQuantity()); + resultList.add(resultMap); + }); + return ResponseData.success(resultList); } /** @@ -151,12 +168,11 @@ public Object securityNumber() { QueryWrapper wrapper = new QueryWrapper<>(); wrapper.eq("staff_type", 2); + // TODO: 2022/9/2 后续使用产品确定的每天出勤的安保人员的数量 Integer total = staffInfoMapper.selectCount(wrapper); - //当日离岗事件个数 - QueryWrapper wrapper1 = new QueryWrapper<>(); - wrapper1.eq("hik_event_type", SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); - wrapper1.apply("date_format(now(),'%Y-%m-%d') = date_format(happen_time,'%Y-%m-%d')"); - Integer leave = caseInfoMapper.selectCount(wrapper1); + //当日离岗事件按设备去重后的个数 + // TODO: 2022/9/2 目前相当于24小时内的计算,之后看需要可改成自定义小时数计算离岗率,即离岗+6小时内仅一次离岗则恢复为100%,多次则累加离岗次数计算离岗率 + Integer leave = caseInfoMapper.selectDemobilizedCount(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); NumberFormat numberFormat = NumberFormat.getInstance(); // 设置精确到小数点后2位 numberFormat.setMaximumFractionDigits(2); @@ -179,7 +195,6 @@ @ResponseBody public Object visitorApplyDetail() { List reasonGroup = applyMapper.selectByVisitReason(); - HashMap resultMap = new HashMap<>(); NumberFormat numberFormat = NumberFormat.getInstance(); // 设置精确到小数点后2位 numberFormat.setMaximumFractionDigits(2); @@ -187,12 +202,17 @@ if(0 == sum){ return ResponseData.success(); } + List resultList = new ArrayList<>(); reasonGroup.forEach(group -> { String reasonName = dictService.getDictNameByCode(SecurityEventDict.VISIT_REASON, group.getVisitReason()); String result = numberFormat.format((float) group.getQuantity() / (float) sum * 100); - resultMap.put(reasonName, result+"%"); + ApplyReasonGroupDTO applyReasonGroupDTO = new ApplyReasonGroupDTO(); + applyReasonGroupDTO.setQuantity(group.getQuantity()); + applyReasonGroupDTO.setVisitReason(reasonName); + applyReasonGroupDTO.setRatio(result+"%"); + resultList.add(applyReasonGroupDTO); }); - return ResponseData.success(resultMap); + return ResponseData.success(resultList); } /** @@ -247,6 +267,32 @@ } /** + * 机动力量实时在岗率,在岗人数除以总应在岗人数,用离岗+6小时内恢复为100%,6小时外再计算 + */ + @GetMapping("/staff/beOnDutyRatio") + @ResponseBody + public Object beOnDutyRatio() { + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("staff_type", 2); + // TODO: 2022/9/2 后续使用产品确定的每天出勤的安保人员的数量 + Integer total = staffInfoMapper.selectCount(wrapper); + if(0 == total){ + return ResponseData.success(null); + } + //当日离岗事件按设备去重后的个数 + // TODO: 2022/9/2 目前相当于24小时内的计算,之后看需要可改成自定义小时数计算离岗率,即离岗+6小时内仅一次离岗则恢复为100%,多次则累加离岗次数计算离岗率 + List onDutyRatioDTOS = caseInfoMapper.selectDemobilizedCountByHour(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); + onDutyRatioDTOS.forEach(dto -> { + NumberFormat numberFormat = NumberFormat.getInstance(); + // 设置精确到小数点后2位 + numberFormat.setMaximumFractionDigits(2); + String result = numberFormat.format(100 - Float.valueOf(dto.getQuantity()) / (float) total * 100); + dto.setRatio(result+"%"); + }); + return ResponseData.success(onDutyRatioDTOS); + } + + /** * 闸机速通门统计-设备状态分组计算数量,devType传闸机字典key * 视频频监控摄像机统计-设备状态分组计算数量,devType传摄像头字典key */ @@ -262,12 +308,17 @@ if(sum <= 0){ return ResponseData.error("无该类设备信息"); } + List resultList = new ArrayList<>(); gateStatusGroup.forEach(group -> { String devStatus = dictService.getDictNameByCode(SecurityEventDict.DEVICE_STATUS, group.getStatus()); String result = numberFormat.format((float) group.getQuantity() / (float) sum * 100); - resultMap.put(devStatus, result+"%"); + GateStatusGroupResponse gateStatusGroupResponse = new GateStatusGroupResponse(); + gateStatusGroupResponse.setStatus(devStatus); + gateStatusGroupResponse.setRatio(result+"%"); + resultList.add(gateStatusGroupResponse); }); - resultMap.put("总", sum); + resultMap.put("total", sum); + resultMap.put("list", resultList); return ResponseData.success(resultMap); } @@ -282,17 +333,38 @@ String position = securityScoreDTO.getPosition(); List caseInfos = caseInfoMapper.selectByPosition(position); //查询各危险级别权重、各类别权重,放入map,避免循环中多次查数据库 - + HashMap hazardScoreMap = new HashMap<>(); + List caseHazardLevelList = hazardLevelMapper.getCaseHazardLevelList(null); + caseHazardLevelList.forEach(hazardLevel -> { + hazardScoreMap.put(hazardLevel.getCode(), hazardLevel.getWeight()); + }); + HashMap categoryScoreMap = new HashMap<>(); + List categoryLevelList = categoryLevelMapper.getCaseCategoryLevelList(null); + categoryLevelList.forEach(categoryLevel -> { + categoryScoreMap.put(categoryLevel.getCode(), categoryLevel.getWeight()); + }); + //事件按楼层分组,计算 List securityScoreDTOs = new ArrayList<>(); caseInfos.forEach(caseInfo -> { SecurityScoreDTO securityScoreDTO1 = new SecurityScoreDTO(); + securityScoreDTO1.setPosition(caseInfo.getPosition()); securityScoreDTO1.setArea(caseInfo.getArea()); - // TODO: 2022/8/4 楼层评分计算根据产品定义调整 -// caseInfo.get -// securityScoreDTO1.setScore(); + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); + Double score = 100 - Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + securityScoreDTO1.setScore(score); + securityScoreDTOs.add(securityScoreDTO1); }); - - return null; + 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); + }); + return ResponseData.success(securityScoreDTOs); } /** @@ -303,9 +375,13 @@ public Object SecurityFrequency(@RequestBody SecurityFrequencyDTO securityFrequencyDTO) { String year = securityFrequencyDTO.getYear(); String month = securityFrequencyDTO.getMonth(); - Integer quantity = caseInfoMapper.selectCountByMonth(year, month); - securityFrequencyDTO.setQuantity(quantity); - return ResponseData.success(securityFrequencyDTO); + if(!StringUtils.isEmpty(year) && StringUtils.isEmpty(month)){ + Integer quantity = caseInfoMapper.selectCountByMonth(year, month); + securityFrequencyDTO.setQuantity(quantity); + return ResponseData.success(securityFrequencyDTO); + } + List list = caseInfoMapper.selectPreMonthCount(); + return ResponseData.success(list); } } 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 ae4d770..f4f075c 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 @@ -1,20 +1,25 @@ package com.casic.missiles.modular.controller.cockpit; +import cn.hutool.core.date.DateUnit; import cn.hutool.core.date.DateUtil; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.casic.missiles.model.response.ResponseData; -import com.casic.missiles.modular.dao.AttendanceInfoMapper; -import com.casic.missiles.modular.dao.CaseInfoMapper; -import com.casic.missiles.modular.dao.HazardLevelMapper; -import com.casic.missiles.modular.dao.StaffInfoMapper; +import com.casic.missiles.modular.dao.*; +import com.casic.missiles.modular.dto.DeviceRepairLogDTO; +import com.casic.missiles.modular.dto.DeviceRepairRequest; import com.casic.missiles.modular.dto.statistics.*; +import com.casic.missiles.modular.enums.SecurityEventType; +import com.casic.missiles.modular.model.CaseCategoryLevel; import com.casic.missiles.modular.model.CaseHazardLevel; +import com.casic.missiles.modular.model.CaseInfo; import com.casic.missiles.modular.model.StaffInfo; +import com.casic.missiles.modular.service.DeviceInfoService; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.util.CollectionUtils; import org.springframework.web.bind.annotation.*; +import java.math.BigDecimal; import java.text.NumberFormat; import java.util.*; import java.util.stream.Collectors; @@ -40,6 +45,12 @@ @Autowired private HazardLevelMapper hazardLevelMapper; + @Autowired + private CategoryLevelMapper categoryLevelMapper; + + @Autowired + private DeviceInfoService deviceInfoService; + /** * 安防事件时域频次统计,每月的每天安防事件个数(原方案) * 月维度:展示每个月的每天的数据 @@ -89,15 +100,17 @@ List monthList = caseInfoMapper.selectPreMonthCountByYear(year); Map> collect = monthList.stream().collect(Collectors.groupingBy(PreMonthOrWeekCaseDTO::getHazardLevelCode)); HashMap strAvgMap = new HashMap<>(); + List resultList = new ArrayList<>(); for (String key : collect.keySet()) { List preMonthOrWeekCaseDTOS = collect.get(key); int sum = preMonthOrWeekCaseDTOS.stream().mapToInt(PreMonthOrWeekCaseDTO::getQuantity).sum(); //若年份是本年,则使用个安防级别数量/当前月份数 //若不是本年,除数为12 MonthAndWeekDTO monthAndWeekDTO = new MonthAndWeekDTO(); + String hazardName = hazardLevelMapper.selectHazardNameByCode(key); + monthAndWeekDTO.setLevelName(hazardName); if(year.equals(String.valueOf(DateUtil.thisYear()))){ monthAndWeekDTO.setMonthQuantity(sum / DateUtil.thisMonth()); -// monthAndWeekDTO.setLevelName(); strAvgMap.put(key, monthAndWeekDTO); }else{ monthAndWeekDTO.setMonthQuantity(sum / 12); @@ -113,27 +126,37 @@ if(year.equals(String.valueOf(DateUtil.thisYear()))){ if(!Objects.isNull(strAvgMap.get(key))){ MonthAndWeekDTO monthAndWeekDTO = strAvgMap.get(key); + String hazardName = hazardLevelMapper.selectHazardNameByCode(key); + monthAndWeekDTO.setLevelName(hazardName); monthAndWeekDTO.setWeekQuantity(sum / DateUtil.thisWeekOfYear()); strAvgMap.put(key, monthAndWeekDTO); }else{ MonthAndWeekDTO monthAndWeekDTO = new MonthAndWeekDTO(); + String hazardName = hazardLevelMapper.selectHazardNameByCode(key); + monthAndWeekDTO.setLevelName(hazardName); monthAndWeekDTO.setWeekQuantity(sum / DateUtil.thisWeekOfYear()); strAvgMap.put(key, monthAndWeekDTO); } }else{ if(!Objects.isNull(strAvgMap.get(key))){ MonthAndWeekDTO monthAndWeekDTO = strAvgMap.get(key); + String hazardName = hazardLevelMapper.selectHazardNameByCode(key); + monthAndWeekDTO.setLevelName(hazardName); monthAndWeekDTO.setWeekQuantity(sum / 52); strAvgMap.put(key, monthAndWeekDTO); }else{ MonthAndWeekDTO monthAndWeekDTO = new MonthAndWeekDTO(); + String hazardName = hazardLevelMapper.selectHazardNameByCode(key); + monthAndWeekDTO.setLevelName(hazardName); monthAndWeekDTO.setWeekQuantity(sum / 52); strAvgMap.put(key, monthAndWeekDTO); } } } - avgMonthAndWeekGroupDTO.setMap(strAvgMap); - return ResponseData.success(avgMonthAndWeekGroupDTO); + strAvgMap.keySet().forEach(key -> { + resultList.add(strAvgMap.get(key)); + }); + return ResponseData.success(resultList); } /** @@ -181,12 +204,178 @@ } /** - * 员工考勤人数变化,功能待定 + * 员工考勤人数变化,统计当天(横坐标为时)及近7天(横坐标为天)的考勤人数变化,只要发生一次考勤识别,次数的基数就正常增加(没有上班下班区分) */ + @PostMapping("/staff/attendanceNumber/{dimension}") + @ResponseBody + public Object attendanceNumber(@PathVariable("dimension") String dimension) { + List attendanceNumberDTOs = null; + List> resultList = new ArrayList<>(); + if("week".equals(dimension)){ + //近7天数据按天分组统计 + attendanceNumberDTOs = attendanceInfoMapper.getCountForWeek(); + }else if("day".equals(dimension)) { + //今天数据按小时分组统计 + attendanceNumberDTOs = attendanceInfoMapper.getCountForDay(); + } + if(CollectionUtils.isEmpty(attendanceNumberDTOs)){ + return ResponseData.error("该查询条件下,无员工出勤数据!"); + } + Map> collect = attendanceNumberDTOs.stream().collect(Collectors.groupingBy(AttendanceNumberDTO::getDate)); + collect.keySet().forEach(key -> { + List attendanceNumberDTOS = collect.get(key); + AttendanceNumberDTO attendanceNumberDTO = attendanceNumberDTOS.get(0); + AttendanceNumberDTO attendanceNumberDTO2 = attendanceNumberDTOS.get(1); + Map resultMap = new HashMap<>(); + resultMap.put(attendanceNumberDTO.getStaffType(), attendanceNumberDTO.getQuantity()); + resultMap.put(attendanceNumberDTO2.getStaffType(), attendanceNumberDTO2.getQuantity()); + resultMap.put("staticTime", attendanceNumberDTO.getDate()); + resultList.add(resultMap); + }); + return ResponseData.success(resultList); + } /** - * 近30天/近一周安保人员到岗排行 + * 早晚高峰区域安防评估 */ + @PostMapping("/security/assessment/{dimension}") + @ResponseBody + public Object securityAssessment(@PathVariable("dimension") String dimension) { + //查询各危险级别权重、各类别权重,放入map,避免循环中多次查数据库 + HashMap hazardScoreMap = new HashMap<>(); + List caseHazardLevelList = hazardLevelMapper.getCaseHazardLevelList(null); + caseHazardLevelList.forEach(hazardLevel -> { + hazardScoreMap.put(hazardLevel.getCode(), hazardLevel.getWeight()); + }); + HashMap categoryScoreMap = new HashMap<>(); + List categoryLevelList = categoryLevelMapper.getCaseCategoryLevelList(null); + categoryLevelList.forEach(categoryLevel -> { + categoryScoreMap.put(categoryLevel.getCode(), categoryLevel.getWeight()); + }); + HashMap hashMap = new HashMap<>(); + if("week".equals(dimension)){ + //近7天早晚高峰数据 + List caseInfos = caseInfoMapper.selectListBySevenDay(); + //按时间(天)进行分组 + caseInfos.forEach(caseInfo -> { + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); + Double score = Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + String[] array = caseInfo.getHappenTime().split(" "); + String dayTime = array[0]; + BigDecimal preScore; + if(hashMap.containsKey(dayTime)){ + Double aDouble = hashMap.get(dayTime); + preScore = new BigDecimal(aDouble.toString()); + + }else{ + preScore = new BigDecimal("100.0"); + } + BigDecimal nowScore = new BigDecimal(score.toString()); + hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); + }); + return ResponseData.success(hashMap); + }else if("day".equals(dimension)) { + //今天数据按小时分组统计 + List caseInfos = caseInfoMapper.selectListByToday(); + caseInfos.forEach(caseInfo -> { + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); + Double score = Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + String[] array = caseInfo.getHappenTime().split(":"); + String dayTime = array[0]; + BigDecimal preScore; + if(hashMap.containsKey(dayTime)){ + Double aDouble = hashMap.get(dayTime); + preScore = new BigDecimal(aDouble.toString()); + + }else{ + preScore = new BigDecimal("100.0"); + } + BigDecimal nowScore = new BigDecimal(score.toString()); + hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); + }); + return ResponseData.success(hashMap); + } + return null; + } + + /** + * 重点区域安防事态评估,统计重点区域6:00-23:00按小时分组数据 + */ + @GetMapping("/security/keyAreaStatistic") + @ResponseBody + public Object keyAreaStatistic() { + //查询各危险级别权重、各类别权重,放入map,避免循环中多次查数据库 + HashMap hazardScoreMap = new HashMap<>(); + List caseHazardLevelList = hazardLevelMapper.getCaseHazardLevelList(null); + caseHazardLevelList.forEach(hazardLevel -> { + hazardScoreMap.put(hazardLevel.getCode(), hazardLevel.getWeight()); + }); + HashMap categoryScoreMap = new HashMap<>(); + List categoryLevelList = categoryLevelMapper.getCaseCategoryLevelList(null); + categoryLevelList.forEach(categoryLevel -> { + categoryScoreMap.put(categoryLevel.getCode(), categoryLevel.getWeight()); + }); + HashMap hashMap = new HashMap<>(); + //今天数据按小时分组统计 + List caseInfos = caseInfoMapper.selectListByToday2(); + caseInfos.forEach(caseInfo -> { + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); + Double score = Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + String[] array = caseInfo.getHappenTime().split(":"); + String dayTime = array[0]; + BigDecimal preScore; + if(hashMap.containsKey(dayTime)){ + Double aDouble = hashMap.get(dayTime); + preScore = new BigDecimal(aDouble.toString()); + + }else{ + preScore = new BigDecimal("100.0"); + } + BigDecimal nowScore = new BigDecimal(score.toString()); + hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); + }); + return ResponseData.success(hashMap); + } + + /** + * 安防机动支援力量调配响应评估,根据事件已解决状态及已解决时间-发送时间,按时间(小时)分组统计 + */ + @GetMapping("/security/responseAssess") + @ResponseBody + public Object responseAssess() { + //查询各危险级别权重、各类别权重,放入map,避免循环中多次查数据库 + HashMap hazardScoreMap = new HashMap<>(); + List caseHazardLevelList = hazardLevelMapper.getCaseHazardLevelList(null); + caseHazardLevelList.forEach(hazardLevel -> { + hazardScoreMap.put(hazardLevel.getCode(), hazardLevel.getWeight()); + }); + HashMap hashMap = new HashMap<>(); + //今天数据按小时分组统计 + List caseInfos = caseInfoMapper.selectListByToday3(); + caseInfos.forEach(caseInfo -> { + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + //扣分=事件级别权重*未解决小时数 + Date updateTime = DateUtil.parse(caseInfo.getUpdateTime()); + Date happenTime = DateUtil.parse(caseInfo.getHappenTime()); + long between = DateUtil.between(updateTime, happenTime, DateUnit.HOUR); + Double score = Double.valueOf(hazardWeight)*between; + String[] array = caseInfo.getHappenTime().split(":"); + String dayTime = array[0]; + BigDecimal preScore; + if(hashMap.containsKey(dayTime)){ + Double aDouble = hashMap.get(dayTime); + preScore = new BigDecimal(aDouble.toString()); + }else{ + preScore = new BigDecimal("100.0"); + } + BigDecimal nowScore = new BigDecimal(score.toString()); + hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); + }); + return ResponseData.success(hashMap); + } /** * 重点区域威胁事件类型统计,优先级2,统计近7天和近30天 @@ -224,7 +413,34 @@ } /** - * 设备状态计算系数和评判,优先级3,需确认设备恢复时间是否可以获取 + * 近30天/近一周安保人员到岗排行 */ + + /** + * 安保等级评估,发生离岗事件减1分 + */ + @GetMapping("/security/levelAssess") + @ResponseBody + public Object securityLevelAssess() { + //今天数据按小时分组统计 + List resultList = caseInfoMapper.selectListByType(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); + resultList.forEach(result -> { + BigDecimal deScore = new BigDecimal(result.getQuantity()); + BigDecimal preScore = new BigDecimal("100.0"); + result.setScore(preScore.subtract(deScore).doubleValue()); + }); + return ResponseData.success(resultList); + } + + /** + * 设备状态计算系数和评判,即设备维修管理查询(不分页) + */ + @PostMapping("/device/repairList") + @ResponseBody + public Object repairList(@RequestBody DeviceRepairRequest deviceRepairRequest) { + List deviceRepairLogDTOS = deviceInfoService.deviceRepairListPage(deviceRepairRequest); + return ResponseData.success(deviceRepairLogDTOS); + } + } 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 fbf8ab6..c71a15a 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 @@ -1,13 +1,12 @@ package com.casic.missiles.modular.controller.hik; +import cn.hutool.core.date.DateTime; +import cn.hutool.core.date.DateUtil; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.casic.missiles.model.response.ResponseData; import com.casic.missiles.modular.dao.HikFaceGroupInfoMapper; -import com.casic.missiles.modular.dto.hik.EventSubscribeRequest; -import com.casic.missiles.modular.dto.hik.FaceGroupAdditionRequest; -import com.casic.missiles.modular.dto.hik.HikRecvEvent; -import com.casic.missiles.modular.dto.hik.OrgBatchAdd; +import com.casic.missiles.modular.dto.hik.*; import com.casic.missiles.modular.enums.HikUri; import com.casic.missiles.modular.enums.SecurityEventType; import com.casic.missiles.modular.model.CaseInfo; @@ -18,16 +17,20 @@ import com.casic.missiles.modular.util.CaseInfoFactoryUtil; import com.casic.missiles.modular.util.HikUtil; import com.casic.missiles.modular.util.ThreadPoolUtil; +import com.casic.missiles.modular.util.WebSocket; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; -import org.springframework.web.bind.annotation.*; +import org.springframework.util.CollectionUtils; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.RestController; -import java.net.InetAddress; -import java.net.UnknownHostException; import java.util.ArrayList; +import java.util.Iterator; import java.util.List; import java.util.Objects; @@ -38,7 +41,6 @@ */ @Slf4j @RestController -@RequestMapping("/hik") public class HikController { @Autowired @@ -53,28 +55,37 @@ @Autowired private HikService hikService; + @Autowired + private HikFaceGroupInfoMapper hikFaceGroupInfoMapper; + + @Autowired + private WebSocket webSocket; + @Value("${server.port}") private int serverPort; - @Autowired - private HikFaceGroupInfoMapper hikFaceGroupInfoMapper; /** * 海康事件订阅 */ - @PostMapping("/event/subscribe") + @PostMapping("/hik/event/subscribe") @ResponseBody - public Object eventSubscribe() throws UnknownHostException { + public Object eventSubscribe() { EventSubscribeRequest eventSubscribeRequest = new EventSubscribeRequest(); ArrayList list = new ArrayList<>(); list.add(SecurityEventType.DEVICE_OFFLINE); + list.add(SecurityEventType.DEVICE_ONLINE); list.add(SecurityEventType.KEY_PERSONNEL_IDENTIFY_EVENT); list.add(SecurityEventType.MONITORING_POINT_OFFLINE); + list.add(SecurityEventType.MONITORING_POINT_ONLINE); list.add(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); list.add(SecurityEventType.PERSONNEL_GATHER_EVENT); - InetAddress localHost = InetAddress.getLocalHost(); + list.add(SecurityEventType.VISITOR_REGISTER); + list.add(SecurityEventType.VISITOR_CHECKOUT); + list.add(SecurityEventType.HIGH_ALTITUDE_PARABOLIC); +// InetAddress localHost = InetAddress.getLocalHost(); eventSubscribeRequest.setEventTypes(list); - eventSubscribeRequest.setEventDest("https://" + localHost + ":" + serverPort + "/eventRcv"); + eventSubscribeRequest.setEventDest("http://" + "192.168.10.6" + ":" + serverPort + "/eventRcv"); //订阅类型,0-订阅原始事件,1-联动事件,2-原始事件和联动事件,不填使用默认值0 eventSubscribeRequest.setSubType(0); /** @@ -92,19 +103,25 @@ } /** + * 查询事件订阅信息 + */ + @PostMapping("/hik/event/query") + @ResponseBody + public Object eventQuery() { + String result = HikUtil.hikApi(HikUri.EVENT_INFO, ""); + return result; + } + + /** * 海康事件接收 */ @PostMapping("/eventRcv") @ResponseBody public Object eventRcv(@RequestBody HikRecvEvent hikRecvEvent) { //1、接收所需事件类型 - Long eventType = hikRecvEvent.getEventType(); + Number eventType = hikRecvEvent.getEventType(); log.info("接收到安防事件类型为:{}", eventType); CaseInfo caseInfo = caseInfoFactoryUtil.getCaseInfo(eventType); - //接收到不关心事件直接返回 - if(Objects.isNull(caseInfo)){ - return ResponseData.success(); - } //2、不同事件不同处理,caseInfoFactoryUtil已设置好事件基础定义信息 // 再为事件添加状态、设备编码、设备名称、位置、区域、时间 // 异步处理事件 @@ -114,19 +131,23 @@ caseHandle(hikRecvEvent, eventType, caseInfo); } })); +// caseHandle(hikRecvEvent, eventType, caseInfo); - return null; + return ResponseData.success(); } - private void caseHandle(HikRecvEvent hikRecvEvent, Long eventType, CaseInfo caseInfo) { + private void caseHandle(HikRecvEvent hikRecvEvent, Number eventType, CaseInfo caseInfo) { JSONArray eventArray = hikRecvEvent.getEventArray(); List caseInfos = new ArrayList<>(); - while (eventArray.stream().iterator().hasNext()) { + Iterator iterator = eventArray.iterator(); + while (iterator.hasNext()) { CaseInfo caseInfo1 = new CaseInfo(); - BeanUtils.copyProperties(caseInfo, caseInfo1); - JSONObject event = (JSONObject) eventArray.stream().iterator().next(); + if(!Objects.isNull(caseInfo)){ + BeanUtils.copyProperties(caseInfo, caseInfo1); + } + JSONObject event = (JSONObject) iterator.next(); //5种事件进行不同处理 - if(SecurityEventType.KEY_PERSONNEL_IDENTIFY_EVENT == eventType){ + if (SecurityEventType.KEY_PERSONNEL_IDENTIFY_EVENT.equals(eventType)) { //判断所属人脸分组 JSONObject data = (JSONObject) event.get("data"); JSONObject faceRecognitionResult = (JSONObject) data.get("faceRecognitionResult"); @@ -142,52 +163,101 @@ if (faceGroupCode.equals(blackListGroup.getFaceGroupCode())) { //黑名单分组处理 caseInfo1 = hikService.blackListHandle(event, caseInfo1); - }else if(faceGroupCode.equals(propertyPersonnelGroup.getFaceGroupCode())){ + } else if (faceGroupCode.equals(propertyPersonnelGroup.getFaceGroupCode())) { //考勤分组处理-物业人员,添加到考勤表 hikService.propertyAttendanceHandle(event); - }else if(faceGroupCode.equals(securityPersonnelGroup.getFaceGroupCode())){ + } else if (faceGroupCode.equals(securityPersonnelGroup.getFaceGroupCode())) { //考勤分组处理-安保人员,添加到考勤表 hikService.securityPersonnelHandle(event); - }else { + } else { return; } - }else if(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT == eventType){ + } else if (SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT.equals(eventType)) { //离岗事件处理 caseInfo1 = hikService.demobilizedHandle(event, caseInfo1); - }else if(SecurityEventType.PERSONNEL_GATHER_EVENT == eventType){ + } else if (SecurityEventType.PERSONNEL_GATHER_EVENT.equals(eventType)) { //人员聚集事件处理 caseInfo1 = hikService.personGatherHandle(event, caseInfo1); - }else if(SecurityEventType.MONITORING_POINT_OFFLINE == eventType){ + } else if (SecurityEventType.MONITORING_POINT_OFFLINE.equals(eventType)) { //监控点离线事件处理 caseInfo1 = hikService.monitorPointOfflineHandle(event, caseInfo1); - }else if(SecurityEventType.DEVICE_OFFLINE == eventType){ + } else if (SecurityEventType.MONITORING_POINT_ONLINE.equals(eventType)) { + //监控点上线事件处理 + hikService.monitorPointOnlineHandle(event); + } else if (SecurityEventType.DEVICE_OFFLINE.equals(eventType)) { //装置离线事件处理 caseInfo1 = hikService.deviceOfflineHandle(event, caseInfo1); - }else if(SecurityEventType.VISITOR_REGISTER == eventType){ + } else if (SecurityEventType.DEVICE_ONLINE.equals(eventType)) { + //装置上线处理 + hikService.deviceOnlineHandle(event); + } else if (SecurityEventType.VISITOR_REGISTER.equals(eventType)) { //记录访客登记记录,添加到访客记录表 hikService.visitorRegisterHandler(event); - }else if(SecurityEventType.VISITOR_CHECKOUT == eventType){ + } else if (SecurityEventType.VISITOR_CHECKOUT.equals(eventType)) { //记录访客签离记录 hikService.visitorCheckOutHandler(event); } - if(!Objects.isNull(caseInfo1) && !StringUtils.isEmpty(caseInfo1.getHappenTime())){ + if (!Objects.isNull(caseInfo1) && !StringUtils.isEmpty(caseInfo1.getHappenTime())) { caseInfos.add(caseInfo1); } } //3、安防事件入库 - if(!caseInfoService.insertCaseInfoBatch(caseInfos)){ - log.error("安防事件批量入库异常"); + if (!CollectionUtils.isEmpty(caseInfos) && !caseInfoService.insertCaseInfoBatch(caseInfos)) { + log.error("安防事件批量入库异常!"); } // TODO: 2022/8/15 webSocket推送 + if (CollectionUtils.isEmpty(caseInfos)) { + log.info("webSocket事件推送"); + webSocket.sendAllMessage(JSONObject.toJSONString(caseInfos)); + } return; } /** + * 以图搜图,前端用于轨迹追踪 + */ + @PostMapping("/hik/search/picture") + @ResponseBody + public Object searchPictures(@RequestBody SearchPicturesRequest searchPicturesRequest) { + DateTime startDateTime = DateUtil.parse(searchPicturesRequest.getStartTime()); + DateTime endDateTime = DateUtil.parse(searchPicturesRequest.getEndTime()); + String startTime = DateUtil.format(startDateTime, "yyyy-MM-dd'T'HH:mm:ss.SSSXXX"); + String endTime = DateUtil.format(endDateTime, "yyyy-MM-dd'T'HH:mm:ss.SSSXXX"); + searchPicturesRequest.setStartTime(startTime); + searchPicturesRequest.setEndTime(endTime); + String body = JSONObject.toJSONString(searchPicturesRequest); + String resultStr = HikUtil.hikApi(HikUri.SEARCH_PICTURES, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (!"0".equals(resultJson.get("code"))) { + log.error("请求海康,以图搜图失败,海康response:{}", resultStr); + return ResponseData.error("以图搜图失败"); + } + return ResponseData.success(resultJson); + } + + + /** + * 海康事件取消订阅 + */ + @PostMapping("/hik/event/cancel") + @ResponseBody + public Object eventCancelSubscribe(@RequestBody CancelSubscribeRequest cancelSubscribeRequest) { + String body = JSONObject.toJSONString(cancelSubscribeRequest); + String resultStr = HikUtil.hikApi(HikUri.EVENT_CANCEL, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (!"0".equals(resultJson.get("code"))) { + log.error("请求海康,取消订阅失败,海康response:{}", resultStr); + return ResponseData.error("取消订阅失败"); + } + return ResponseData.success(resultJson); + } + + /** * 单个添加海康人脸分组 * api->hik单个添加人脸分组api->response->mysql */ - @PostMapping("/faceGroup/single/add") + @PostMapping("/hik/faceGroup/single/add") @ResponseBody public Object faceGroupAddition(@RequestBody FaceGroupAdditionRequest faceGroupAdditionRequest) { String body = JSONObject.toJSONString(faceGroupAdditionRequest); @@ -212,7 +282,7 @@ * 批量添加海康组织 * api->hik批量添加组织api->response */ - @PostMapping("/org/batch/add") + @PostMapping("/hik/org/batch/add") @ResponseBody public Object orgBatchAdd(@RequestBody List orgBatchAddRequest) { String body = JSONObject.toJSONString(orgBatchAddRequest); @@ -232,4 +302,62 @@ return ResponseData.error("批量添加组织失败"); } + /** + * 获取人员列表 + */ + @PostMapping("/hik/person/personList") + @ResponseBody + public Object personList() { + PersonListRequest request = new PersonListRequest(); + request.setPageNo(1); + request.setPageSize(100); + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi("/api/resource/v2/person/personList", body); + return resultStr; + } + + /** + * 获取组织列表 + */ + @PostMapping("/hik/org/orgList") + @ResponseBody + public Object orgList() { + PersonListRequest request = new PersonListRequest(); + request.setPageNo(1); + request.setPageSize(100); + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi("/api/resource/v1/org/orgList", body); + return resultStr; + } + + /** + * 查询访客权限下载记录 + */ + @PostMapping("/hik/auth/result") + @ResponseBody + public Object authResult() { + PersonListRequest request = new PersonListRequest(); + request.setPageNo(1); + request.setPageSize(100); + request.setOrderId("ba101db6246711edaea66f7939a13638"); + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi("/api/visitor/v1/auth/result", body); + return resultStr; + } + + /** + * 人脸图片获取 + */ + @PostMapping("/hik/face/picture") + @ResponseBody + public Object facePicture() { + FaceRequest request = new FaceRequest(); +// List list = new ArrayList<>(); +// list.add(""); + request.setCertificateNum("wanggong"); + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi("/api/frs/v1/face", body); + return resultStr; + } + } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/AssetInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/AssetInfoMapper.java index 4f64e83..c0684ee 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/AssetInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/AssetInfoMapper.java @@ -17,6 +17,6 @@ @Mapper public interface AssetInfoMapper extends BaseMapper { - List getAssetInfoListPage(@Param("page") Page page, AssetInfoRequest assetInfoRequest); + List getAssetInfoListPage(@Param("page") Page page, @Param("assetInfoRequest") AssetInfoRequest assetInfoRequest); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/AttendanceInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/AttendanceInfoMapper.java index f9e793e..ec87e46 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/AttendanceInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/AttendanceInfoMapper.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.statistics.AttendanceNumberDTO; import com.casic.missiles.modular.dto.statistics.AttendanceRatioDTO; import com.casic.missiles.modular.model.AttendanceInfo; import org.apache.ibatis.annotations.Mapper; @@ -17,7 +18,7 @@ */ @Mapper public interface AttendanceInfoMapper extends BaseMapper { - List getAttendanceInfoListPage(@Param("page") Page page, StaffInfoRequest attendanceInfoRequest); + List getAttendanceInfoListPage(@Param("page") Page page, @Param("attendanceInfoRequest") StaffInfoRequest attendanceInfoRequest); AttendanceInfo selectByCodeAndDate(@Param("staffCode") String staffCode); @@ -26,4 +27,8 @@ List getCountByTypeAndDateForMonth(@Param("staffType")String staffType); List getCountByTypeAndDateForYear(@Param("staffType")String staffType); + + List getCountForWeek(); + + List getCountForDay(); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java index ce94b8f..6137a7d 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java @@ -17,5 +17,5 @@ @Mapper public interface BlackInfoMapper extends BaseMapper { - List getBlackInfoListPage(@Param("page") Page page, BlackInfoRequest blackInfoRequest); + List getBlackInfoListPage(@Param("page") Page page, @Param("blackInfoRequest") BlackInfoRequest blackInfoRequest); } 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 efda6b3..50aaa6f 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 @@ -20,7 +20,7 @@ List getCaseInfoListPage(@Param("page") Page page, @Param("caseInfoRequest") CaseInfoRequest caseInfoRequest); - int updateStatusById(CaseInfoRequest caseInfoRequest); + int updateStatusById(@Param("caseInfoRequest") CaseInfoRequest caseInfoRequest); List selectByLevelAndMonth(@Param("year") String year); @@ -47,4 +47,20 @@ List selectPreWeekCountByThirtyDay(); List selectPreDayCountBySevenDay(); + + Integer selectDemobilizedCount(@Param("eventType") Number personnelDemobilizedEvent); + + List selectPreMonthCount(); + + List selectListBySevenDay(); + + List selectListByToday(); + + List selectListByToday2(); + + List selectListByToday3(); + + List selectListByType(@Param("eventType") Number eventType); + + List selectDemobilizedCountByHour(@Param("eventType") Number eventType); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/CategoryLevelMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/CategoryLevelMapper.java index 52fc714..afe1650 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/CategoryLevelMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/CategoryLevelMapper.java @@ -17,9 +17,9 @@ @Mapper public interface CategoryLevelMapper extends BaseMapper { - List getCaseCategoryLevelListPage(@Param("page") Page page, CategoryLevelRequest categoryLevelRequest); + List getCaseCategoryLevelListPage(@Param("page") Page page, @Param("categoryLevelRequest") CategoryLevelRequest categoryLevelRequest); - List getCaseCategoryLevelList(CategoryLevelRequest categoryLevelRequest); + List getCaseCategoryLevelList(@Param("categoryLevelRequest") CategoryLevelRequest categoryLevelRequest); CaseCategoryLevel getCaseCategoryLevel(@Param("categoryLevelCode") String categoryLevelCode); 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 66353b1..2555a09 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 @@ -19,7 +19,7 @@ @Mapper public interface DeviceInfoMapper extends BaseMapper { - List getDeviceInfoListPage(@Param("page") Page page, DeviceInfoRequest deviceInfoRequest); + List getDeviceInfoListPage(@Param("page") Page page, @Param("deviceInfoRequest") DeviceInfoRequest deviceInfoRequest); List getDeviceInfoList(@Param("deviceInfoRequest") DeviceInfoRequest deviceInfoRequest); @@ -27,6 +27,8 @@ DeviceInfo getByIndexCode(@Param("srcIndex") String srcIndex); + DeviceInfo getByIp(@Param("ip") String ip); + List selectIndexCodesByCodes(@Param("deviceCodes") List deviceCodes); List selectByType(@Param("devType") String devType); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java index 41dd0af..5bfaf63 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java @@ -5,6 +5,7 @@ import com.casic.missiles.modular.dto.DeviceRepairRequest; import com.casic.missiles.modular.model.DeviceRepairLog; import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; import java.util.List; @@ -16,7 +17,7 @@ @Mapper public interface DeviceRepairLogMapper extends BaseMapper { - List getDeviceRepairListPage(Page page, DeviceRepairRequest deviceRepairRequest); + List getDeviceRepairListPage(@Param("page") Page page, @Param("deviceRepairRequest")DeviceRepairRequest deviceRepairRequest); - List getDeviceRepairList(DeviceRepairRequest deviceRepairRequest); + List getDeviceRepairList(@Param("deviceRepairRequest") DeviceRepairRequest deviceRepairRequest); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java index 9035c47..4823ac1 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java @@ -18,7 +18,7 @@ @Mapper public interface FireEquipInfoMapper extends BaseMapper { - List getFireEquipInfoListPage(@Param("page") Page page, FireEquipRequest fireEquipRequest); + List getFireEquipInfoListPage(@Param("page") Page page, @Param("fireEquipRequest") FireEquipRequest fireEquipRequest); FireEquipInfo getFireEquipInfo(@Param("equipCode") String equipCode); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/GateGroupMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/GateGroupMapper.java index d8c330d..977a427 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/GateGroupMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/GateGroupMapper.java @@ -17,7 +17,7 @@ */ @Mapper public interface GateGroupMapper extends BaseMapper { - List getGateGroupListPage(@Param("page") Page page, GateGroupRequest gateGroupRequest); + List getGateGroupListPage(@Param("page") Page page, @Param("gateGroupRequest") GateGroupRequest gateGroupRequest); GateGroup getGateGroupByName(@Param("groupName") String groupName); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/HazardLevelMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/HazardLevelMapper.java index 8957780..dcf47bb 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/HazardLevelMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/HazardLevelMapper.java @@ -17,11 +17,13 @@ @Mapper public interface HazardLevelMapper extends BaseMapper { - List getCaseHazardLevelListPage(@Param("page") Page page, HazardLevelRequest hazardLevelRequest); + List getCaseHazardLevelListPage(@Param("page") Page page, @Param("hazardLevelRequest") HazardLevelRequest hazardLevelRequest); - List getCaseHazardLevelList(HazardLevelRequest hazardLevelRequest); + List getCaseHazardLevelList(@Param("hazardLevelRequest") HazardLevelRequest hazardLevelRequest); CaseHazardLevel getCaseHazardLevel(@Param("hazardLevelCode") String hazardLevelCode); List selectHazardName(); + + String selectHazardNameByCode(@Param("hazardLevelCode") String hazardLevelCode); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/HikCaseDefineMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/HikCaseDefineMapper.java index 0dc47d1..f162fef 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/HikCaseDefineMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/HikCaseDefineMapper.java @@ -12,5 +12,5 @@ */ @Mapper public interface HikCaseDefineMapper extends BaseMapper { - HikCaseDefine getHikCaseDefine(@Param("caseTypeCode") Long caseTypeCode); + HikCaseDefine getHikCaseDefine(@Param("caseTypeCode") Number caseTypeCode); } 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 f8a674c..fe5afc2 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 @@ -17,11 +17,13 @@ @Mapper public interface StaffInfoMapper extends BaseMapper { - List getStaffInfoListPage(@Param("page") Page page, StaffInfoRequest staffInfoRequest); + List getStaffInfoListPage(@Param("page") Page page, @Param("staffInfoRequest") StaffInfoRequest staffInfoRequest); StaffInfo selectByCode(@Param("staffCode") String staffCode); - List getStaffInfoList(StaffInfoRequest staffInfoRequest); + List getStaffInfoList(@Param("staffInfoRequest") StaffInfoRequest staffInfoRequest); - List selectBatchCodes(List list); + List selectBatchCodes(@Param("list") List list); + + int updateByCodeForCard(@Param("staffCode") String staffCode, @Param("cardNo") String cardNo); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitInfoMapper.java index b1217c5..6c52542 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitInfoMapper.java @@ -16,7 +16,7 @@ */ @Mapper public interface VisitInfoMapper extends BaseMapper { - List getVisitInfoListPage(@Param("page") Page page, VisitorRequest visitorRequest); + List getVisitInfoListPage(@Param("page") Page page, @Param("visitorRequest") VisitorRequest visitorRequest); VisitInfo selectByOrderId(@Param("orderId") String orderId); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitorApplyMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitorApplyMapper.java index c09f3c0..6ea55bd 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitorApplyMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitorApplyMapper.java @@ -18,7 +18,7 @@ @Mapper public interface VisitorApplyMapper extends BaseMapper { - List getVisitorApplyListPage(@Param("page") Page page, VisitorApplyRequest visitorApplyRequest); + List getVisitorApplyListPage(@Param("page") Page page, @Param("visitorApplyRequest") VisitorApplyRequest visitorApplyRequest); List selectByVisitReason(); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/AttendanceInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/AttendanceInfoMapper.xml index b2ece71..f8bdd6e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/AttendanceInfoMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/AttendanceInfoMapper.xml @@ -43,7 +43,8 @@ and staff_type = #{staffType} - and YEARWEEK(date_format(atte_date, '%Y-%m-%d'), 1) = YEARWEEK(now(),1); + AND DATE_SUB(CURDATE(), INTERVAL 7 DAY) <= DATE(atte_date) + GROUP BY DATE_FORMAT(atte_date, '%Y-%m-%d') @@ -69,4 +70,20 @@ GROUP BY DATE_FORMAT(atte_date, '%Y-%m') + + + \ No newline at end of file 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 2b6953f..06ec0a8 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 @@ -28,7 +28,9 @@ @@ -87,7 +89,8 @@ SELECT hazard_level_code as levelCode, count(id) as quantity FROM bus_case_info WHERE hazard_level_code is not null - AND DATE_SUB(CURDATE(), INTERVAL 7 DAY) <= date(happen_time); + AND is_key_area = 1 + AND DATE_SUB(CURDATE(), INTERVAL 7 DAY) <= date(happen_time) GROUP BY hazard_level_code @@ -95,7 +98,8 @@ SELECT hazard_level_code as levelCode, count(id) as quantity FROM bus_case_info WHERE hazard_level_code is not null - AND DATE_SUB(CURDATE(), INTERVAL 30 DAY) <= date(happen_time); + AND is_key_area = 1 + AND DATE_SUB(CURDATE(), INTERVAL 30 DAY) <= date(happen_time) GROUP BY hazard_level_code @@ -122,4 +126,71 @@ AND hazard_level_code is not null GROUP BY DATE_FORMAT(happen_time,'%Y-%m-%d') + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/CategoryLevelMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/CategoryLevelMapper.xml index 4670b1f..1d25cbd 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/CategoryLevelMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/CategoryLevelMapper.xml @@ -20,11 +20,11 @@ SELECT * FROM bus_case_category_level WHERE 1=1 - - and code = #{code} + + and code = #{categoryLevelRequest.code} - - and name = #{name} + + and name = #{categoryLevelRequest.name} ORDER by create_time DESC 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 9b66fd8..bfd84b7 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 @@ -98,4 +98,10 @@ #{item} + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceRepairLogMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceRepairLogMapper.xml index 078ed3c..cf1a481 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceRepairLogMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceRepairLogMapper.xml @@ -22,14 +22,14 @@ SELECT * FROM bus_device_repair_log WHERE 1=1 - - and device_code = #{devCode} + + and device_code = #{deviceRepairRequest.devCode} - - and device_name = #{devName} + + and device_name = #{deviceRepairRequest.devName} - - and DATE_FORMAT(create_time,"%y%m%d") = DATE_FORMAT(#{createTime},"%y%m%d") + + and DATE_FORMAT(create_time,"%y%m%d") = DATE_FORMAT(#{deviceRepairRequest.createTime},"%y%m%d") ORDER by create_time DESC diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/HazardLevelMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/HazardLevelMapper.xml index f16f2b9..458322b 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/HazardLevelMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/HazardLevelMapper.xml @@ -20,11 +20,11 @@ SELECT * FROM bus_case_hazard_level WHERE 1=1 - - and code = #{code} + + and code = #{hazardLevelRequest.code} - - and name = #{name} + + and name = #{hazardLevelRequest.name} ORDER by create_time DESC @@ -42,4 +42,10 @@ SELECT name FROM bus_case_hazard_level + + \ 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 557237e..b6a183a 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 @@ -50,4 +50,10 @@ + + + UPDATE bus_staff_info + SET card_no = #{cardNo} + WHERE staff_code = #{staffCode} + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitInfoMapper.xml index 84aa84f..230529a 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitInfoMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitInfoMapper.xml @@ -27,5 +27,6 @@ SELECT * FROM bus_visit_info WHERE order_id = #{orderId} and DATE_FORMAT(in_time,'%Y-%m-%d') = CURRENT_DATE + limit 1 \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/BlackPictureRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/BlackPictureRequest.java new file mode 100644 index 0000000..fc92701 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/BlackPictureRequest.java @@ -0,0 +1,14 @@ +package com.casic.missiles.modular.dto; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/29 19:26 + */ +@Data +public class BlackPictureRequest { + private String picUri; + private String serverIndexCode; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/CancelSubscribeRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/CancelSubscribeRequest.java new file mode 100644 index 0000000..e2d390a --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/CancelSubscribeRequest.java @@ -0,0 +1,15 @@ +package com.casic.missiles.modular.dto.hik; + +import lombok.Data; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/24 15:14 + */ +@Data +public class CancelSubscribeRequest { + private List eventTypes; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/CardInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/CardInfo.java new file mode 100644 index 0000000..341457d --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/CardInfo.java @@ -0,0 +1,24 @@ +package com.casic.missiles.modular.dto.hik; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/26 16:08 + */ +@Data +public class CardInfo { + //卡号,8~20个字符,支持数字和大写字母 + private String cardNo; + //人员ID,员工工号 + private String personId; + //人员所属组织IndexCode + private String orgIndexCode; + //卡片类型,默认是1:IC卡 + //1:IC卡 + //2:CPU卡 + //3:远距离卡 + //4:MIFARE卡 + private Number cardType; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/FaceRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/FaceRequest.java new file mode 100644 index 0000000..edc04bf --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/FaceRequest.java @@ -0,0 +1,16 @@ +package com.casic.missiles.modular.dto.hik; + +import lombok.Data; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/25 16:53 + */ +@Data +public class FaceRequest { + private String certificateNum; + private List indexCodes; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/HikRecvEvent.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/HikRecvEvent.java index a3e9845..1b2b2b1 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/HikRecvEvent.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/HikRecvEvent.java @@ -28,12 +28,12 @@ /** * 事件类型,用于判断所需接收到的事件类型 */ - public Long getEventType(){ + public Number getEventType(){ JSONObject jsonObject = (JSONObject)JSONObject.toJSON(params); //事件类别对应SecurityEventTypeEnum JSONArray eventTypeArray = (JSONArray)jsonObject.get("events"); JSONObject eventJsonObject = (JSONObject)JSONObject.toJSON(eventTypeArray.get(0)); - Long eventType = (Long) eventJsonObject.get("eventType"); + Number eventType = (Number) eventJsonObject.get("eventType"); return eventType; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonBatchDeleteRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonBatchDeleteRequest.java index 027d31d..9751929 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonBatchDeleteRequest.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonBatchDeleteRequest.java @@ -12,4 +12,6 @@ @Data public class PersonBatchDeleteRequest { private List personIds; + //删除人脸接口使用 + private String faceId; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonInfoRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonInfoRequest.java new file mode 100644 index 0000000..05dc9e1 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonInfoRequest.java @@ -0,0 +1,20 @@ +package com.casic.missiles.modular.dto.hik; + +import lombok.Data; + +import java.util.List; + +/** + * @Description: 获取员工照片请求实体 + * @Author: wangpeng + * @Date: 2022/8/25 16:53 + */ +@Data +public class PersonInfoRequest { + //获取员工详细信息使用 + private String paramName; + private List paramValue; + //获取照片使用 + private String picUri; + private String serverIndexCode; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonListRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonListRequest.java new file mode 100644 index 0000000..3f7149b --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonListRequest.java @@ -0,0 +1,16 @@ +package com.casic.missiles.modular.dto.hik; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/25 16:53 + */ +@Data +public class PersonListRequest { + private Number pageNo; + private Number pageSize; + + private String orderId; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/SearchPicturesRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/SearchPicturesRequest.java new file mode 100644 index 0000000..0a95966 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/SearchPicturesRequest.java @@ -0,0 +1,24 @@ +package com.casic.missiles.modular.dto.hik; + +import lombok.Data; + +import java.util.List; + +/** + * @Description: 以图搜图请求 + * @Author: wangpeng + * @Date: 2022/8/29 10:46 + */ +@Data +public class SearchPicturesRequest { + private String facePicBinaryData; + private String facePicUrl; + private List cameraIndexCodes; + private String startTime; + private String endTime; + //指定搜图的最小相似度,最小为1,最大为100 + private String minSimilarity; + private Number age; + //male-男性,female-女性 + private String sex; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/StaffCardRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/StaffCardRequest.java new file mode 100644 index 0000000..4052e6d --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/StaffCardRequest.java @@ -0,0 +1,20 @@ +package com.casic.missiles.modular.dto.hik; + +import lombok.Data; + +import java.util.List; + +/** + * @Description: 人员开卡请求实体 + * @Author: wangpeng + * @Date: 2022/8/26 16:05 + */ +@Data +public class StaffCardRequest { + //卡片开始有效时间,时间格式:yyyy-MM-dd + private String startDate; + //卡片截止有效时间,时间格式:yyyy-MM-dd,不能大于2037年12月31日 + private String endDate; + //cardList,待开卡列表,最大支持50张卡 + private List cardList; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/BlackListController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/BlackListController.java index a27f9f8..0c06661 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/BlackListController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/BlackListController.java @@ -1,13 +1,18 @@ package com.casic.missiles.modular.controller; +import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.base.controller.ExportController; import com.casic.missiles.core.page.PageFactory; import com.casic.missiles.model.response.ResponseData; import com.casic.missiles.modular.dto.BlackInfoRequest; +import com.casic.missiles.modular.dto.BlackPictureRequest; +import com.casic.missiles.modular.dto.hik.PersonInfoRequest; +import com.casic.missiles.modular.enums.HikUri; import com.casic.missiles.modular.enums.OperateTypeEnum; import com.casic.missiles.modular.model.BlackInfo; import com.casic.missiles.modular.service.BlackInfoService; +import com.casic.missiles.modular.util.HikUtil; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; @@ -56,4 +61,22 @@ return null; } + /** + * 黑名单人员照片 + */ + @PostMapping("/personPicture") + @ResponseBody + public Object personPicture(@RequestBody BlackPictureRequest blackPictureRequest){ + //获取照片 + String picUri = blackPictureRequest.getPicUri(); + String serverIndexCode = blackPictureRequest.getServerIndexCode(); + PersonInfoRequest picRequest = new PersonInfoRequest(); + picRequest.setPicUri(picUri); + picRequest.setServerIndexCode(serverIndexCode); + String reBody = JSONObject.toJSONString(picRequest); + //重定向地址获取 + String url = HikUtil.hikApiFor302(HikUri.PERSON_PICTURE, reBody); + return ResponseData.success(url); + } + } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/DeviceController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/DeviceController.java index e1c4eba..666bbee 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/DeviceController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/DeviceController.java @@ -107,7 +107,7 @@ } /** - * 设备维修管理查询(分页),需计算MTTR=总维修时间/故障次数 + * 设备状态计算与评判/设备维修管理查询(分页),需计算MTTR=总维修时间/故障次数 */ @PostMapping("/repair/listPage") @ResponseBody @@ -211,7 +211,7 @@ //需根据设备编号获取到对应的门禁点唯一标识 doorControlRequest.setDoorIndexCodes(indexCodes); doorControlRequest.setControlType(Integer.valueOf(gateGroupDTO.getStatus())); - String body = JSONObject.toJSONString(deviceCodes); + String body = JSONObject.toJSONString(doorControlRequest); String resultStr = HikUtil.hikApi(HikUri.DOOR_CONTROL, body); JSONObject resultJson = (JSONObject)JSONObject.parse(resultStr); if (!"0".equals(resultJson.get("code"))) { diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/StaffController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/StaffController.java index b58ccab..704093c 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/StaffController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/StaffController.java @@ -2,15 +2,21 @@ import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.util.StrUtil; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.base.controller.ExportController; import com.casic.missiles.core.page.PageFactory; import com.casic.missiles.model.response.ErrorResponseData; import com.casic.missiles.model.response.ResponseData; import com.casic.missiles.modular.dto.StaffInfoRequest; +import com.casic.missiles.modular.dto.hik.PersonInfoRequest; +import com.casic.missiles.modular.dto.hik.StaffCardRequest; +import com.casic.missiles.modular.enums.HikUri; import com.casic.missiles.modular.enums.OperateTypeEnum; import com.casic.missiles.modular.model.StaffInfo; import com.casic.missiles.modular.service.StaffInfoService; +import com.casic.missiles.modular.util.HikUtil; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; @@ -110,4 +116,60 @@ } return ResponseData.success(); } + + /** + * 批量开卡,添加人员之后调用,若在一个接口中添加人员成功开卡失败则第二次添加时会有问题 + */ + @PostMapping("/cardBinding") + @ResponseBody + public Object cardBinding(@RequestBody StaffCardRequest staffCardRequest) { + String body = JSONObject.toJSONString(staffCardRequest); + String resultStr = HikUtil.hikApi(HikUri.CARD_BINDING, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (!"0".equals(resultJson.get("code"))) { + log.error("请求海康,批量开卡失败,海康response:{}", resultStr); + return ResponseData.error("批量开卡失败"); + } + //保存卡号 + if(staffInfoService.saveCardInfo(staffCardRequest) > 0){ + return ResponseData.success(); + } + return ResponseData.error("批量开卡失败"); + } + + /** + * 获取员工照片,海康存储 + */ + @PostMapping("/personPicture/{staffCode}") + @ResponseBody + public Object personPicture(@PathVariable("staffCode") String staffCode){ + //获取员工详细信息,含图片服务器、uri + PersonInfoRequest request = new PersonInfoRequest(); + List list = new ArrayList<>(); + list.add(staffCode); + request.setParamName("personId"); + request.setParamValue(list); + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi(HikUri.PERSON_INFO, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (!"0".equals(resultJson.get("code"))) { + log.error("请求海康,根据人员唯一字段获取人员详细信息失败,海康response:{}", resultStr); + return ResponseData.error("获取员工照片失败"); + } + //获取照片 + JSONObject data = (JSONObject) resultJson.get("data"); + JSONArray dataArray = (JSONArray) data.get("list"); + JSONObject jsonObject = (JSONObject) dataArray.get(0); + JSONArray personPhoto = (JSONArray) jsonObject.get("personPhoto"); + JSONObject photo = (JSONObject) personPhoto.get(0); + String picUri = photo.getString("picUri"); + String serverIndexCode = photo.getString("serverIndexCode"); + PersonInfoRequest picRequest = new PersonInfoRequest(); + picRequest.setPicUri(picUri); + picRequest.setServerIndexCode(serverIndexCode); + String reBody = JSONObject.toJSONString(picRequest); + //重定向地址获取 + String url = HikUtil.hikApiFor302(HikUri.PERSON_PICTURE, reBody); + return ResponseData.success(url); + } } 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 4a07dd9..7b1dcf6 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 @@ -16,6 +16,7 @@ import com.casic.missiles.modular.redis.key.CacheKeys; import com.casic.missiles.modular.service.CockpitService; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.util.CollectionUtils; import org.springframework.web.bind.annotation.*; @@ -24,10 +25,7 @@ import java.text.NumberFormat; import java.time.LocalDateTime; import java.time.temporal.ChronoUnit; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.util.*; import java.util.stream.Collectors; /** @@ -73,6 +71,9 @@ private StatisticNumberMapper numberMapper; @Autowired + private HazardLevelMapper hazardLevelMapper; + + @Autowired private AccessGroupConfig accessGroupConfig; /** @@ -104,8 +105,24 @@ public Object buildingNumberPerHour(){ //当天按小时分组的人数 List list = numberMapper.selectListByTime(); - Map> collect = list.stream().collect(Collectors.groupingBy(BuildingNumberDTO::getStatisticPosition)); - return ResponseData.success(collect); + Map> collect = list.stream().collect(Collectors.groupingBy(BuildingNumberDTO::getStatisticTime)); + //定时任务中已将每小时三栋楼人数存到数据库 + //将一期主楼和录制楼人数合并,二期单算 + List> resultList = new ArrayList<>(); + collect.keySet().forEach(key -> { + List buildingNumberDTOS = collect.get(key); + BuildingNumberDTO mainBuildingOne = buildingNumberDTOS.get(0); + BuildingNumberDTO mainBuildingTwo = buildingNumberDTOS.get(1); + BuildingNumberDTO recordingBuilding = buildingNumberDTOS.get(2); + HashMap resultMap = new HashMap<>(); + Integer oneQuantity = Integer.valueOf(mainBuildingOne.getStatisticQuantity()); + Integer recordingQuantity = Integer.valueOf(recordingBuilding.getStatisticQuantity()); + resultMap.put("staticTime", mainBuildingOne.getStatisticTime()); + resultMap.put(mainBuildingOne.getStatisticPositionName()+"、"+recordingBuilding.getStatisticPositionName(), String.valueOf(oneQuantity+recordingQuantity)); + resultMap.put(mainBuildingTwo.getStatisticPositionName(), mainBuildingTwo.getStatisticQuantity()); + resultList.add(resultMap); + }); + return ResponseData.success(resultList); } /** @@ -151,12 +168,11 @@ public Object securityNumber() { QueryWrapper wrapper = new QueryWrapper<>(); wrapper.eq("staff_type", 2); + // TODO: 2022/9/2 后续使用产品确定的每天出勤的安保人员的数量 Integer total = staffInfoMapper.selectCount(wrapper); - //当日离岗事件个数 - QueryWrapper wrapper1 = new QueryWrapper<>(); - wrapper1.eq("hik_event_type", SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); - wrapper1.apply("date_format(now(),'%Y-%m-%d') = date_format(happen_time,'%Y-%m-%d')"); - Integer leave = caseInfoMapper.selectCount(wrapper1); + //当日离岗事件按设备去重后的个数 + // TODO: 2022/9/2 目前相当于24小时内的计算,之后看需要可改成自定义小时数计算离岗率,即离岗+6小时内仅一次离岗则恢复为100%,多次则累加离岗次数计算离岗率 + Integer leave = caseInfoMapper.selectDemobilizedCount(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); NumberFormat numberFormat = NumberFormat.getInstance(); // 设置精确到小数点后2位 numberFormat.setMaximumFractionDigits(2); @@ -179,7 +195,6 @@ @ResponseBody public Object visitorApplyDetail() { List reasonGroup = applyMapper.selectByVisitReason(); - HashMap resultMap = new HashMap<>(); NumberFormat numberFormat = NumberFormat.getInstance(); // 设置精确到小数点后2位 numberFormat.setMaximumFractionDigits(2); @@ -187,12 +202,17 @@ if(0 == sum){ return ResponseData.success(); } + List resultList = new ArrayList<>(); reasonGroup.forEach(group -> { String reasonName = dictService.getDictNameByCode(SecurityEventDict.VISIT_REASON, group.getVisitReason()); String result = numberFormat.format((float) group.getQuantity() / (float) sum * 100); - resultMap.put(reasonName, result+"%"); + ApplyReasonGroupDTO applyReasonGroupDTO = new ApplyReasonGroupDTO(); + applyReasonGroupDTO.setQuantity(group.getQuantity()); + applyReasonGroupDTO.setVisitReason(reasonName); + applyReasonGroupDTO.setRatio(result+"%"); + resultList.add(applyReasonGroupDTO); }); - return ResponseData.success(resultMap); + return ResponseData.success(resultList); } /** @@ -247,6 +267,32 @@ } /** + * 机动力量实时在岗率,在岗人数除以总应在岗人数,用离岗+6小时内恢复为100%,6小时外再计算 + */ + @GetMapping("/staff/beOnDutyRatio") + @ResponseBody + public Object beOnDutyRatio() { + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("staff_type", 2); + // TODO: 2022/9/2 后续使用产品确定的每天出勤的安保人员的数量 + Integer total = staffInfoMapper.selectCount(wrapper); + if(0 == total){ + return ResponseData.success(null); + } + //当日离岗事件按设备去重后的个数 + // TODO: 2022/9/2 目前相当于24小时内的计算,之后看需要可改成自定义小时数计算离岗率,即离岗+6小时内仅一次离岗则恢复为100%,多次则累加离岗次数计算离岗率 + List onDutyRatioDTOS = caseInfoMapper.selectDemobilizedCountByHour(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); + onDutyRatioDTOS.forEach(dto -> { + NumberFormat numberFormat = NumberFormat.getInstance(); + // 设置精确到小数点后2位 + numberFormat.setMaximumFractionDigits(2); + String result = numberFormat.format(100 - Float.valueOf(dto.getQuantity()) / (float) total * 100); + dto.setRatio(result+"%"); + }); + return ResponseData.success(onDutyRatioDTOS); + } + + /** * 闸机速通门统计-设备状态分组计算数量,devType传闸机字典key * 视频频监控摄像机统计-设备状态分组计算数量,devType传摄像头字典key */ @@ -262,12 +308,17 @@ if(sum <= 0){ return ResponseData.error("无该类设备信息"); } + List resultList = new ArrayList<>(); gateStatusGroup.forEach(group -> { String devStatus = dictService.getDictNameByCode(SecurityEventDict.DEVICE_STATUS, group.getStatus()); String result = numberFormat.format((float) group.getQuantity() / (float) sum * 100); - resultMap.put(devStatus, result+"%"); + GateStatusGroupResponse gateStatusGroupResponse = new GateStatusGroupResponse(); + gateStatusGroupResponse.setStatus(devStatus); + gateStatusGroupResponse.setRatio(result+"%"); + resultList.add(gateStatusGroupResponse); }); - resultMap.put("总", sum); + resultMap.put("total", sum); + resultMap.put("list", resultList); return ResponseData.success(resultMap); } @@ -282,17 +333,38 @@ String position = securityScoreDTO.getPosition(); List caseInfos = caseInfoMapper.selectByPosition(position); //查询各危险级别权重、各类别权重,放入map,避免循环中多次查数据库 - + HashMap hazardScoreMap = new HashMap<>(); + List caseHazardLevelList = hazardLevelMapper.getCaseHazardLevelList(null); + caseHazardLevelList.forEach(hazardLevel -> { + hazardScoreMap.put(hazardLevel.getCode(), hazardLevel.getWeight()); + }); + HashMap categoryScoreMap = new HashMap<>(); + List categoryLevelList = categoryLevelMapper.getCaseCategoryLevelList(null); + categoryLevelList.forEach(categoryLevel -> { + categoryScoreMap.put(categoryLevel.getCode(), categoryLevel.getWeight()); + }); + //事件按楼层分组,计算 List securityScoreDTOs = new ArrayList<>(); caseInfos.forEach(caseInfo -> { SecurityScoreDTO securityScoreDTO1 = new SecurityScoreDTO(); + securityScoreDTO1.setPosition(caseInfo.getPosition()); securityScoreDTO1.setArea(caseInfo.getArea()); - // TODO: 2022/8/4 楼层评分计算根据产品定义调整 -// caseInfo.get -// securityScoreDTO1.setScore(); + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); + Double score = 100 - Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + securityScoreDTO1.setScore(score); + securityScoreDTOs.add(securityScoreDTO1); }); - - return null; + 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); + }); + return ResponseData.success(securityScoreDTOs); } /** @@ -303,9 +375,13 @@ public Object SecurityFrequency(@RequestBody SecurityFrequencyDTO securityFrequencyDTO) { String year = securityFrequencyDTO.getYear(); String month = securityFrequencyDTO.getMonth(); - Integer quantity = caseInfoMapper.selectCountByMonth(year, month); - securityFrequencyDTO.setQuantity(quantity); - return ResponseData.success(securityFrequencyDTO); + if(!StringUtils.isEmpty(year) && StringUtils.isEmpty(month)){ + Integer quantity = caseInfoMapper.selectCountByMonth(year, month); + securityFrequencyDTO.setQuantity(quantity); + return ResponseData.success(securityFrequencyDTO); + } + List list = caseInfoMapper.selectPreMonthCount(); + return ResponseData.success(list); } } 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 ae4d770..f4f075c 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 @@ -1,20 +1,25 @@ package com.casic.missiles.modular.controller.cockpit; +import cn.hutool.core.date.DateUnit; import cn.hutool.core.date.DateUtil; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.casic.missiles.model.response.ResponseData; -import com.casic.missiles.modular.dao.AttendanceInfoMapper; -import com.casic.missiles.modular.dao.CaseInfoMapper; -import com.casic.missiles.modular.dao.HazardLevelMapper; -import com.casic.missiles.modular.dao.StaffInfoMapper; +import com.casic.missiles.modular.dao.*; +import com.casic.missiles.modular.dto.DeviceRepairLogDTO; +import com.casic.missiles.modular.dto.DeviceRepairRequest; import com.casic.missiles.modular.dto.statistics.*; +import com.casic.missiles.modular.enums.SecurityEventType; +import com.casic.missiles.modular.model.CaseCategoryLevel; import com.casic.missiles.modular.model.CaseHazardLevel; +import com.casic.missiles.modular.model.CaseInfo; import com.casic.missiles.modular.model.StaffInfo; +import com.casic.missiles.modular.service.DeviceInfoService; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.util.CollectionUtils; import org.springframework.web.bind.annotation.*; +import java.math.BigDecimal; import java.text.NumberFormat; import java.util.*; import java.util.stream.Collectors; @@ -40,6 +45,12 @@ @Autowired private HazardLevelMapper hazardLevelMapper; + @Autowired + private CategoryLevelMapper categoryLevelMapper; + + @Autowired + private DeviceInfoService deviceInfoService; + /** * 安防事件时域频次统计,每月的每天安防事件个数(原方案) * 月维度:展示每个月的每天的数据 @@ -89,15 +100,17 @@ List monthList = caseInfoMapper.selectPreMonthCountByYear(year); Map> collect = monthList.stream().collect(Collectors.groupingBy(PreMonthOrWeekCaseDTO::getHazardLevelCode)); HashMap strAvgMap = new HashMap<>(); + List resultList = new ArrayList<>(); for (String key : collect.keySet()) { List preMonthOrWeekCaseDTOS = collect.get(key); int sum = preMonthOrWeekCaseDTOS.stream().mapToInt(PreMonthOrWeekCaseDTO::getQuantity).sum(); //若年份是本年,则使用个安防级别数量/当前月份数 //若不是本年,除数为12 MonthAndWeekDTO monthAndWeekDTO = new MonthAndWeekDTO(); + String hazardName = hazardLevelMapper.selectHazardNameByCode(key); + monthAndWeekDTO.setLevelName(hazardName); if(year.equals(String.valueOf(DateUtil.thisYear()))){ monthAndWeekDTO.setMonthQuantity(sum / DateUtil.thisMonth()); -// monthAndWeekDTO.setLevelName(); strAvgMap.put(key, monthAndWeekDTO); }else{ monthAndWeekDTO.setMonthQuantity(sum / 12); @@ -113,27 +126,37 @@ if(year.equals(String.valueOf(DateUtil.thisYear()))){ if(!Objects.isNull(strAvgMap.get(key))){ MonthAndWeekDTO monthAndWeekDTO = strAvgMap.get(key); + String hazardName = hazardLevelMapper.selectHazardNameByCode(key); + monthAndWeekDTO.setLevelName(hazardName); monthAndWeekDTO.setWeekQuantity(sum / DateUtil.thisWeekOfYear()); strAvgMap.put(key, monthAndWeekDTO); }else{ MonthAndWeekDTO monthAndWeekDTO = new MonthAndWeekDTO(); + String hazardName = hazardLevelMapper.selectHazardNameByCode(key); + monthAndWeekDTO.setLevelName(hazardName); monthAndWeekDTO.setWeekQuantity(sum / DateUtil.thisWeekOfYear()); strAvgMap.put(key, monthAndWeekDTO); } }else{ if(!Objects.isNull(strAvgMap.get(key))){ MonthAndWeekDTO monthAndWeekDTO = strAvgMap.get(key); + String hazardName = hazardLevelMapper.selectHazardNameByCode(key); + monthAndWeekDTO.setLevelName(hazardName); monthAndWeekDTO.setWeekQuantity(sum / 52); strAvgMap.put(key, monthAndWeekDTO); }else{ MonthAndWeekDTO monthAndWeekDTO = new MonthAndWeekDTO(); + String hazardName = hazardLevelMapper.selectHazardNameByCode(key); + monthAndWeekDTO.setLevelName(hazardName); monthAndWeekDTO.setWeekQuantity(sum / 52); strAvgMap.put(key, monthAndWeekDTO); } } } - avgMonthAndWeekGroupDTO.setMap(strAvgMap); - return ResponseData.success(avgMonthAndWeekGroupDTO); + strAvgMap.keySet().forEach(key -> { + resultList.add(strAvgMap.get(key)); + }); + return ResponseData.success(resultList); } /** @@ -181,12 +204,178 @@ } /** - * 员工考勤人数变化,功能待定 + * 员工考勤人数变化,统计当天(横坐标为时)及近7天(横坐标为天)的考勤人数变化,只要发生一次考勤识别,次数的基数就正常增加(没有上班下班区分) */ + @PostMapping("/staff/attendanceNumber/{dimension}") + @ResponseBody + public Object attendanceNumber(@PathVariable("dimension") String dimension) { + List attendanceNumberDTOs = null; + List> resultList = new ArrayList<>(); + if("week".equals(dimension)){ + //近7天数据按天分组统计 + attendanceNumberDTOs = attendanceInfoMapper.getCountForWeek(); + }else if("day".equals(dimension)) { + //今天数据按小时分组统计 + attendanceNumberDTOs = attendanceInfoMapper.getCountForDay(); + } + if(CollectionUtils.isEmpty(attendanceNumberDTOs)){ + return ResponseData.error("该查询条件下,无员工出勤数据!"); + } + Map> collect = attendanceNumberDTOs.stream().collect(Collectors.groupingBy(AttendanceNumberDTO::getDate)); + collect.keySet().forEach(key -> { + List attendanceNumberDTOS = collect.get(key); + AttendanceNumberDTO attendanceNumberDTO = attendanceNumberDTOS.get(0); + AttendanceNumberDTO attendanceNumberDTO2 = attendanceNumberDTOS.get(1); + Map resultMap = new HashMap<>(); + resultMap.put(attendanceNumberDTO.getStaffType(), attendanceNumberDTO.getQuantity()); + resultMap.put(attendanceNumberDTO2.getStaffType(), attendanceNumberDTO2.getQuantity()); + resultMap.put("staticTime", attendanceNumberDTO.getDate()); + resultList.add(resultMap); + }); + return ResponseData.success(resultList); + } /** - * 近30天/近一周安保人员到岗排行 + * 早晚高峰区域安防评估 */ + @PostMapping("/security/assessment/{dimension}") + @ResponseBody + public Object securityAssessment(@PathVariable("dimension") String dimension) { + //查询各危险级别权重、各类别权重,放入map,避免循环中多次查数据库 + HashMap hazardScoreMap = new HashMap<>(); + List caseHazardLevelList = hazardLevelMapper.getCaseHazardLevelList(null); + caseHazardLevelList.forEach(hazardLevel -> { + hazardScoreMap.put(hazardLevel.getCode(), hazardLevel.getWeight()); + }); + HashMap categoryScoreMap = new HashMap<>(); + List categoryLevelList = categoryLevelMapper.getCaseCategoryLevelList(null); + categoryLevelList.forEach(categoryLevel -> { + categoryScoreMap.put(categoryLevel.getCode(), categoryLevel.getWeight()); + }); + HashMap hashMap = new HashMap<>(); + if("week".equals(dimension)){ + //近7天早晚高峰数据 + List caseInfos = caseInfoMapper.selectListBySevenDay(); + //按时间(天)进行分组 + caseInfos.forEach(caseInfo -> { + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); + Double score = Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + String[] array = caseInfo.getHappenTime().split(" "); + String dayTime = array[0]; + BigDecimal preScore; + if(hashMap.containsKey(dayTime)){ + Double aDouble = hashMap.get(dayTime); + preScore = new BigDecimal(aDouble.toString()); + + }else{ + preScore = new BigDecimal("100.0"); + } + BigDecimal nowScore = new BigDecimal(score.toString()); + hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); + }); + return ResponseData.success(hashMap); + }else if("day".equals(dimension)) { + //今天数据按小时分组统计 + List caseInfos = caseInfoMapper.selectListByToday(); + caseInfos.forEach(caseInfo -> { + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); + Double score = Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + String[] array = caseInfo.getHappenTime().split(":"); + String dayTime = array[0]; + BigDecimal preScore; + if(hashMap.containsKey(dayTime)){ + Double aDouble = hashMap.get(dayTime); + preScore = new BigDecimal(aDouble.toString()); + + }else{ + preScore = new BigDecimal("100.0"); + } + BigDecimal nowScore = new BigDecimal(score.toString()); + hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); + }); + return ResponseData.success(hashMap); + } + return null; + } + + /** + * 重点区域安防事态评估,统计重点区域6:00-23:00按小时分组数据 + */ + @GetMapping("/security/keyAreaStatistic") + @ResponseBody + public Object keyAreaStatistic() { + //查询各危险级别权重、各类别权重,放入map,避免循环中多次查数据库 + HashMap hazardScoreMap = new HashMap<>(); + List caseHazardLevelList = hazardLevelMapper.getCaseHazardLevelList(null); + caseHazardLevelList.forEach(hazardLevel -> { + hazardScoreMap.put(hazardLevel.getCode(), hazardLevel.getWeight()); + }); + HashMap categoryScoreMap = new HashMap<>(); + List categoryLevelList = categoryLevelMapper.getCaseCategoryLevelList(null); + categoryLevelList.forEach(categoryLevel -> { + categoryScoreMap.put(categoryLevel.getCode(), categoryLevel.getWeight()); + }); + HashMap hashMap = new HashMap<>(); + //今天数据按小时分组统计 + List caseInfos = caseInfoMapper.selectListByToday2(); + caseInfos.forEach(caseInfo -> { + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); + Double score = Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + String[] array = caseInfo.getHappenTime().split(":"); + String dayTime = array[0]; + BigDecimal preScore; + if(hashMap.containsKey(dayTime)){ + Double aDouble = hashMap.get(dayTime); + preScore = new BigDecimal(aDouble.toString()); + + }else{ + preScore = new BigDecimal("100.0"); + } + BigDecimal nowScore = new BigDecimal(score.toString()); + hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); + }); + return ResponseData.success(hashMap); + } + + /** + * 安防机动支援力量调配响应评估,根据事件已解决状态及已解决时间-发送时间,按时间(小时)分组统计 + */ + @GetMapping("/security/responseAssess") + @ResponseBody + public Object responseAssess() { + //查询各危险级别权重、各类别权重,放入map,避免循环中多次查数据库 + HashMap hazardScoreMap = new HashMap<>(); + List caseHazardLevelList = hazardLevelMapper.getCaseHazardLevelList(null); + caseHazardLevelList.forEach(hazardLevel -> { + hazardScoreMap.put(hazardLevel.getCode(), hazardLevel.getWeight()); + }); + HashMap hashMap = new HashMap<>(); + //今天数据按小时分组统计 + List caseInfos = caseInfoMapper.selectListByToday3(); + caseInfos.forEach(caseInfo -> { + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + //扣分=事件级别权重*未解决小时数 + Date updateTime = DateUtil.parse(caseInfo.getUpdateTime()); + Date happenTime = DateUtil.parse(caseInfo.getHappenTime()); + long between = DateUtil.between(updateTime, happenTime, DateUnit.HOUR); + Double score = Double.valueOf(hazardWeight)*between; + String[] array = caseInfo.getHappenTime().split(":"); + String dayTime = array[0]; + BigDecimal preScore; + if(hashMap.containsKey(dayTime)){ + Double aDouble = hashMap.get(dayTime); + preScore = new BigDecimal(aDouble.toString()); + }else{ + preScore = new BigDecimal("100.0"); + } + BigDecimal nowScore = new BigDecimal(score.toString()); + hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); + }); + return ResponseData.success(hashMap); + } /** * 重点区域威胁事件类型统计,优先级2,统计近7天和近30天 @@ -224,7 +413,34 @@ } /** - * 设备状态计算系数和评判,优先级3,需确认设备恢复时间是否可以获取 + * 近30天/近一周安保人员到岗排行 */ + + /** + * 安保等级评估,发生离岗事件减1分 + */ + @GetMapping("/security/levelAssess") + @ResponseBody + public Object securityLevelAssess() { + //今天数据按小时分组统计 + List resultList = caseInfoMapper.selectListByType(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); + resultList.forEach(result -> { + BigDecimal deScore = new BigDecimal(result.getQuantity()); + BigDecimal preScore = new BigDecimal("100.0"); + result.setScore(preScore.subtract(deScore).doubleValue()); + }); + return ResponseData.success(resultList); + } + + /** + * 设备状态计算系数和评判,即设备维修管理查询(不分页) + */ + @PostMapping("/device/repairList") + @ResponseBody + public Object repairList(@RequestBody DeviceRepairRequest deviceRepairRequest) { + List deviceRepairLogDTOS = deviceInfoService.deviceRepairListPage(deviceRepairRequest); + return ResponseData.success(deviceRepairLogDTOS); + } + } 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 fbf8ab6..c71a15a 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 @@ -1,13 +1,12 @@ package com.casic.missiles.modular.controller.hik; +import cn.hutool.core.date.DateTime; +import cn.hutool.core.date.DateUtil; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.casic.missiles.model.response.ResponseData; import com.casic.missiles.modular.dao.HikFaceGroupInfoMapper; -import com.casic.missiles.modular.dto.hik.EventSubscribeRequest; -import com.casic.missiles.modular.dto.hik.FaceGroupAdditionRequest; -import com.casic.missiles.modular.dto.hik.HikRecvEvent; -import com.casic.missiles.modular.dto.hik.OrgBatchAdd; +import com.casic.missiles.modular.dto.hik.*; import com.casic.missiles.modular.enums.HikUri; import com.casic.missiles.modular.enums.SecurityEventType; import com.casic.missiles.modular.model.CaseInfo; @@ -18,16 +17,20 @@ import com.casic.missiles.modular.util.CaseInfoFactoryUtil; import com.casic.missiles.modular.util.HikUtil; import com.casic.missiles.modular.util.ThreadPoolUtil; +import com.casic.missiles.modular.util.WebSocket; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; -import org.springframework.web.bind.annotation.*; +import org.springframework.util.CollectionUtils; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.RestController; -import java.net.InetAddress; -import java.net.UnknownHostException; import java.util.ArrayList; +import java.util.Iterator; import java.util.List; import java.util.Objects; @@ -38,7 +41,6 @@ */ @Slf4j @RestController -@RequestMapping("/hik") public class HikController { @Autowired @@ -53,28 +55,37 @@ @Autowired private HikService hikService; + @Autowired + private HikFaceGroupInfoMapper hikFaceGroupInfoMapper; + + @Autowired + private WebSocket webSocket; + @Value("${server.port}") private int serverPort; - @Autowired - private HikFaceGroupInfoMapper hikFaceGroupInfoMapper; /** * 海康事件订阅 */ - @PostMapping("/event/subscribe") + @PostMapping("/hik/event/subscribe") @ResponseBody - public Object eventSubscribe() throws UnknownHostException { + public Object eventSubscribe() { EventSubscribeRequest eventSubscribeRequest = new EventSubscribeRequest(); ArrayList list = new ArrayList<>(); list.add(SecurityEventType.DEVICE_OFFLINE); + list.add(SecurityEventType.DEVICE_ONLINE); list.add(SecurityEventType.KEY_PERSONNEL_IDENTIFY_EVENT); list.add(SecurityEventType.MONITORING_POINT_OFFLINE); + list.add(SecurityEventType.MONITORING_POINT_ONLINE); list.add(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); list.add(SecurityEventType.PERSONNEL_GATHER_EVENT); - InetAddress localHost = InetAddress.getLocalHost(); + list.add(SecurityEventType.VISITOR_REGISTER); + list.add(SecurityEventType.VISITOR_CHECKOUT); + list.add(SecurityEventType.HIGH_ALTITUDE_PARABOLIC); +// InetAddress localHost = InetAddress.getLocalHost(); eventSubscribeRequest.setEventTypes(list); - eventSubscribeRequest.setEventDest("https://" + localHost + ":" + serverPort + "/eventRcv"); + eventSubscribeRequest.setEventDest("http://" + "192.168.10.6" + ":" + serverPort + "/eventRcv"); //订阅类型,0-订阅原始事件,1-联动事件,2-原始事件和联动事件,不填使用默认值0 eventSubscribeRequest.setSubType(0); /** @@ -92,19 +103,25 @@ } /** + * 查询事件订阅信息 + */ + @PostMapping("/hik/event/query") + @ResponseBody + public Object eventQuery() { + String result = HikUtil.hikApi(HikUri.EVENT_INFO, ""); + return result; + } + + /** * 海康事件接收 */ @PostMapping("/eventRcv") @ResponseBody public Object eventRcv(@RequestBody HikRecvEvent hikRecvEvent) { //1、接收所需事件类型 - Long eventType = hikRecvEvent.getEventType(); + Number eventType = hikRecvEvent.getEventType(); log.info("接收到安防事件类型为:{}", eventType); CaseInfo caseInfo = caseInfoFactoryUtil.getCaseInfo(eventType); - //接收到不关心事件直接返回 - if(Objects.isNull(caseInfo)){ - return ResponseData.success(); - } //2、不同事件不同处理,caseInfoFactoryUtil已设置好事件基础定义信息 // 再为事件添加状态、设备编码、设备名称、位置、区域、时间 // 异步处理事件 @@ -114,19 +131,23 @@ caseHandle(hikRecvEvent, eventType, caseInfo); } })); +// caseHandle(hikRecvEvent, eventType, caseInfo); - return null; + return ResponseData.success(); } - private void caseHandle(HikRecvEvent hikRecvEvent, Long eventType, CaseInfo caseInfo) { + private void caseHandle(HikRecvEvent hikRecvEvent, Number eventType, CaseInfo caseInfo) { JSONArray eventArray = hikRecvEvent.getEventArray(); List caseInfos = new ArrayList<>(); - while (eventArray.stream().iterator().hasNext()) { + Iterator iterator = eventArray.iterator(); + while (iterator.hasNext()) { CaseInfo caseInfo1 = new CaseInfo(); - BeanUtils.copyProperties(caseInfo, caseInfo1); - JSONObject event = (JSONObject) eventArray.stream().iterator().next(); + if(!Objects.isNull(caseInfo)){ + BeanUtils.copyProperties(caseInfo, caseInfo1); + } + JSONObject event = (JSONObject) iterator.next(); //5种事件进行不同处理 - if(SecurityEventType.KEY_PERSONNEL_IDENTIFY_EVENT == eventType){ + if (SecurityEventType.KEY_PERSONNEL_IDENTIFY_EVENT.equals(eventType)) { //判断所属人脸分组 JSONObject data = (JSONObject) event.get("data"); JSONObject faceRecognitionResult = (JSONObject) data.get("faceRecognitionResult"); @@ -142,52 +163,101 @@ if (faceGroupCode.equals(blackListGroup.getFaceGroupCode())) { //黑名单分组处理 caseInfo1 = hikService.blackListHandle(event, caseInfo1); - }else if(faceGroupCode.equals(propertyPersonnelGroup.getFaceGroupCode())){ + } else if (faceGroupCode.equals(propertyPersonnelGroup.getFaceGroupCode())) { //考勤分组处理-物业人员,添加到考勤表 hikService.propertyAttendanceHandle(event); - }else if(faceGroupCode.equals(securityPersonnelGroup.getFaceGroupCode())){ + } else if (faceGroupCode.equals(securityPersonnelGroup.getFaceGroupCode())) { //考勤分组处理-安保人员,添加到考勤表 hikService.securityPersonnelHandle(event); - }else { + } else { return; } - }else if(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT == eventType){ + } else if (SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT.equals(eventType)) { //离岗事件处理 caseInfo1 = hikService.demobilizedHandle(event, caseInfo1); - }else if(SecurityEventType.PERSONNEL_GATHER_EVENT == eventType){ + } else if (SecurityEventType.PERSONNEL_GATHER_EVENT.equals(eventType)) { //人员聚集事件处理 caseInfo1 = hikService.personGatherHandle(event, caseInfo1); - }else if(SecurityEventType.MONITORING_POINT_OFFLINE == eventType){ + } else if (SecurityEventType.MONITORING_POINT_OFFLINE.equals(eventType)) { //监控点离线事件处理 caseInfo1 = hikService.monitorPointOfflineHandle(event, caseInfo1); - }else if(SecurityEventType.DEVICE_OFFLINE == eventType){ + } else if (SecurityEventType.MONITORING_POINT_ONLINE.equals(eventType)) { + //监控点上线事件处理 + hikService.monitorPointOnlineHandle(event); + } else if (SecurityEventType.DEVICE_OFFLINE.equals(eventType)) { //装置离线事件处理 caseInfo1 = hikService.deviceOfflineHandle(event, caseInfo1); - }else if(SecurityEventType.VISITOR_REGISTER == eventType){ + } else if (SecurityEventType.DEVICE_ONLINE.equals(eventType)) { + //装置上线处理 + hikService.deviceOnlineHandle(event); + } else if (SecurityEventType.VISITOR_REGISTER.equals(eventType)) { //记录访客登记记录,添加到访客记录表 hikService.visitorRegisterHandler(event); - }else if(SecurityEventType.VISITOR_CHECKOUT == eventType){ + } else if (SecurityEventType.VISITOR_CHECKOUT.equals(eventType)) { //记录访客签离记录 hikService.visitorCheckOutHandler(event); } - if(!Objects.isNull(caseInfo1) && !StringUtils.isEmpty(caseInfo1.getHappenTime())){ + if (!Objects.isNull(caseInfo1) && !StringUtils.isEmpty(caseInfo1.getHappenTime())) { caseInfos.add(caseInfo1); } } //3、安防事件入库 - if(!caseInfoService.insertCaseInfoBatch(caseInfos)){ - log.error("安防事件批量入库异常"); + if (!CollectionUtils.isEmpty(caseInfos) && !caseInfoService.insertCaseInfoBatch(caseInfos)) { + log.error("安防事件批量入库异常!"); } // TODO: 2022/8/15 webSocket推送 + if (CollectionUtils.isEmpty(caseInfos)) { + log.info("webSocket事件推送"); + webSocket.sendAllMessage(JSONObject.toJSONString(caseInfos)); + } return; } /** + * 以图搜图,前端用于轨迹追踪 + */ + @PostMapping("/hik/search/picture") + @ResponseBody + public Object searchPictures(@RequestBody SearchPicturesRequest searchPicturesRequest) { + DateTime startDateTime = DateUtil.parse(searchPicturesRequest.getStartTime()); + DateTime endDateTime = DateUtil.parse(searchPicturesRequest.getEndTime()); + String startTime = DateUtil.format(startDateTime, "yyyy-MM-dd'T'HH:mm:ss.SSSXXX"); + String endTime = DateUtil.format(endDateTime, "yyyy-MM-dd'T'HH:mm:ss.SSSXXX"); + searchPicturesRequest.setStartTime(startTime); + searchPicturesRequest.setEndTime(endTime); + String body = JSONObject.toJSONString(searchPicturesRequest); + String resultStr = HikUtil.hikApi(HikUri.SEARCH_PICTURES, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (!"0".equals(resultJson.get("code"))) { + log.error("请求海康,以图搜图失败,海康response:{}", resultStr); + return ResponseData.error("以图搜图失败"); + } + return ResponseData.success(resultJson); + } + + + /** + * 海康事件取消订阅 + */ + @PostMapping("/hik/event/cancel") + @ResponseBody + public Object eventCancelSubscribe(@RequestBody CancelSubscribeRequest cancelSubscribeRequest) { + String body = JSONObject.toJSONString(cancelSubscribeRequest); + String resultStr = HikUtil.hikApi(HikUri.EVENT_CANCEL, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (!"0".equals(resultJson.get("code"))) { + log.error("请求海康,取消订阅失败,海康response:{}", resultStr); + return ResponseData.error("取消订阅失败"); + } + return ResponseData.success(resultJson); + } + + /** * 单个添加海康人脸分组 * api->hik单个添加人脸分组api->response->mysql */ - @PostMapping("/faceGroup/single/add") + @PostMapping("/hik/faceGroup/single/add") @ResponseBody public Object faceGroupAddition(@RequestBody FaceGroupAdditionRequest faceGroupAdditionRequest) { String body = JSONObject.toJSONString(faceGroupAdditionRequest); @@ -212,7 +282,7 @@ * 批量添加海康组织 * api->hik批量添加组织api->response */ - @PostMapping("/org/batch/add") + @PostMapping("/hik/org/batch/add") @ResponseBody public Object orgBatchAdd(@RequestBody List orgBatchAddRequest) { String body = JSONObject.toJSONString(orgBatchAddRequest); @@ -232,4 +302,62 @@ return ResponseData.error("批量添加组织失败"); } + /** + * 获取人员列表 + */ + @PostMapping("/hik/person/personList") + @ResponseBody + public Object personList() { + PersonListRequest request = new PersonListRequest(); + request.setPageNo(1); + request.setPageSize(100); + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi("/api/resource/v2/person/personList", body); + return resultStr; + } + + /** + * 获取组织列表 + */ + @PostMapping("/hik/org/orgList") + @ResponseBody + public Object orgList() { + PersonListRequest request = new PersonListRequest(); + request.setPageNo(1); + request.setPageSize(100); + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi("/api/resource/v1/org/orgList", body); + return resultStr; + } + + /** + * 查询访客权限下载记录 + */ + @PostMapping("/hik/auth/result") + @ResponseBody + public Object authResult() { + PersonListRequest request = new PersonListRequest(); + request.setPageNo(1); + request.setPageSize(100); + request.setOrderId("ba101db6246711edaea66f7939a13638"); + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi("/api/visitor/v1/auth/result", body); + return resultStr; + } + + /** + * 人脸图片获取 + */ + @PostMapping("/hik/face/picture") + @ResponseBody + public Object facePicture() { + FaceRequest request = new FaceRequest(); +// List list = new ArrayList<>(); +// list.add(""); + request.setCertificateNum("wanggong"); + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi("/api/frs/v1/face", body); + return resultStr; + } + } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/AssetInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/AssetInfoMapper.java index 4f64e83..c0684ee 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/AssetInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/AssetInfoMapper.java @@ -17,6 +17,6 @@ @Mapper public interface AssetInfoMapper extends BaseMapper { - List getAssetInfoListPage(@Param("page") Page page, AssetInfoRequest assetInfoRequest); + List getAssetInfoListPage(@Param("page") Page page, @Param("assetInfoRequest") AssetInfoRequest assetInfoRequest); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/AttendanceInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/AttendanceInfoMapper.java index f9e793e..ec87e46 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/AttendanceInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/AttendanceInfoMapper.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.statistics.AttendanceNumberDTO; import com.casic.missiles.modular.dto.statistics.AttendanceRatioDTO; import com.casic.missiles.modular.model.AttendanceInfo; import org.apache.ibatis.annotations.Mapper; @@ -17,7 +18,7 @@ */ @Mapper public interface AttendanceInfoMapper extends BaseMapper { - List getAttendanceInfoListPage(@Param("page") Page page, StaffInfoRequest attendanceInfoRequest); + List getAttendanceInfoListPage(@Param("page") Page page, @Param("attendanceInfoRequest") StaffInfoRequest attendanceInfoRequest); AttendanceInfo selectByCodeAndDate(@Param("staffCode") String staffCode); @@ -26,4 +27,8 @@ List getCountByTypeAndDateForMonth(@Param("staffType")String staffType); List getCountByTypeAndDateForYear(@Param("staffType")String staffType); + + List getCountForWeek(); + + List getCountForDay(); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java index ce94b8f..6137a7d 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java @@ -17,5 +17,5 @@ @Mapper public interface BlackInfoMapper extends BaseMapper { - List getBlackInfoListPage(@Param("page") Page page, BlackInfoRequest blackInfoRequest); + List getBlackInfoListPage(@Param("page") Page page, @Param("blackInfoRequest") BlackInfoRequest blackInfoRequest); } 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 efda6b3..50aaa6f 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 @@ -20,7 +20,7 @@ List getCaseInfoListPage(@Param("page") Page page, @Param("caseInfoRequest") CaseInfoRequest caseInfoRequest); - int updateStatusById(CaseInfoRequest caseInfoRequest); + int updateStatusById(@Param("caseInfoRequest") CaseInfoRequest caseInfoRequest); List selectByLevelAndMonth(@Param("year") String year); @@ -47,4 +47,20 @@ List selectPreWeekCountByThirtyDay(); List selectPreDayCountBySevenDay(); + + Integer selectDemobilizedCount(@Param("eventType") Number personnelDemobilizedEvent); + + List selectPreMonthCount(); + + List selectListBySevenDay(); + + List selectListByToday(); + + List selectListByToday2(); + + List selectListByToday3(); + + List selectListByType(@Param("eventType") Number eventType); + + List selectDemobilizedCountByHour(@Param("eventType") Number eventType); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/CategoryLevelMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/CategoryLevelMapper.java index 52fc714..afe1650 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/CategoryLevelMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/CategoryLevelMapper.java @@ -17,9 +17,9 @@ @Mapper public interface CategoryLevelMapper extends BaseMapper { - List getCaseCategoryLevelListPage(@Param("page") Page page, CategoryLevelRequest categoryLevelRequest); + List getCaseCategoryLevelListPage(@Param("page") Page page, @Param("categoryLevelRequest") CategoryLevelRequest categoryLevelRequest); - List getCaseCategoryLevelList(CategoryLevelRequest categoryLevelRequest); + List getCaseCategoryLevelList(@Param("categoryLevelRequest") CategoryLevelRequest categoryLevelRequest); CaseCategoryLevel getCaseCategoryLevel(@Param("categoryLevelCode") String categoryLevelCode); 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 66353b1..2555a09 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 @@ -19,7 +19,7 @@ @Mapper public interface DeviceInfoMapper extends BaseMapper { - List getDeviceInfoListPage(@Param("page") Page page, DeviceInfoRequest deviceInfoRequest); + List getDeviceInfoListPage(@Param("page") Page page, @Param("deviceInfoRequest") DeviceInfoRequest deviceInfoRequest); List getDeviceInfoList(@Param("deviceInfoRequest") DeviceInfoRequest deviceInfoRequest); @@ -27,6 +27,8 @@ DeviceInfo getByIndexCode(@Param("srcIndex") String srcIndex); + DeviceInfo getByIp(@Param("ip") String ip); + List selectIndexCodesByCodes(@Param("deviceCodes") List deviceCodes); List selectByType(@Param("devType") String devType); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java index 41dd0af..5bfaf63 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java @@ -5,6 +5,7 @@ import com.casic.missiles.modular.dto.DeviceRepairRequest; import com.casic.missiles.modular.model.DeviceRepairLog; import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; import java.util.List; @@ -16,7 +17,7 @@ @Mapper public interface DeviceRepairLogMapper extends BaseMapper { - List getDeviceRepairListPage(Page page, DeviceRepairRequest deviceRepairRequest); + List getDeviceRepairListPage(@Param("page") Page page, @Param("deviceRepairRequest")DeviceRepairRequest deviceRepairRequest); - List getDeviceRepairList(DeviceRepairRequest deviceRepairRequest); + List getDeviceRepairList(@Param("deviceRepairRequest") DeviceRepairRequest deviceRepairRequest); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java index 9035c47..4823ac1 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java @@ -18,7 +18,7 @@ @Mapper public interface FireEquipInfoMapper extends BaseMapper { - List getFireEquipInfoListPage(@Param("page") Page page, FireEquipRequest fireEquipRequest); + List getFireEquipInfoListPage(@Param("page") Page page, @Param("fireEquipRequest") FireEquipRequest fireEquipRequest); FireEquipInfo getFireEquipInfo(@Param("equipCode") String equipCode); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/GateGroupMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/GateGroupMapper.java index d8c330d..977a427 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/GateGroupMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/GateGroupMapper.java @@ -17,7 +17,7 @@ */ @Mapper public interface GateGroupMapper extends BaseMapper { - List getGateGroupListPage(@Param("page") Page page, GateGroupRequest gateGroupRequest); + List getGateGroupListPage(@Param("page") Page page, @Param("gateGroupRequest") GateGroupRequest gateGroupRequest); GateGroup getGateGroupByName(@Param("groupName") String groupName); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/HazardLevelMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/HazardLevelMapper.java index 8957780..dcf47bb 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/HazardLevelMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/HazardLevelMapper.java @@ -17,11 +17,13 @@ @Mapper public interface HazardLevelMapper extends BaseMapper { - List getCaseHazardLevelListPage(@Param("page") Page page, HazardLevelRequest hazardLevelRequest); + List getCaseHazardLevelListPage(@Param("page") Page page, @Param("hazardLevelRequest") HazardLevelRequest hazardLevelRequest); - List getCaseHazardLevelList(HazardLevelRequest hazardLevelRequest); + List getCaseHazardLevelList(@Param("hazardLevelRequest") HazardLevelRequest hazardLevelRequest); CaseHazardLevel getCaseHazardLevel(@Param("hazardLevelCode") String hazardLevelCode); List selectHazardName(); + + String selectHazardNameByCode(@Param("hazardLevelCode") String hazardLevelCode); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/HikCaseDefineMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/HikCaseDefineMapper.java index 0dc47d1..f162fef 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/HikCaseDefineMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/HikCaseDefineMapper.java @@ -12,5 +12,5 @@ */ @Mapper public interface HikCaseDefineMapper extends BaseMapper { - HikCaseDefine getHikCaseDefine(@Param("caseTypeCode") Long caseTypeCode); + HikCaseDefine getHikCaseDefine(@Param("caseTypeCode") Number caseTypeCode); } 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 f8a674c..fe5afc2 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 @@ -17,11 +17,13 @@ @Mapper public interface StaffInfoMapper extends BaseMapper { - List getStaffInfoListPage(@Param("page") Page page, StaffInfoRequest staffInfoRequest); + List getStaffInfoListPage(@Param("page") Page page, @Param("staffInfoRequest") StaffInfoRequest staffInfoRequest); StaffInfo selectByCode(@Param("staffCode") String staffCode); - List getStaffInfoList(StaffInfoRequest staffInfoRequest); + List getStaffInfoList(@Param("staffInfoRequest") StaffInfoRequest staffInfoRequest); - List selectBatchCodes(List list); + List selectBatchCodes(@Param("list") List list); + + int updateByCodeForCard(@Param("staffCode") String staffCode, @Param("cardNo") String cardNo); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitInfoMapper.java index b1217c5..6c52542 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitInfoMapper.java @@ -16,7 +16,7 @@ */ @Mapper public interface VisitInfoMapper extends BaseMapper { - List getVisitInfoListPage(@Param("page") Page page, VisitorRequest visitorRequest); + List getVisitInfoListPage(@Param("page") Page page, @Param("visitorRequest") VisitorRequest visitorRequest); VisitInfo selectByOrderId(@Param("orderId") String orderId); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitorApplyMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitorApplyMapper.java index c09f3c0..6ea55bd 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitorApplyMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitorApplyMapper.java @@ -18,7 +18,7 @@ @Mapper public interface VisitorApplyMapper extends BaseMapper { - List getVisitorApplyListPage(@Param("page") Page page, VisitorApplyRequest visitorApplyRequest); + List getVisitorApplyListPage(@Param("page") Page page, @Param("visitorApplyRequest") VisitorApplyRequest visitorApplyRequest); List selectByVisitReason(); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/AttendanceInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/AttendanceInfoMapper.xml index b2ece71..f8bdd6e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/AttendanceInfoMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/AttendanceInfoMapper.xml @@ -43,7 +43,8 @@ and staff_type = #{staffType} - and YEARWEEK(date_format(atte_date, '%Y-%m-%d'), 1) = YEARWEEK(now(),1); + AND DATE_SUB(CURDATE(), INTERVAL 7 DAY) <= DATE(atte_date) + GROUP BY DATE_FORMAT(atte_date, '%Y-%m-%d') @@ -69,4 +70,20 @@ GROUP BY DATE_FORMAT(atte_date, '%Y-%m') + + + \ No newline at end of file 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 2b6953f..06ec0a8 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 @@ -28,7 +28,9 @@ @@ -87,7 +89,8 @@ SELECT hazard_level_code as levelCode, count(id) as quantity FROM bus_case_info WHERE hazard_level_code is not null - AND DATE_SUB(CURDATE(), INTERVAL 7 DAY) <= date(happen_time); + AND is_key_area = 1 + AND DATE_SUB(CURDATE(), INTERVAL 7 DAY) <= date(happen_time) GROUP BY hazard_level_code @@ -95,7 +98,8 @@ SELECT hazard_level_code as levelCode, count(id) as quantity FROM bus_case_info WHERE hazard_level_code is not null - AND DATE_SUB(CURDATE(), INTERVAL 30 DAY) <= date(happen_time); + AND is_key_area = 1 + AND DATE_SUB(CURDATE(), INTERVAL 30 DAY) <= date(happen_time) GROUP BY hazard_level_code @@ -122,4 +126,71 @@ AND hazard_level_code is not null GROUP BY DATE_FORMAT(happen_time,'%Y-%m-%d') + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/CategoryLevelMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/CategoryLevelMapper.xml index 4670b1f..1d25cbd 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/CategoryLevelMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/CategoryLevelMapper.xml @@ -20,11 +20,11 @@ SELECT * FROM bus_case_category_level WHERE 1=1 - - and code = #{code} + + and code = #{categoryLevelRequest.code} - - and name = #{name} + + and name = #{categoryLevelRequest.name} ORDER by create_time DESC 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 9b66fd8..bfd84b7 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 @@ -98,4 +98,10 @@ #{item} + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceRepairLogMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceRepairLogMapper.xml index 078ed3c..cf1a481 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceRepairLogMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceRepairLogMapper.xml @@ -22,14 +22,14 @@ SELECT * FROM bus_device_repair_log WHERE 1=1 - - and device_code = #{devCode} + + and device_code = #{deviceRepairRequest.devCode} - - and device_name = #{devName} + + and device_name = #{deviceRepairRequest.devName} - - and DATE_FORMAT(create_time,"%y%m%d") = DATE_FORMAT(#{createTime},"%y%m%d") + + and DATE_FORMAT(create_time,"%y%m%d") = DATE_FORMAT(#{deviceRepairRequest.createTime},"%y%m%d") ORDER by create_time DESC diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/HazardLevelMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/HazardLevelMapper.xml index f16f2b9..458322b 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/HazardLevelMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/HazardLevelMapper.xml @@ -20,11 +20,11 @@ SELECT * FROM bus_case_hazard_level WHERE 1=1 - - and code = #{code} + + and code = #{hazardLevelRequest.code} - - and name = #{name} + + and name = #{hazardLevelRequest.name} ORDER by create_time DESC @@ -42,4 +42,10 @@ SELECT name FROM bus_case_hazard_level + + \ 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 557237e..b6a183a 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 @@ -50,4 +50,10 @@ + + + UPDATE bus_staff_info + SET card_no = #{cardNo} + WHERE staff_code = #{staffCode} + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitInfoMapper.xml index 84aa84f..230529a 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitInfoMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitInfoMapper.xml @@ -27,5 +27,6 @@ SELECT * FROM bus_visit_info WHERE order_id = #{orderId} and DATE_FORMAT(in_time,'%Y-%m-%d') = CURRENT_DATE + limit 1 \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/BlackPictureRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/BlackPictureRequest.java new file mode 100644 index 0000000..fc92701 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/BlackPictureRequest.java @@ -0,0 +1,14 @@ +package com.casic.missiles.modular.dto; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/29 19:26 + */ +@Data +public class BlackPictureRequest { + private String picUri; + private String serverIndexCode; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/CancelSubscribeRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/CancelSubscribeRequest.java new file mode 100644 index 0000000..e2d390a --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/CancelSubscribeRequest.java @@ -0,0 +1,15 @@ +package com.casic.missiles.modular.dto.hik; + +import lombok.Data; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/24 15:14 + */ +@Data +public class CancelSubscribeRequest { + private List eventTypes; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/CardInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/CardInfo.java new file mode 100644 index 0000000..341457d --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/CardInfo.java @@ -0,0 +1,24 @@ +package com.casic.missiles.modular.dto.hik; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/26 16:08 + */ +@Data +public class CardInfo { + //卡号,8~20个字符,支持数字和大写字母 + private String cardNo; + //人员ID,员工工号 + private String personId; + //人员所属组织IndexCode + private String orgIndexCode; + //卡片类型,默认是1:IC卡 + //1:IC卡 + //2:CPU卡 + //3:远距离卡 + //4:MIFARE卡 + private Number cardType; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/FaceRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/FaceRequest.java new file mode 100644 index 0000000..edc04bf --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/FaceRequest.java @@ -0,0 +1,16 @@ +package com.casic.missiles.modular.dto.hik; + +import lombok.Data; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/25 16:53 + */ +@Data +public class FaceRequest { + private String certificateNum; + private List indexCodes; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/HikRecvEvent.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/HikRecvEvent.java index a3e9845..1b2b2b1 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/HikRecvEvent.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/HikRecvEvent.java @@ -28,12 +28,12 @@ /** * 事件类型,用于判断所需接收到的事件类型 */ - public Long getEventType(){ + public Number getEventType(){ JSONObject jsonObject = (JSONObject)JSONObject.toJSON(params); //事件类别对应SecurityEventTypeEnum JSONArray eventTypeArray = (JSONArray)jsonObject.get("events"); JSONObject eventJsonObject = (JSONObject)JSONObject.toJSON(eventTypeArray.get(0)); - Long eventType = (Long) eventJsonObject.get("eventType"); + Number eventType = (Number) eventJsonObject.get("eventType"); return eventType; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonBatchDeleteRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonBatchDeleteRequest.java index 027d31d..9751929 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonBatchDeleteRequest.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonBatchDeleteRequest.java @@ -12,4 +12,6 @@ @Data public class PersonBatchDeleteRequest { private List personIds; + //删除人脸接口使用 + private String faceId; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonInfoRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonInfoRequest.java new file mode 100644 index 0000000..05dc9e1 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonInfoRequest.java @@ -0,0 +1,20 @@ +package com.casic.missiles.modular.dto.hik; + +import lombok.Data; + +import java.util.List; + +/** + * @Description: 获取员工照片请求实体 + * @Author: wangpeng + * @Date: 2022/8/25 16:53 + */ +@Data +public class PersonInfoRequest { + //获取员工详细信息使用 + private String paramName; + private List paramValue; + //获取照片使用 + private String picUri; + private String serverIndexCode; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonListRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonListRequest.java new file mode 100644 index 0000000..3f7149b --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonListRequest.java @@ -0,0 +1,16 @@ +package com.casic.missiles.modular.dto.hik; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/25 16:53 + */ +@Data +public class PersonListRequest { + private Number pageNo; + private Number pageSize; + + private String orderId; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/SearchPicturesRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/SearchPicturesRequest.java new file mode 100644 index 0000000..0a95966 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/SearchPicturesRequest.java @@ -0,0 +1,24 @@ +package com.casic.missiles.modular.dto.hik; + +import lombok.Data; + +import java.util.List; + +/** + * @Description: 以图搜图请求 + * @Author: wangpeng + * @Date: 2022/8/29 10:46 + */ +@Data +public class SearchPicturesRequest { + private String facePicBinaryData; + private String facePicUrl; + private List cameraIndexCodes; + private String startTime; + private String endTime; + //指定搜图的最小相似度,最小为1,最大为100 + private String minSimilarity; + private Number age; + //male-男性,female-女性 + private String sex; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/StaffCardRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/StaffCardRequest.java new file mode 100644 index 0000000..4052e6d --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/StaffCardRequest.java @@ -0,0 +1,20 @@ +package com.casic.missiles.modular.dto.hik; + +import lombok.Data; + +import java.util.List; + +/** + * @Description: 人员开卡请求实体 + * @Author: wangpeng + * @Date: 2022/8/26 16:05 + */ +@Data +public class StaffCardRequest { + //卡片开始有效时间,时间格式:yyyy-MM-dd + private String startDate; + //卡片截止有效时间,时间格式:yyyy-MM-dd,不能大于2037年12月31日 + private String endDate; + //cardList,待开卡列表,最大支持50张卡 + private List cardList; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/VisitorInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/VisitorInfo.java index 73aa316..b99f301 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/VisitorInfo.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/VisitorInfo.java @@ -14,7 +14,7 @@ //访客性别 //1: 男 //2: 女 - private String gender; + private Integer gender; //联系电话建议填写手机号码 private String phoneNo; //证件类型 diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/BlackListController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/BlackListController.java index a27f9f8..0c06661 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/BlackListController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/BlackListController.java @@ -1,13 +1,18 @@ package com.casic.missiles.modular.controller; +import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.base.controller.ExportController; import com.casic.missiles.core.page.PageFactory; import com.casic.missiles.model.response.ResponseData; import com.casic.missiles.modular.dto.BlackInfoRequest; +import com.casic.missiles.modular.dto.BlackPictureRequest; +import com.casic.missiles.modular.dto.hik.PersonInfoRequest; +import com.casic.missiles.modular.enums.HikUri; import com.casic.missiles.modular.enums.OperateTypeEnum; import com.casic.missiles.modular.model.BlackInfo; import com.casic.missiles.modular.service.BlackInfoService; +import com.casic.missiles.modular.util.HikUtil; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; @@ -56,4 +61,22 @@ return null; } + /** + * 黑名单人员照片 + */ + @PostMapping("/personPicture") + @ResponseBody + public Object personPicture(@RequestBody BlackPictureRequest blackPictureRequest){ + //获取照片 + String picUri = blackPictureRequest.getPicUri(); + String serverIndexCode = blackPictureRequest.getServerIndexCode(); + PersonInfoRequest picRequest = new PersonInfoRequest(); + picRequest.setPicUri(picUri); + picRequest.setServerIndexCode(serverIndexCode); + String reBody = JSONObject.toJSONString(picRequest); + //重定向地址获取 + String url = HikUtil.hikApiFor302(HikUri.PERSON_PICTURE, reBody); + return ResponseData.success(url); + } + } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/DeviceController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/DeviceController.java index e1c4eba..666bbee 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/DeviceController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/DeviceController.java @@ -107,7 +107,7 @@ } /** - * 设备维修管理查询(分页),需计算MTTR=总维修时间/故障次数 + * 设备状态计算与评判/设备维修管理查询(分页),需计算MTTR=总维修时间/故障次数 */ @PostMapping("/repair/listPage") @ResponseBody @@ -211,7 +211,7 @@ //需根据设备编号获取到对应的门禁点唯一标识 doorControlRequest.setDoorIndexCodes(indexCodes); doorControlRequest.setControlType(Integer.valueOf(gateGroupDTO.getStatus())); - String body = JSONObject.toJSONString(deviceCodes); + String body = JSONObject.toJSONString(doorControlRequest); String resultStr = HikUtil.hikApi(HikUri.DOOR_CONTROL, body); JSONObject resultJson = (JSONObject)JSONObject.parse(resultStr); if (!"0".equals(resultJson.get("code"))) { diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/StaffController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/StaffController.java index b58ccab..704093c 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/StaffController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/StaffController.java @@ -2,15 +2,21 @@ import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.util.StrUtil; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.base.controller.ExportController; import com.casic.missiles.core.page.PageFactory; import com.casic.missiles.model.response.ErrorResponseData; import com.casic.missiles.model.response.ResponseData; import com.casic.missiles.modular.dto.StaffInfoRequest; +import com.casic.missiles.modular.dto.hik.PersonInfoRequest; +import com.casic.missiles.modular.dto.hik.StaffCardRequest; +import com.casic.missiles.modular.enums.HikUri; import com.casic.missiles.modular.enums.OperateTypeEnum; import com.casic.missiles.modular.model.StaffInfo; import com.casic.missiles.modular.service.StaffInfoService; +import com.casic.missiles.modular.util.HikUtil; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; @@ -110,4 +116,60 @@ } return ResponseData.success(); } + + /** + * 批量开卡,添加人员之后调用,若在一个接口中添加人员成功开卡失败则第二次添加时会有问题 + */ + @PostMapping("/cardBinding") + @ResponseBody + public Object cardBinding(@RequestBody StaffCardRequest staffCardRequest) { + String body = JSONObject.toJSONString(staffCardRequest); + String resultStr = HikUtil.hikApi(HikUri.CARD_BINDING, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (!"0".equals(resultJson.get("code"))) { + log.error("请求海康,批量开卡失败,海康response:{}", resultStr); + return ResponseData.error("批量开卡失败"); + } + //保存卡号 + if(staffInfoService.saveCardInfo(staffCardRequest) > 0){ + return ResponseData.success(); + } + return ResponseData.error("批量开卡失败"); + } + + /** + * 获取员工照片,海康存储 + */ + @PostMapping("/personPicture/{staffCode}") + @ResponseBody + public Object personPicture(@PathVariable("staffCode") String staffCode){ + //获取员工详细信息,含图片服务器、uri + PersonInfoRequest request = new PersonInfoRequest(); + List list = new ArrayList<>(); + list.add(staffCode); + request.setParamName("personId"); + request.setParamValue(list); + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi(HikUri.PERSON_INFO, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (!"0".equals(resultJson.get("code"))) { + log.error("请求海康,根据人员唯一字段获取人员详细信息失败,海康response:{}", resultStr); + return ResponseData.error("获取员工照片失败"); + } + //获取照片 + JSONObject data = (JSONObject) resultJson.get("data"); + JSONArray dataArray = (JSONArray) data.get("list"); + JSONObject jsonObject = (JSONObject) dataArray.get(0); + JSONArray personPhoto = (JSONArray) jsonObject.get("personPhoto"); + JSONObject photo = (JSONObject) personPhoto.get(0); + String picUri = photo.getString("picUri"); + String serverIndexCode = photo.getString("serverIndexCode"); + PersonInfoRequest picRequest = new PersonInfoRequest(); + picRequest.setPicUri(picUri); + picRequest.setServerIndexCode(serverIndexCode); + String reBody = JSONObject.toJSONString(picRequest); + //重定向地址获取 + String url = HikUtil.hikApiFor302(HikUri.PERSON_PICTURE, reBody); + return ResponseData.success(url); + } } 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 4a07dd9..7b1dcf6 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 @@ -16,6 +16,7 @@ import com.casic.missiles.modular.redis.key.CacheKeys; import com.casic.missiles.modular.service.CockpitService; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.util.CollectionUtils; import org.springframework.web.bind.annotation.*; @@ -24,10 +25,7 @@ import java.text.NumberFormat; import java.time.LocalDateTime; import java.time.temporal.ChronoUnit; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.util.*; import java.util.stream.Collectors; /** @@ -73,6 +71,9 @@ private StatisticNumberMapper numberMapper; @Autowired + private HazardLevelMapper hazardLevelMapper; + + @Autowired private AccessGroupConfig accessGroupConfig; /** @@ -104,8 +105,24 @@ public Object buildingNumberPerHour(){ //当天按小时分组的人数 List list = numberMapper.selectListByTime(); - Map> collect = list.stream().collect(Collectors.groupingBy(BuildingNumberDTO::getStatisticPosition)); - return ResponseData.success(collect); + Map> collect = list.stream().collect(Collectors.groupingBy(BuildingNumberDTO::getStatisticTime)); + //定时任务中已将每小时三栋楼人数存到数据库 + //将一期主楼和录制楼人数合并,二期单算 + List> resultList = new ArrayList<>(); + collect.keySet().forEach(key -> { + List buildingNumberDTOS = collect.get(key); + BuildingNumberDTO mainBuildingOne = buildingNumberDTOS.get(0); + BuildingNumberDTO mainBuildingTwo = buildingNumberDTOS.get(1); + BuildingNumberDTO recordingBuilding = buildingNumberDTOS.get(2); + HashMap resultMap = new HashMap<>(); + Integer oneQuantity = Integer.valueOf(mainBuildingOne.getStatisticQuantity()); + Integer recordingQuantity = Integer.valueOf(recordingBuilding.getStatisticQuantity()); + resultMap.put("staticTime", mainBuildingOne.getStatisticTime()); + resultMap.put(mainBuildingOne.getStatisticPositionName()+"、"+recordingBuilding.getStatisticPositionName(), String.valueOf(oneQuantity+recordingQuantity)); + resultMap.put(mainBuildingTwo.getStatisticPositionName(), mainBuildingTwo.getStatisticQuantity()); + resultList.add(resultMap); + }); + return ResponseData.success(resultList); } /** @@ -151,12 +168,11 @@ public Object securityNumber() { QueryWrapper wrapper = new QueryWrapper<>(); wrapper.eq("staff_type", 2); + // TODO: 2022/9/2 后续使用产品确定的每天出勤的安保人员的数量 Integer total = staffInfoMapper.selectCount(wrapper); - //当日离岗事件个数 - QueryWrapper wrapper1 = new QueryWrapper<>(); - wrapper1.eq("hik_event_type", SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); - wrapper1.apply("date_format(now(),'%Y-%m-%d') = date_format(happen_time,'%Y-%m-%d')"); - Integer leave = caseInfoMapper.selectCount(wrapper1); + //当日离岗事件按设备去重后的个数 + // TODO: 2022/9/2 目前相当于24小时内的计算,之后看需要可改成自定义小时数计算离岗率,即离岗+6小时内仅一次离岗则恢复为100%,多次则累加离岗次数计算离岗率 + Integer leave = caseInfoMapper.selectDemobilizedCount(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); NumberFormat numberFormat = NumberFormat.getInstance(); // 设置精确到小数点后2位 numberFormat.setMaximumFractionDigits(2); @@ -179,7 +195,6 @@ @ResponseBody public Object visitorApplyDetail() { List reasonGroup = applyMapper.selectByVisitReason(); - HashMap resultMap = new HashMap<>(); NumberFormat numberFormat = NumberFormat.getInstance(); // 设置精确到小数点后2位 numberFormat.setMaximumFractionDigits(2); @@ -187,12 +202,17 @@ if(0 == sum){ return ResponseData.success(); } + List resultList = new ArrayList<>(); reasonGroup.forEach(group -> { String reasonName = dictService.getDictNameByCode(SecurityEventDict.VISIT_REASON, group.getVisitReason()); String result = numberFormat.format((float) group.getQuantity() / (float) sum * 100); - resultMap.put(reasonName, result+"%"); + ApplyReasonGroupDTO applyReasonGroupDTO = new ApplyReasonGroupDTO(); + applyReasonGroupDTO.setQuantity(group.getQuantity()); + applyReasonGroupDTO.setVisitReason(reasonName); + applyReasonGroupDTO.setRatio(result+"%"); + resultList.add(applyReasonGroupDTO); }); - return ResponseData.success(resultMap); + return ResponseData.success(resultList); } /** @@ -247,6 +267,32 @@ } /** + * 机动力量实时在岗率,在岗人数除以总应在岗人数,用离岗+6小时内恢复为100%,6小时外再计算 + */ + @GetMapping("/staff/beOnDutyRatio") + @ResponseBody + public Object beOnDutyRatio() { + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("staff_type", 2); + // TODO: 2022/9/2 后续使用产品确定的每天出勤的安保人员的数量 + Integer total = staffInfoMapper.selectCount(wrapper); + if(0 == total){ + return ResponseData.success(null); + } + //当日离岗事件按设备去重后的个数 + // TODO: 2022/9/2 目前相当于24小时内的计算,之后看需要可改成自定义小时数计算离岗率,即离岗+6小时内仅一次离岗则恢复为100%,多次则累加离岗次数计算离岗率 + List onDutyRatioDTOS = caseInfoMapper.selectDemobilizedCountByHour(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); + onDutyRatioDTOS.forEach(dto -> { + NumberFormat numberFormat = NumberFormat.getInstance(); + // 设置精确到小数点后2位 + numberFormat.setMaximumFractionDigits(2); + String result = numberFormat.format(100 - Float.valueOf(dto.getQuantity()) / (float) total * 100); + dto.setRatio(result+"%"); + }); + return ResponseData.success(onDutyRatioDTOS); + } + + /** * 闸机速通门统计-设备状态分组计算数量,devType传闸机字典key * 视频频监控摄像机统计-设备状态分组计算数量,devType传摄像头字典key */ @@ -262,12 +308,17 @@ if(sum <= 0){ return ResponseData.error("无该类设备信息"); } + List resultList = new ArrayList<>(); gateStatusGroup.forEach(group -> { String devStatus = dictService.getDictNameByCode(SecurityEventDict.DEVICE_STATUS, group.getStatus()); String result = numberFormat.format((float) group.getQuantity() / (float) sum * 100); - resultMap.put(devStatus, result+"%"); + GateStatusGroupResponse gateStatusGroupResponse = new GateStatusGroupResponse(); + gateStatusGroupResponse.setStatus(devStatus); + gateStatusGroupResponse.setRatio(result+"%"); + resultList.add(gateStatusGroupResponse); }); - resultMap.put("总", sum); + resultMap.put("total", sum); + resultMap.put("list", resultList); return ResponseData.success(resultMap); } @@ -282,17 +333,38 @@ String position = securityScoreDTO.getPosition(); List caseInfos = caseInfoMapper.selectByPosition(position); //查询各危险级别权重、各类别权重,放入map,避免循环中多次查数据库 - + HashMap hazardScoreMap = new HashMap<>(); + List caseHazardLevelList = hazardLevelMapper.getCaseHazardLevelList(null); + caseHazardLevelList.forEach(hazardLevel -> { + hazardScoreMap.put(hazardLevel.getCode(), hazardLevel.getWeight()); + }); + HashMap categoryScoreMap = new HashMap<>(); + List categoryLevelList = categoryLevelMapper.getCaseCategoryLevelList(null); + categoryLevelList.forEach(categoryLevel -> { + categoryScoreMap.put(categoryLevel.getCode(), categoryLevel.getWeight()); + }); + //事件按楼层分组,计算 List securityScoreDTOs = new ArrayList<>(); caseInfos.forEach(caseInfo -> { SecurityScoreDTO securityScoreDTO1 = new SecurityScoreDTO(); + securityScoreDTO1.setPosition(caseInfo.getPosition()); securityScoreDTO1.setArea(caseInfo.getArea()); - // TODO: 2022/8/4 楼层评分计算根据产品定义调整 -// caseInfo.get -// securityScoreDTO1.setScore(); + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); + Double score = 100 - Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + securityScoreDTO1.setScore(score); + securityScoreDTOs.add(securityScoreDTO1); }); - - return null; + 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); + }); + return ResponseData.success(securityScoreDTOs); } /** @@ -303,9 +375,13 @@ public Object SecurityFrequency(@RequestBody SecurityFrequencyDTO securityFrequencyDTO) { String year = securityFrequencyDTO.getYear(); String month = securityFrequencyDTO.getMonth(); - Integer quantity = caseInfoMapper.selectCountByMonth(year, month); - securityFrequencyDTO.setQuantity(quantity); - return ResponseData.success(securityFrequencyDTO); + if(!StringUtils.isEmpty(year) && StringUtils.isEmpty(month)){ + Integer quantity = caseInfoMapper.selectCountByMonth(year, month); + securityFrequencyDTO.setQuantity(quantity); + return ResponseData.success(securityFrequencyDTO); + } + List list = caseInfoMapper.selectPreMonthCount(); + return ResponseData.success(list); } } 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 ae4d770..f4f075c 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 @@ -1,20 +1,25 @@ package com.casic.missiles.modular.controller.cockpit; +import cn.hutool.core.date.DateUnit; import cn.hutool.core.date.DateUtil; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.casic.missiles.model.response.ResponseData; -import com.casic.missiles.modular.dao.AttendanceInfoMapper; -import com.casic.missiles.modular.dao.CaseInfoMapper; -import com.casic.missiles.modular.dao.HazardLevelMapper; -import com.casic.missiles.modular.dao.StaffInfoMapper; +import com.casic.missiles.modular.dao.*; +import com.casic.missiles.modular.dto.DeviceRepairLogDTO; +import com.casic.missiles.modular.dto.DeviceRepairRequest; import com.casic.missiles.modular.dto.statistics.*; +import com.casic.missiles.modular.enums.SecurityEventType; +import com.casic.missiles.modular.model.CaseCategoryLevel; import com.casic.missiles.modular.model.CaseHazardLevel; +import com.casic.missiles.modular.model.CaseInfo; import com.casic.missiles.modular.model.StaffInfo; +import com.casic.missiles.modular.service.DeviceInfoService; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.util.CollectionUtils; import org.springframework.web.bind.annotation.*; +import java.math.BigDecimal; import java.text.NumberFormat; import java.util.*; import java.util.stream.Collectors; @@ -40,6 +45,12 @@ @Autowired private HazardLevelMapper hazardLevelMapper; + @Autowired + private CategoryLevelMapper categoryLevelMapper; + + @Autowired + private DeviceInfoService deviceInfoService; + /** * 安防事件时域频次统计,每月的每天安防事件个数(原方案) * 月维度:展示每个月的每天的数据 @@ -89,15 +100,17 @@ List monthList = caseInfoMapper.selectPreMonthCountByYear(year); Map> collect = monthList.stream().collect(Collectors.groupingBy(PreMonthOrWeekCaseDTO::getHazardLevelCode)); HashMap strAvgMap = new HashMap<>(); + List resultList = new ArrayList<>(); for (String key : collect.keySet()) { List preMonthOrWeekCaseDTOS = collect.get(key); int sum = preMonthOrWeekCaseDTOS.stream().mapToInt(PreMonthOrWeekCaseDTO::getQuantity).sum(); //若年份是本年,则使用个安防级别数量/当前月份数 //若不是本年,除数为12 MonthAndWeekDTO monthAndWeekDTO = new MonthAndWeekDTO(); + String hazardName = hazardLevelMapper.selectHazardNameByCode(key); + monthAndWeekDTO.setLevelName(hazardName); if(year.equals(String.valueOf(DateUtil.thisYear()))){ monthAndWeekDTO.setMonthQuantity(sum / DateUtil.thisMonth()); -// monthAndWeekDTO.setLevelName(); strAvgMap.put(key, monthAndWeekDTO); }else{ monthAndWeekDTO.setMonthQuantity(sum / 12); @@ -113,27 +126,37 @@ if(year.equals(String.valueOf(DateUtil.thisYear()))){ if(!Objects.isNull(strAvgMap.get(key))){ MonthAndWeekDTO monthAndWeekDTO = strAvgMap.get(key); + String hazardName = hazardLevelMapper.selectHazardNameByCode(key); + monthAndWeekDTO.setLevelName(hazardName); monthAndWeekDTO.setWeekQuantity(sum / DateUtil.thisWeekOfYear()); strAvgMap.put(key, monthAndWeekDTO); }else{ MonthAndWeekDTO monthAndWeekDTO = new MonthAndWeekDTO(); + String hazardName = hazardLevelMapper.selectHazardNameByCode(key); + monthAndWeekDTO.setLevelName(hazardName); monthAndWeekDTO.setWeekQuantity(sum / DateUtil.thisWeekOfYear()); strAvgMap.put(key, monthAndWeekDTO); } }else{ if(!Objects.isNull(strAvgMap.get(key))){ MonthAndWeekDTO monthAndWeekDTO = strAvgMap.get(key); + String hazardName = hazardLevelMapper.selectHazardNameByCode(key); + monthAndWeekDTO.setLevelName(hazardName); monthAndWeekDTO.setWeekQuantity(sum / 52); strAvgMap.put(key, monthAndWeekDTO); }else{ MonthAndWeekDTO monthAndWeekDTO = new MonthAndWeekDTO(); + String hazardName = hazardLevelMapper.selectHazardNameByCode(key); + monthAndWeekDTO.setLevelName(hazardName); monthAndWeekDTO.setWeekQuantity(sum / 52); strAvgMap.put(key, monthAndWeekDTO); } } } - avgMonthAndWeekGroupDTO.setMap(strAvgMap); - return ResponseData.success(avgMonthAndWeekGroupDTO); + strAvgMap.keySet().forEach(key -> { + resultList.add(strAvgMap.get(key)); + }); + return ResponseData.success(resultList); } /** @@ -181,12 +204,178 @@ } /** - * 员工考勤人数变化,功能待定 + * 员工考勤人数变化,统计当天(横坐标为时)及近7天(横坐标为天)的考勤人数变化,只要发生一次考勤识别,次数的基数就正常增加(没有上班下班区分) */ + @PostMapping("/staff/attendanceNumber/{dimension}") + @ResponseBody + public Object attendanceNumber(@PathVariable("dimension") String dimension) { + List attendanceNumberDTOs = null; + List> resultList = new ArrayList<>(); + if("week".equals(dimension)){ + //近7天数据按天分组统计 + attendanceNumberDTOs = attendanceInfoMapper.getCountForWeek(); + }else if("day".equals(dimension)) { + //今天数据按小时分组统计 + attendanceNumberDTOs = attendanceInfoMapper.getCountForDay(); + } + if(CollectionUtils.isEmpty(attendanceNumberDTOs)){ + return ResponseData.error("该查询条件下,无员工出勤数据!"); + } + Map> collect = attendanceNumberDTOs.stream().collect(Collectors.groupingBy(AttendanceNumberDTO::getDate)); + collect.keySet().forEach(key -> { + List attendanceNumberDTOS = collect.get(key); + AttendanceNumberDTO attendanceNumberDTO = attendanceNumberDTOS.get(0); + AttendanceNumberDTO attendanceNumberDTO2 = attendanceNumberDTOS.get(1); + Map resultMap = new HashMap<>(); + resultMap.put(attendanceNumberDTO.getStaffType(), attendanceNumberDTO.getQuantity()); + resultMap.put(attendanceNumberDTO2.getStaffType(), attendanceNumberDTO2.getQuantity()); + resultMap.put("staticTime", attendanceNumberDTO.getDate()); + resultList.add(resultMap); + }); + return ResponseData.success(resultList); + } /** - * 近30天/近一周安保人员到岗排行 + * 早晚高峰区域安防评估 */ + @PostMapping("/security/assessment/{dimension}") + @ResponseBody + public Object securityAssessment(@PathVariable("dimension") String dimension) { + //查询各危险级别权重、各类别权重,放入map,避免循环中多次查数据库 + HashMap hazardScoreMap = new HashMap<>(); + List caseHazardLevelList = hazardLevelMapper.getCaseHazardLevelList(null); + caseHazardLevelList.forEach(hazardLevel -> { + hazardScoreMap.put(hazardLevel.getCode(), hazardLevel.getWeight()); + }); + HashMap categoryScoreMap = new HashMap<>(); + List categoryLevelList = categoryLevelMapper.getCaseCategoryLevelList(null); + categoryLevelList.forEach(categoryLevel -> { + categoryScoreMap.put(categoryLevel.getCode(), categoryLevel.getWeight()); + }); + HashMap hashMap = new HashMap<>(); + if("week".equals(dimension)){ + //近7天早晚高峰数据 + List caseInfos = caseInfoMapper.selectListBySevenDay(); + //按时间(天)进行分组 + caseInfos.forEach(caseInfo -> { + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); + Double score = Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + String[] array = caseInfo.getHappenTime().split(" "); + String dayTime = array[0]; + BigDecimal preScore; + if(hashMap.containsKey(dayTime)){ + Double aDouble = hashMap.get(dayTime); + preScore = new BigDecimal(aDouble.toString()); + + }else{ + preScore = new BigDecimal("100.0"); + } + BigDecimal nowScore = new BigDecimal(score.toString()); + hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); + }); + return ResponseData.success(hashMap); + }else if("day".equals(dimension)) { + //今天数据按小时分组统计 + List caseInfos = caseInfoMapper.selectListByToday(); + caseInfos.forEach(caseInfo -> { + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); + Double score = Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + String[] array = caseInfo.getHappenTime().split(":"); + String dayTime = array[0]; + BigDecimal preScore; + if(hashMap.containsKey(dayTime)){ + Double aDouble = hashMap.get(dayTime); + preScore = new BigDecimal(aDouble.toString()); + + }else{ + preScore = new BigDecimal("100.0"); + } + BigDecimal nowScore = new BigDecimal(score.toString()); + hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); + }); + return ResponseData.success(hashMap); + } + return null; + } + + /** + * 重点区域安防事态评估,统计重点区域6:00-23:00按小时分组数据 + */ + @GetMapping("/security/keyAreaStatistic") + @ResponseBody + public Object keyAreaStatistic() { + //查询各危险级别权重、各类别权重,放入map,避免循环中多次查数据库 + HashMap hazardScoreMap = new HashMap<>(); + List caseHazardLevelList = hazardLevelMapper.getCaseHazardLevelList(null); + caseHazardLevelList.forEach(hazardLevel -> { + hazardScoreMap.put(hazardLevel.getCode(), hazardLevel.getWeight()); + }); + HashMap categoryScoreMap = new HashMap<>(); + List categoryLevelList = categoryLevelMapper.getCaseCategoryLevelList(null); + categoryLevelList.forEach(categoryLevel -> { + categoryScoreMap.put(categoryLevel.getCode(), categoryLevel.getWeight()); + }); + HashMap hashMap = new HashMap<>(); + //今天数据按小时分组统计 + List caseInfos = caseInfoMapper.selectListByToday2(); + caseInfos.forEach(caseInfo -> { + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); + Double score = Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + String[] array = caseInfo.getHappenTime().split(":"); + String dayTime = array[0]; + BigDecimal preScore; + if(hashMap.containsKey(dayTime)){ + Double aDouble = hashMap.get(dayTime); + preScore = new BigDecimal(aDouble.toString()); + + }else{ + preScore = new BigDecimal("100.0"); + } + BigDecimal nowScore = new BigDecimal(score.toString()); + hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); + }); + return ResponseData.success(hashMap); + } + + /** + * 安防机动支援力量调配响应评估,根据事件已解决状态及已解决时间-发送时间,按时间(小时)分组统计 + */ + @GetMapping("/security/responseAssess") + @ResponseBody + public Object responseAssess() { + //查询各危险级别权重、各类别权重,放入map,避免循环中多次查数据库 + HashMap hazardScoreMap = new HashMap<>(); + List caseHazardLevelList = hazardLevelMapper.getCaseHazardLevelList(null); + caseHazardLevelList.forEach(hazardLevel -> { + hazardScoreMap.put(hazardLevel.getCode(), hazardLevel.getWeight()); + }); + HashMap hashMap = new HashMap<>(); + //今天数据按小时分组统计 + List caseInfos = caseInfoMapper.selectListByToday3(); + caseInfos.forEach(caseInfo -> { + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + //扣分=事件级别权重*未解决小时数 + Date updateTime = DateUtil.parse(caseInfo.getUpdateTime()); + Date happenTime = DateUtil.parse(caseInfo.getHappenTime()); + long between = DateUtil.between(updateTime, happenTime, DateUnit.HOUR); + Double score = Double.valueOf(hazardWeight)*between; + String[] array = caseInfo.getHappenTime().split(":"); + String dayTime = array[0]; + BigDecimal preScore; + if(hashMap.containsKey(dayTime)){ + Double aDouble = hashMap.get(dayTime); + preScore = new BigDecimal(aDouble.toString()); + }else{ + preScore = new BigDecimal("100.0"); + } + BigDecimal nowScore = new BigDecimal(score.toString()); + hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); + }); + return ResponseData.success(hashMap); + } /** * 重点区域威胁事件类型统计,优先级2,统计近7天和近30天 @@ -224,7 +413,34 @@ } /** - * 设备状态计算系数和评判,优先级3,需确认设备恢复时间是否可以获取 + * 近30天/近一周安保人员到岗排行 */ + + /** + * 安保等级评估,发生离岗事件减1分 + */ + @GetMapping("/security/levelAssess") + @ResponseBody + public Object securityLevelAssess() { + //今天数据按小时分组统计 + List resultList = caseInfoMapper.selectListByType(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); + resultList.forEach(result -> { + BigDecimal deScore = new BigDecimal(result.getQuantity()); + BigDecimal preScore = new BigDecimal("100.0"); + result.setScore(preScore.subtract(deScore).doubleValue()); + }); + return ResponseData.success(resultList); + } + + /** + * 设备状态计算系数和评判,即设备维修管理查询(不分页) + */ + @PostMapping("/device/repairList") + @ResponseBody + public Object repairList(@RequestBody DeviceRepairRequest deviceRepairRequest) { + List deviceRepairLogDTOS = deviceInfoService.deviceRepairListPage(deviceRepairRequest); + return ResponseData.success(deviceRepairLogDTOS); + } + } 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 fbf8ab6..c71a15a 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 @@ -1,13 +1,12 @@ package com.casic.missiles.modular.controller.hik; +import cn.hutool.core.date.DateTime; +import cn.hutool.core.date.DateUtil; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.casic.missiles.model.response.ResponseData; import com.casic.missiles.modular.dao.HikFaceGroupInfoMapper; -import com.casic.missiles.modular.dto.hik.EventSubscribeRequest; -import com.casic.missiles.modular.dto.hik.FaceGroupAdditionRequest; -import com.casic.missiles.modular.dto.hik.HikRecvEvent; -import com.casic.missiles.modular.dto.hik.OrgBatchAdd; +import com.casic.missiles.modular.dto.hik.*; import com.casic.missiles.modular.enums.HikUri; import com.casic.missiles.modular.enums.SecurityEventType; import com.casic.missiles.modular.model.CaseInfo; @@ -18,16 +17,20 @@ import com.casic.missiles.modular.util.CaseInfoFactoryUtil; import com.casic.missiles.modular.util.HikUtil; import com.casic.missiles.modular.util.ThreadPoolUtil; +import com.casic.missiles.modular.util.WebSocket; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; -import org.springframework.web.bind.annotation.*; +import org.springframework.util.CollectionUtils; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.RestController; -import java.net.InetAddress; -import java.net.UnknownHostException; import java.util.ArrayList; +import java.util.Iterator; import java.util.List; import java.util.Objects; @@ -38,7 +41,6 @@ */ @Slf4j @RestController -@RequestMapping("/hik") public class HikController { @Autowired @@ -53,28 +55,37 @@ @Autowired private HikService hikService; + @Autowired + private HikFaceGroupInfoMapper hikFaceGroupInfoMapper; + + @Autowired + private WebSocket webSocket; + @Value("${server.port}") private int serverPort; - @Autowired - private HikFaceGroupInfoMapper hikFaceGroupInfoMapper; /** * 海康事件订阅 */ - @PostMapping("/event/subscribe") + @PostMapping("/hik/event/subscribe") @ResponseBody - public Object eventSubscribe() throws UnknownHostException { + public Object eventSubscribe() { EventSubscribeRequest eventSubscribeRequest = new EventSubscribeRequest(); ArrayList list = new ArrayList<>(); list.add(SecurityEventType.DEVICE_OFFLINE); + list.add(SecurityEventType.DEVICE_ONLINE); list.add(SecurityEventType.KEY_PERSONNEL_IDENTIFY_EVENT); list.add(SecurityEventType.MONITORING_POINT_OFFLINE); + list.add(SecurityEventType.MONITORING_POINT_ONLINE); list.add(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); list.add(SecurityEventType.PERSONNEL_GATHER_EVENT); - InetAddress localHost = InetAddress.getLocalHost(); + list.add(SecurityEventType.VISITOR_REGISTER); + list.add(SecurityEventType.VISITOR_CHECKOUT); + list.add(SecurityEventType.HIGH_ALTITUDE_PARABOLIC); +// InetAddress localHost = InetAddress.getLocalHost(); eventSubscribeRequest.setEventTypes(list); - eventSubscribeRequest.setEventDest("https://" + localHost + ":" + serverPort + "/eventRcv"); + eventSubscribeRequest.setEventDest("http://" + "192.168.10.6" + ":" + serverPort + "/eventRcv"); //订阅类型,0-订阅原始事件,1-联动事件,2-原始事件和联动事件,不填使用默认值0 eventSubscribeRequest.setSubType(0); /** @@ -92,19 +103,25 @@ } /** + * 查询事件订阅信息 + */ + @PostMapping("/hik/event/query") + @ResponseBody + public Object eventQuery() { + String result = HikUtil.hikApi(HikUri.EVENT_INFO, ""); + return result; + } + + /** * 海康事件接收 */ @PostMapping("/eventRcv") @ResponseBody public Object eventRcv(@RequestBody HikRecvEvent hikRecvEvent) { //1、接收所需事件类型 - Long eventType = hikRecvEvent.getEventType(); + Number eventType = hikRecvEvent.getEventType(); log.info("接收到安防事件类型为:{}", eventType); CaseInfo caseInfo = caseInfoFactoryUtil.getCaseInfo(eventType); - //接收到不关心事件直接返回 - if(Objects.isNull(caseInfo)){ - return ResponseData.success(); - } //2、不同事件不同处理,caseInfoFactoryUtil已设置好事件基础定义信息 // 再为事件添加状态、设备编码、设备名称、位置、区域、时间 // 异步处理事件 @@ -114,19 +131,23 @@ caseHandle(hikRecvEvent, eventType, caseInfo); } })); +// caseHandle(hikRecvEvent, eventType, caseInfo); - return null; + return ResponseData.success(); } - private void caseHandle(HikRecvEvent hikRecvEvent, Long eventType, CaseInfo caseInfo) { + private void caseHandle(HikRecvEvent hikRecvEvent, Number eventType, CaseInfo caseInfo) { JSONArray eventArray = hikRecvEvent.getEventArray(); List caseInfos = new ArrayList<>(); - while (eventArray.stream().iterator().hasNext()) { + Iterator iterator = eventArray.iterator(); + while (iterator.hasNext()) { CaseInfo caseInfo1 = new CaseInfo(); - BeanUtils.copyProperties(caseInfo, caseInfo1); - JSONObject event = (JSONObject) eventArray.stream().iterator().next(); + if(!Objects.isNull(caseInfo)){ + BeanUtils.copyProperties(caseInfo, caseInfo1); + } + JSONObject event = (JSONObject) iterator.next(); //5种事件进行不同处理 - if(SecurityEventType.KEY_PERSONNEL_IDENTIFY_EVENT == eventType){ + if (SecurityEventType.KEY_PERSONNEL_IDENTIFY_EVENT.equals(eventType)) { //判断所属人脸分组 JSONObject data = (JSONObject) event.get("data"); JSONObject faceRecognitionResult = (JSONObject) data.get("faceRecognitionResult"); @@ -142,52 +163,101 @@ if (faceGroupCode.equals(blackListGroup.getFaceGroupCode())) { //黑名单分组处理 caseInfo1 = hikService.blackListHandle(event, caseInfo1); - }else if(faceGroupCode.equals(propertyPersonnelGroup.getFaceGroupCode())){ + } else if (faceGroupCode.equals(propertyPersonnelGroup.getFaceGroupCode())) { //考勤分组处理-物业人员,添加到考勤表 hikService.propertyAttendanceHandle(event); - }else if(faceGroupCode.equals(securityPersonnelGroup.getFaceGroupCode())){ + } else if (faceGroupCode.equals(securityPersonnelGroup.getFaceGroupCode())) { //考勤分组处理-安保人员,添加到考勤表 hikService.securityPersonnelHandle(event); - }else { + } else { return; } - }else if(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT == eventType){ + } else if (SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT.equals(eventType)) { //离岗事件处理 caseInfo1 = hikService.demobilizedHandle(event, caseInfo1); - }else if(SecurityEventType.PERSONNEL_GATHER_EVENT == eventType){ + } else if (SecurityEventType.PERSONNEL_GATHER_EVENT.equals(eventType)) { //人员聚集事件处理 caseInfo1 = hikService.personGatherHandle(event, caseInfo1); - }else if(SecurityEventType.MONITORING_POINT_OFFLINE == eventType){ + } else if (SecurityEventType.MONITORING_POINT_OFFLINE.equals(eventType)) { //监控点离线事件处理 caseInfo1 = hikService.monitorPointOfflineHandle(event, caseInfo1); - }else if(SecurityEventType.DEVICE_OFFLINE == eventType){ + } else if (SecurityEventType.MONITORING_POINT_ONLINE.equals(eventType)) { + //监控点上线事件处理 + hikService.monitorPointOnlineHandle(event); + } else if (SecurityEventType.DEVICE_OFFLINE.equals(eventType)) { //装置离线事件处理 caseInfo1 = hikService.deviceOfflineHandle(event, caseInfo1); - }else if(SecurityEventType.VISITOR_REGISTER == eventType){ + } else if (SecurityEventType.DEVICE_ONLINE.equals(eventType)) { + //装置上线处理 + hikService.deviceOnlineHandle(event); + } else if (SecurityEventType.VISITOR_REGISTER.equals(eventType)) { //记录访客登记记录,添加到访客记录表 hikService.visitorRegisterHandler(event); - }else if(SecurityEventType.VISITOR_CHECKOUT == eventType){ + } else if (SecurityEventType.VISITOR_CHECKOUT.equals(eventType)) { //记录访客签离记录 hikService.visitorCheckOutHandler(event); } - if(!Objects.isNull(caseInfo1) && !StringUtils.isEmpty(caseInfo1.getHappenTime())){ + if (!Objects.isNull(caseInfo1) && !StringUtils.isEmpty(caseInfo1.getHappenTime())) { caseInfos.add(caseInfo1); } } //3、安防事件入库 - if(!caseInfoService.insertCaseInfoBatch(caseInfos)){ - log.error("安防事件批量入库异常"); + if (!CollectionUtils.isEmpty(caseInfos) && !caseInfoService.insertCaseInfoBatch(caseInfos)) { + log.error("安防事件批量入库异常!"); } // TODO: 2022/8/15 webSocket推送 + if (CollectionUtils.isEmpty(caseInfos)) { + log.info("webSocket事件推送"); + webSocket.sendAllMessage(JSONObject.toJSONString(caseInfos)); + } return; } /** + * 以图搜图,前端用于轨迹追踪 + */ + @PostMapping("/hik/search/picture") + @ResponseBody + public Object searchPictures(@RequestBody SearchPicturesRequest searchPicturesRequest) { + DateTime startDateTime = DateUtil.parse(searchPicturesRequest.getStartTime()); + DateTime endDateTime = DateUtil.parse(searchPicturesRequest.getEndTime()); + String startTime = DateUtil.format(startDateTime, "yyyy-MM-dd'T'HH:mm:ss.SSSXXX"); + String endTime = DateUtil.format(endDateTime, "yyyy-MM-dd'T'HH:mm:ss.SSSXXX"); + searchPicturesRequest.setStartTime(startTime); + searchPicturesRequest.setEndTime(endTime); + String body = JSONObject.toJSONString(searchPicturesRequest); + String resultStr = HikUtil.hikApi(HikUri.SEARCH_PICTURES, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (!"0".equals(resultJson.get("code"))) { + log.error("请求海康,以图搜图失败,海康response:{}", resultStr); + return ResponseData.error("以图搜图失败"); + } + return ResponseData.success(resultJson); + } + + + /** + * 海康事件取消订阅 + */ + @PostMapping("/hik/event/cancel") + @ResponseBody + public Object eventCancelSubscribe(@RequestBody CancelSubscribeRequest cancelSubscribeRequest) { + String body = JSONObject.toJSONString(cancelSubscribeRequest); + String resultStr = HikUtil.hikApi(HikUri.EVENT_CANCEL, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (!"0".equals(resultJson.get("code"))) { + log.error("请求海康,取消订阅失败,海康response:{}", resultStr); + return ResponseData.error("取消订阅失败"); + } + return ResponseData.success(resultJson); + } + + /** * 单个添加海康人脸分组 * api->hik单个添加人脸分组api->response->mysql */ - @PostMapping("/faceGroup/single/add") + @PostMapping("/hik/faceGroup/single/add") @ResponseBody public Object faceGroupAddition(@RequestBody FaceGroupAdditionRequest faceGroupAdditionRequest) { String body = JSONObject.toJSONString(faceGroupAdditionRequest); @@ -212,7 +282,7 @@ * 批量添加海康组织 * api->hik批量添加组织api->response */ - @PostMapping("/org/batch/add") + @PostMapping("/hik/org/batch/add") @ResponseBody public Object orgBatchAdd(@RequestBody List orgBatchAddRequest) { String body = JSONObject.toJSONString(orgBatchAddRequest); @@ -232,4 +302,62 @@ return ResponseData.error("批量添加组织失败"); } + /** + * 获取人员列表 + */ + @PostMapping("/hik/person/personList") + @ResponseBody + public Object personList() { + PersonListRequest request = new PersonListRequest(); + request.setPageNo(1); + request.setPageSize(100); + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi("/api/resource/v2/person/personList", body); + return resultStr; + } + + /** + * 获取组织列表 + */ + @PostMapping("/hik/org/orgList") + @ResponseBody + public Object orgList() { + PersonListRequest request = new PersonListRequest(); + request.setPageNo(1); + request.setPageSize(100); + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi("/api/resource/v1/org/orgList", body); + return resultStr; + } + + /** + * 查询访客权限下载记录 + */ + @PostMapping("/hik/auth/result") + @ResponseBody + public Object authResult() { + PersonListRequest request = new PersonListRequest(); + request.setPageNo(1); + request.setPageSize(100); + request.setOrderId("ba101db6246711edaea66f7939a13638"); + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi("/api/visitor/v1/auth/result", body); + return resultStr; + } + + /** + * 人脸图片获取 + */ + @PostMapping("/hik/face/picture") + @ResponseBody + public Object facePicture() { + FaceRequest request = new FaceRequest(); +// List list = new ArrayList<>(); +// list.add(""); + request.setCertificateNum("wanggong"); + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi("/api/frs/v1/face", body); + return resultStr; + } + } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/AssetInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/AssetInfoMapper.java index 4f64e83..c0684ee 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/AssetInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/AssetInfoMapper.java @@ -17,6 +17,6 @@ @Mapper public interface AssetInfoMapper extends BaseMapper { - List getAssetInfoListPage(@Param("page") Page page, AssetInfoRequest assetInfoRequest); + List getAssetInfoListPage(@Param("page") Page page, @Param("assetInfoRequest") AssetInfoRequest assetInfoRequest); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/AttendanceInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/AttendanceInfoMapper.java index f9e793e..ec87e46 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/AttendanceInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/AttendanceInfoMapper.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.statistics.AttendanceNumberDTO; import com.casic.missiles.modular.dto.statistics.AttendanceRatioDTO; import com.casic.missiles.modular.model.AttendanceInfo; import org.apache.ibatis.annotations.Mapper; @@ -17,7 +18,7 @@ */ @Mapper public interface AttendanceInfoMapper extends BaseMapper { - List getAttendanceInfoListPage(@Param("page") Page page, StaffInfoRequest attendanceInfoRequest); + List getAttendanceInfoListPage(@Param("page") Page page, @Param("attendanceInfoRequest") StaffInfoRequest attendanceInfoRequest); AttendanceInfo selectByCodeAndDate(@Param("staffCode") String staffCode); @@ -26,4 +27,8 @@ List getCountByTypeAndDateForMonth(@Param("staffType")String staffType); List getCountByTypeAndDateForYear(@Param("staffType")String staffType); + + List getCountForWeek(); + + List getCountForDay(); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java index ce94b8f..6137a7d 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java @@ -17,5 +17,5 @@ @Mapper public interface BlackInfoMapper extends BaseMapper { - List getBlackInfoListPage(@Param("page") Page page, BlackInfoRequest blackInfoRequest); + List getBlackInfoListPage(@Param("page") Page page, @Param("blackInfoRequest") BlackInfoRequest blackInfoRequest); } 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 efda6b3..50aaa6f 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 @@ -20,7 +20,7 @@ List getCaseInfoListPage(@Param("page") Page page, @Param("caseInfoRequest") CaseInfoRequest caseInfoRequest); - int updateStatusById(CaseInfoRequest caseInfoRequest); + int updateStatusById(@Param("caseInfoRequest") CaseInfoRequest caseInfoRequest); List selectByLevelAndMonth(@Param("year") String year); @@ -47,4 +47,20 @@ List selectPreWeekCountByThirtyDay(); List selectPreDayCountBySevenDay(); + + Integer selectDemobilizedCount(@Param("eventType") Number personnelDemobilizedEvent); + + List selectPreMonthCount(); + + List selectListBySevenDay(); + + List selectListByToday(); + + List selectListByToday2(); + + List selectListByToday3(); + + List selectListByType(@Param("eventType") Number eventType); + + List selectDemobilizedCountByHour(@Param("eventType") Number eventType); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/CategoryLevelMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/CategoryLevelMapper.java index 52fc714..afe1650 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/CategoryLevelMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/CategoryLevelMapper.java @@ -17,9 +17,9 @@ @Mapper public interface CategoryLevelMapper extends BaseMapper { - List getCaseCategoryLevelListPage(@Param("page") Page page, CategoryLevelRequest categoryLevelRequest); + List getCaseCategoryLevelListPage(@Param("page") Page page, @Param("categoryLevelRequest") CategoryLevelRequest categoryLevelRequest); - List getCaseCategoryLevelList(CategoryLevelRequest categoryLevelRequest); + List getCaseCategoryLevelList(@Param("categoryLevelRequest") CategoryLevelRequest categoryLevelRequest); CaseCategoryLevel getCaseCategoryLevel(@Param("categoryLevelCode") String categoryLevelCode); 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 66353b1..2555a09 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 @@ -19,7 +19,7 @@ @Mapper public interface DeviceInfoMapper extends BaseMapper { - List getDeviceInfoListPage(@Param("page") Page page, DeviceInfoRequest deviceInfoRequest); + List getDeviceInfoListPage(@Param("page") Page page, @Param("deviceInfoRequest") DeviceInfoRequest deviceInfoRequest); List getDeviceInfoList(@Param("deviceInfoRequest") DeviceInfoRequest deviceInfoRequest); @@ -27,6 +27,8 @@ DeviceInfo getByIndexCode(@Param("srcIndex") String srcIndex); + DeviceInfo getByIp(@Param("ip") String ip); + List selectIndexCodesByCodes(@Param("deviceCodes") List deviceCodes); List selectByType(@Param("devType") String devType); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java index 41dd0af..5bfaf63 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java @@ -5,6 +5,7 @@ import com.casic.missiles.modular.dto.DeviceRepairRequest; import com.casic.missiles.modular.model.DeviceRepairLog; import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; import java.util.List; @@ -16,7 +17,7 @@ @Mapper public interface DeviceRepairLogMapper extends BaseMapper { - List getDeviceRepairListPage(Page page, DeviceRepairRequest deviceRepairRequest); + List getDeviceRepairListPage(@Param("page") Page page, @Param("deviceRepairRequest")DeviceRepairRequest deviceRepairRequest); - List getDeviceRepairList(DeviceRepairRequest deviceRepairRequest); + List getDeviceRepairList(@Param("deviceRepairRequest") DeviceRepairRequest deviceRepairRequest); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java index 9035c47..4823ac1 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java @@ -18,7 +18,7 @@ @Mapper public interface FireEquipInfoMapper extends BaseMapper { - List getFireEquipInfoListPage(@Param("page") Page page, FireEquipRequest fireEquipRequest); + List getFireEquipInfoListPage(@Param("page") Page page, @Param("fireEquipRequest") FireEquipRequest fireEquipRequest); FireEquipInfo getFireEquipInfo(@Param("equipCode") String equipCode); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/GateGroupMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/GateGroupMapper.java index d8c330d..977a427 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/GateGroupMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/GateGroupMapper.java @@ -17,7 +17,7 @@ */ @Mapper public interface GateGroupMapper extends BaseMapper { - List getGateGroupListPage(@Param("page") Page page, GateGroupRequest gateGroupRequest); + List getGateGroupListPage(@Param("page") Page page, @Param("gateGroupRequest") GateGroupRequest gateGroupRequest); GateGroup getGateGroupByName(@Param("groupName") String groupName); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/HazardLevelMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/HazardLevelMapper.java index 8957780..dcf47bb 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/HazardLevelMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/HazardLevelMapper.java @@ -17,11 +17,13 @@ @Mapper public interface HazardLevelMapper extends BaseMapper { - List getCaseHazardLevelListPage(@Param("page") Page page, HazardLevelRequest hazardLevelRequest); + List getCaseHazardLevelListPage(@Param("page") Page page, @Param("hazardLevelRequest") HazardLevelRequest hazardLevelRequest); - List getCaseHazardLevelList(HazardLevelRequest hazardLevelRequest); + List getCaseHazardLevelList(@Param("hazardLevelRequest") HazardLevelRequest hazardLevelRequest); CaseHazardLevel getCaseHazardLevel(@Param("hazardLevelCode") String hazardLevelCode); List selectHazardName(); + + String selectHazardNameByCode(@Param("hazardLevelCode") String hazardLevelCode); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/HikCaseDefineMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/HikCaseDefineMapper.java index 0dc47d1..f162fef 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/HikCaseDefineMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/HikCaseDefineMapper.java @@ -12,5 +12,5 @@ */ @Mapper public interface HikCaseDefineMapper extends BaseMapper { - HikCaseDefine getHikCaseDefine(@Param("caseTypeCode") Long caseTypeCode); + HikCaseDefine getHikCaseDefine(@Param("caseTypeCode") Number caseTypeCode); } 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 f8a674c..fe5afc2 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 @@ -17,11 +17,13 @@ @Mapper public interface StaffInfoMapper extends BaseMapper { - List getStaffInfoListPage(@Param("page") Page page, StaffInfoRequest staffInfoRequest); + List getStaffInfoListPage(@Param("page") Page page, @Param("staffInfoRequest") StaffInfoRequest staffInfoRequest); StaffInfo selectByCode(@Param("staffCode") String staffCode); - List getStaffInfoList(StaffInfoRequest staffInfoRequest); + List getStaffInfoList(@Param("staffInfoRequest") StaffInfoRequest staffInfoRequest); - List selectBatchCodes(List list); + List selectBatchCodes(@Param("list") List list); + + int updateByCodeForCard(@Param("staffCode") String staffCode, @Param("cardNo") String cardNo); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitInfoMapper.java index b1217c5..6c52542 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitInfoMapper.java @@ -16,7 +16,7 @@ */ @Mapper public interface VisitInfoMapper extends BaseMapper { - List getVisitInfoListPage(@Param("page") Page page, VisitorRequest visitorRequest); + List getVisitInfoListPage(@Param("page") Page page, @Param("visitorRequest") VisitorRequest visitorRequest); VisitInfo selectByOrderId(@Param("orderId") String orderId); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitorApplyMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitorApplyMapper.java index c09f3c0..6ea55bd 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitorApplyMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitorApplyMapper.java @@ -18,7 +18,7 @@ @Mapper public interface VisitorApplyMapper extends BaseMapper { - List getVisitorApplyListPage(@Param("page") Page page, VisitorApplyRequest visitorApplyRequest); + List getVisitorApplyListPage(@Param("page") Page page, @Param("visitorApplyRequest") VisitorApplyRequest visitorApplyRequest); List selectByVisitReason(); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/AttendanceInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/AttendanceInfoMapper.xml index b2ece71..f8bdd6e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/AttendanceInfoMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/AttendanceInfoMapper.xml @@ -43,7 +43,8 @@ and staff_type = #{staffType} - and YEARWEEK(date_format(atte_date, '%Y-%m-%d'), 1) = YEARWEEK(now(),1); + AND DATE_SUB(CURDATE(), INTERVAL 7 DAY) <= DATE(atte_date) + GROUP BY DATE_FORMAT(atte_date, '%Y-%m-%d') @@ -69,4 +70,20 @@ GROUP BY DATE_FORMAT(atte_date, '%Y-%m') + + + \ No newline at end of file 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 2b6953f..06ec0a8 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 @@ -28,7 +28,9 @@ @@ -87,7 +89,8 @@ SELECT hazard_level_code as levelCode, count(id) as quantity FROM bus_case_info WHERE hazard_level_code is not null - AND DATE_SUB(CURDATE(), INTERVAL 7 DAY) <= date(happen_time); + AND is_key_area = 1 + AND DATE_SUB(CURDATE(), INTERVAL 7 DAY) <= date(happen_time) GROUP BY hazard_level_code @@ -95,7 +98,8 @@ SELECT hazard_level_code as levelCode, count(id) as quantity FROM bus_case_info WHERE hazard_level_code is not null - AND DATE_SUB(CURDATE(), INTERVAL 30 DAY) <= date(happen_time); + AND is_key_area = 1 + AND DATE_SUB(CURDATE(), INTERVAL 30 DAY) <= date(happen_time) GROUP BY hazard_level_code @@ -122,4 +126,71 @@ AND hazard_level_code is not null GROUP BY DATE_FORMAT(happen_time,'%Y-%m-%d') + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/CategoryLevelMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/CategoryLevelMapper.xml index 4670b1f..1d25cbd 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/CategoryLevelMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/CategoryLevelMapper.xml @@ -20,11 +20,11 @@ SELECT * FROM bus_case_category_level WHERE 1=1 - - and code = #{code} + + and code = #{categoryLevelRequest.code} - - and name = #{name} + + and name = #{categoryLevelRequest.name} ORDER by create_time DESC 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 9b66fd8..bfd84b7 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 @@ -98,4 +98,10 @@ #{item} + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceRepairLogMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceRepairLogMapper.xml index 078ed3c..cf1a481 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceRepairLogMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceRepairLogMapper.xml @@ -22,14 +22,14 @@ SELECT * FROM bus_device_repair_log WHERE 1=1 - - and device_code = #{devCode} + + and device_code = #{deviceRepairRequest.devCode} - - and device_name = #{devName} + + and device_name = #{deviceRepairRequest.devName} - - and DATE_FORMAT(create_time,"%y%m%d") = DATE_FORMAT(#{createTime},"%y%m%d") + + and DATE_FORMAT(create_time,"%y%m%d") = DATE_FORMAT(#{deviceRepairRequest.createTime},"%y%m%d") ORDER by create_time DESC diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/HazardLevelMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/HazardLevelMapper.xml index f16f2b9..458322b 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/HazardLevelMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/HazardLevelMapper.xml @@ -20,11 +20,11 @@ SELECT * FROM bus_case_hazard_level WHERE 1=1 - - and code = #{code} + + and code = #{hazardLevelRequest.code} - - and name = #{name} + + and name = #{hazardLevelRequest.name} ORDER by create_time DESC @@ -42,4 +42,10 @@ SELECT name FROM bus_case_hazard_level + + \ 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 557237e..b6a183a 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 @@ -50,4 +50,10 @@ + + + UPDATE bus_staff_info + SET card_no = #{cardNo} + WHERE staff_code = #{staffCode} + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitInfoMapper.xml index 84aa84f..230529a 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitInfoMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitInfoMapper.xml @@ -27,5 +27,6 @@ SELECT * FROM bus_visit_info WHERE order_id = #{orderId} and DATE_FORMAT(in_time,'%Y-%m-%d') = CURRENT_DATE + limit 1 \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/BlackPictureRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/BlackPictureRequest.java new file mode 100644 index 0000000..fc92701 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/BlackPictureRequest.java @@ -0,0 +1,14 @@ +package com.casic.missiles.modular.dto; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/29 19:26 + */ +@Data +public class BlackPictureRequest { + private String picUri; + private String serverIndexCode; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/CancelSubscribeRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/CancelSubscribeRequest.java new file mode 100644 index 0000000..e2d390a --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/CancelSubscribeRequest.java @@ -0,0 +1,15 @@ +package com.casic.missiles.modular.dto.hik; + +import lombok.Data; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/24 15:14 + */ +@Data +public class CancelSubscribeRequest { + private List eventTypes; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/CardInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/CardInfo.java new file mode 100644 index 0000000..341457d --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/CardInfo.java @@ -0,0 +1,24 @@ +package com.casic.missiles.modular.dto.hik; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/26 16:08 + */ +@Data +public class CardInfo { + //卡号,8~20个字符,支持数字和大写字母 + private String cardNo; + //人员ID,员工工号 + private String personId; + //人员所属组织IndexCode + private String orgIndexCode; + //卡片类型,默认是1:IC卡 + //1:IC卡 + //2:CPU卡 + //3:远距离卡 + //4:MIFARE卡 + private Number cardType; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/FaceRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/FaceRequest.java new file mode 100644 index 0000000..edc04bf --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/FaceRequest.java @@ -0,0 +1,16 @@ +package com.casic.missiles.modular.dto.hik; + +import lombok.Data; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/25 16:53 + */ +@Data +public class FaceRequest { + private String certificateNum; + private List indexCodes; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/HikRecvEvent.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/HikRecvEvent.java index a3e9845..1b2b2b1 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/HikRecvEvent.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/HikRecvEvent.java @@ -28,12 +28,12 @@ /** * 事件类型,用于判断所需接收到的事件类型 */ - public Long getEventType(){ + public Number getEventType(){ JSONObject jsonObject = (JSONObject)JSONObject.toJSON(params); //事件类别对应SecurityEventTypeEnum JSONArray eventTypeArray = (JSONArray)jsonObject.get("events"); JSONObject eventJsonObject = (JSONObject)JSONObject.toJSON(eventTypeArray.get(0)); - Long eventType = (Long) eventJsonObject.get("eventType"); + Number eventType = (Number) eventJsonObject.get("eventType"); return eventType; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonBatchDeleteRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonBatchDeleteRequest.java index 027d31d..9751929 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonBatchDeleteRequest.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonBatchDeleteRequest.java @@ -12,4 +12,6 @@ @Data public class PersonBatchDeleteRequest { private List personIds; + //删除人脸接口使用 + private String faceId; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonInfoRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonInfoRequest.java new file mode 100644 index 0000000..05dc9e1 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonInfoRequest.java @@ -0,0 +1,20 @@ +package com.casic.missiles.modular.dto.hik; + +import lombok.Data; + +import java.util.List; + +/** + * @Description: 获取员工照片请求实体 + * @Author: wangpeng + * @Date: 2022/8/25 16:53 + */ +@Data +public class PersonInfoRequest { + //获取员工详细信息使用 + private String paramName; + private List paramValue; + //获取照片使用 + private String picUri; + private String serverIndexCode; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonListRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonListRequest.java new file mode 100644 index 0000000..3f7149b --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonListRequest.java @@ -0,0 +1,16 @@ +package com.casic.missiles.modular.dto.hik; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/25 16:53 + */ +@Data +public class PersonListRequest { + private Number pageNo; + private Number pageSize; + + private String orderId; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/SearchPicturesRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/SearchPicturesRequest.java new file mode 100644 index 0000000..0a95966 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/SearchPicturesRequest.java @@ -0,0 +1,24 @@ +package com.casic.missiles.modular.dto.hik; + +import lombok.Data; + +import java.util.List; + +/** + * @Description: 以图搜图请求 + * @Author: wangpeng + * @Date: 2022/8/29 10:46 + */ +@Data +public class SearchPicturesRequest { + private String facePicBinaryData; + private String facePicUrl; + private List cameraIndexCodes; + private String startTime; + private String endTime; + //指定搜图的最小相似度,最小为1,最大为100 + private String minSimilarity; + private Number age; + //male-男性,female-女性 + private String sex; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/StaffCardRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/StaffCardRequest.java new file mode 100644 index 0000000..4052e6d --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/StaffCardRequest.java @@ -0,0 +1,20 @@ +package com.casic.missiles.modular.dto.hik; + +import lombok.Data; + +import java.util.List; + +/** + * @Description: 人员开卡请求实体 + * @Author: wangpeng + * @Date: 2022/8/26 16:05 + */ +@Data +public class StaffCardRequest { + //卡片开始有效时间,时间格式:yyyy-MM-dd + private String startDate; + //卡片截止有效时间,时间格式:yyyy-MM-dd,不能大于2037年12月31日 + private String endDate; + //cardList,待开卡列表,最大支持50张卡 + private List cardList; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/VisitorInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/VisitorInfo.java index 73aa316..b99f301 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/VisitorInfo.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/VisitorInfo.java @@ -14,7 +14,7 @@ //访客性别 //1: 男 //2: 女 - private String gender; + private Integer gender; //联系电话建议填写手机号码 private String phoneNo; //证件类型 diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/ApplyReasonGroupDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/ApplyReasonGroupDTO.java index 514f382..786143e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/ApplyReasonGroupDTO.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/ApplyReasonGroupDTO.java @@ -13,4 +13,6 @@ private String visitReason; //访问人数 private Integer quantity; + //占比 + private String ratio; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/BlackListController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/BlackListController.java index a27f9f8..0c06661 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/BlackListController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/BlackListController.java @@ -1,13 +1,18 @@ package com.casic.missiles.modular.controller; +import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.base.controller.ExportController; import com.casic.missiles.core.page.PageFactory; import com.casic.missiles.model.response.ResponseData; import com.casic.missiles.modular.dto.BlackInfoRequest; +import com.casic.missiles.modular.dto.BlackPictureRequest; +import com.casic.missiles.modular.dto.hik.PersonInfoRequest; +import com.casic.missiles.modular.enums.HikUri; import com.casic.missiles.modular.enums.OperateTypeEnum; import com.casic.missiles.modular.model.BlackInfo; import com.casic.missiles.modular.service.BlackInfoService; +import com.casic.missiles.modular.util.HikUtil; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; @@ -56,4 +61,22 @@ return null; } + /** + * 黑名单人员照片 + */ + @PostMapping("/personPicture") + @ResponseBody + public Object personPicture(@RequestBody BlackPictureRequest blackPictureRequest){ + //获取照片 + String picUri = blackPictureRequest.getPicUri(); + String serverIndexCode = blackPictureRequest.getServerIndexCode(); + PersonInfoRequest picRequest = new PersonInfoRequest(); + picRequest.setPicUri(picUri); + picRequest.setServerIndexCode(serverIndexCode); + String reBody = JSONObject.toJSONString(picRequest); + //重定向地址获取 + String url = HikUtil.hikApiFor302(HikUri.PERSON_PICTURE, reBody); + return ResponseData.success(url); + } + } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/DeviceController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/DeviceController.java index e1c4eba..666bbee 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/DeviceController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/DeviceController.java @@ -107,7 +107,7 @@ } /** - * 设备维修管理查询(分页),需计算MTTR=总维修时间/故障次数 + * 设备状态计算与评判/设备维修管理查询(分页),需计算MTTR=总维修时间/故障次数 */ @PostMapping("/repair/listPage") @ResponseBody @@ -211,7 +211,7 @@ //需根据设备编号获取到对应的门禁点唯一标识 doorControlRequest.setDoorIndexCodes(indexCodes); doorControlRequest.setControlType(Integer.valueOf(gateGroupDTO.getStatus())); - String body = JSONObject.toJSONString(deviceCodes); + String body = JSONObject.toJSONString(doorControlRequest); String resultStr = HikUtil.hikApi(HikUri.DOOR_CONTROL, body); JSONObject resultJson = (JSONObject)JSONObject.parse(resultStr); if (!"0".equals(resultJson.get("code"))) { diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/StaffController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/StaffController.java index b58ccab..704093c 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/StaffController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/StaffController.java @@ -2,15 +2,21 @@ import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.util.StrUtil; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.base.controller.ExportController; import com.casic.missiles.core.page.PageFactory; import com.casic.missiles.model.response.ErrorResponseData; import com.casic.missiles.model.response.ResponseData; import com.casic.missiles.modular.dto.StaffInfoRequest; +import com.casic.missiles.modular.dto.hik.PersonInfoRequest; +import com.casic.missiles.modular.dto.hik.StaffCardRequest; +import com.casic.missiles.modular.enums.HikUri; import com.casic.missiles.modular.enums.OperateTypeEnum; import com.casic.missiles.modular.model.StaffInfo; import com.casic.missiles.modular.service.StaffInfoService; +import com.casic.missiles.modular.util.HikUtil; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; @@ -110,4 +116,60 @@ } return ResponseData.success(); } + + /** + * 批量开卡,添加人员之后调用,若在一个接口中添加人员成功开卡失败则第二次添加时会有问题 + */ + @PostMapping("/cardBinding") + @ResponseBody + public Object cardBinding(@RequestBody StaffCardRequest staffCardRequest) { + String body = JSONObject.toJSONString(staffCardRequest); + String resultStr = HikUtil.hikApi(HikUri.CARD_BINDING, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (!"0".equals(resultJson.get("code"))) { + log.error("请求海康,批量开卡失败,海康response:{}", resultStr); + return ResponseData.error("批量开卡失败"); + } + //保存卡号 + if(staffInfoService.saveCardInfo(staffCardRequest) > 0){ + return ResponseData.success(); + } + return ResponseData.error("批量开卡失败"); + } + + /** + * 获取员工照片,海康存储 + */ + @PostMapping("/personPicture/{staffCode}") + @ResponseBody + public Object personPicture(@PathVariable("staffCode") String staffCode){ + //获取员工详细信息,含图片服务器、uri + PersonInfoRequest request = new PersonInfoRequest(); + List list = new ArrayList<>(); + list.add(staffCode); + request.setParamName("personId"); + request.setParamValue(list); + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi(HikUri.PERSON_INFO, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (!"0".equals(resultJson.get("code"))) { + log.error("请求海康,根据人员唯一字段获取人员详细信息失败,海康response:{}", resultStr); + return ResponseData.error("获取员工照片失败"); + } + //获取照片 + JSONObject data = (JSONObject) resultJson.get("data"); + JSONArray dataArray = (JSONArray) data.get("list"); + JSONObject jsonObject = (JSONObject) dataArray.get(0); + JSONArray personPhoto = (JSONArray) jsonObject.get("personPhoto"); + JSONObject photo = (JSONObject) personPhoto.get(0); + String picUri = photo.getString("picUri"); + String serverIndexCode = photo.getString("serverIndexCode"); + PersonInfoRequest picRequest = new PersonInfoRequest(); + picRequest.setPicUri(picUri); + picRequest.setServerIndexCode(serverIndexCode); + String reBody = JSONObject.toJSONString(picRequest); + //重定向地址获取 + String url = HikUtil.hikApiFor302(HikUri.PERSON_PICTURE, reBody); + return ResponseData.success(url); + } } 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 4a07dd9..7b1dcf6 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 @@ -16,6 +16,7 @@ import com.casic.missiles.modular.redis.key.CacheKeys; import com.casic.missiles.modular.service.CockpitService; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.util.CollectionUtils; import org.springframework.web.bind.annotation.*; @@ -24,10 +25,7 @@ import java.text.NumberFormat; import java.time.LocalDateTime; import java.time.temporal.ChronoUnit; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.util.*; import java.util.stream.Collectors; /** @@ -73,6 +71,9 @@ private StatisticNumberMapper numberMapper; @Autowired + private HazardLevelMapper hazardLevelMapper; + + @Autowired private AccessGroupConfig accessGroupConfig; /** @@ -104,8 +105,24 @@ public Object buildingNumberPerHour(){ //当天按小时分组的人数 List list = numberMapper.selectListByTime(); - Map> collect = list.stream().collect(Collectors.groupingBy(BuildingNumberDTO::getStatisticPosition)); - return ResponseData.success(collect); + Map> collect = list.stream().collect(Collectors.groupingBy(BuildingNumberDTO::getStatisticTime)); + //定时任务中已将每小时三栋楼人数存到数据库 + //将一期主楼和录制楼人数合并,二期单算 + List> resultList = new ArrayList<>(); + collect.keySet().forEach(key -> { + List buildingNumberDTOS = collect.get(key); + BuildingNumberDTO mainBuildingOne = buildingNumberDTOS.get(0); + BuildingNumberDTO mainBuildingTwo = buildingNumberDTOS.get(1); + BuildingNumberDTO recordingBuilding = buildingNumberDTOS.get(2); + HashMap resultMap = new HashMap<>(); + Integer oneQuantity = Integer.valueOf(mainBuildingOne.getStatisticQuantity()); + Integer recordingQuantity = Integer.valueOf(recordingBuilding.getStatisticQuantity()); + resultMap.put("staticTime", mainBuildingOne.getStatisticTime()); + resultMap.put(mainBuildingOne.getStatisticPositionName()+"、"+recordingBuilding.getStatisticPositionName(), String.valueOf(oneQuantity+recordingQuantity)); + resultMap.put(mainBuildingTwo.getStatisticPositionName(), mainBuildingTwo.getStatisticQuantity()); + resultList.add(resultMap); + }); + return ResponseData.success(resultList); } /** @@ -151,12 +168,11 @@ public Object securityNumber() { QueryWrapper wrapper = new QueryWrapper<>(); wrapper.eq("staff_type", 2); + // TODO: 2022/9/2 后续使用产品确定的每天出勤的安保人员的数量 Integer total = staffInfoMapper.selectCount(wrapper); - //当日离岗事件个数 - QueryWrapper wrapper1 = new QueryWrapper<>(); - wrapper1.eq("hik_event_type", SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); - wrapper1.apply("date_format(now(),'%Y-%m-%d') = date_format(happen_time,'%Y-%m-%d')"); - Integer leave = caseInfoMapper.selectCount(wrapper1); + //当日离岗事件按设备去重后的个数 + // TODO: 2022/9/2 目前相当于24小时内的计算,之后看需要可改成自定义小时数计算离岗率,即离岗+6小时内仅一次离岗则恢复为100%,多次则累加离岗次数计算离岗率 + Integer leave = caseInfoMapper.selectDemobilizedCount(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); NumberFormat numberFormat = NumberFormat.getInstance(); // 设置精确到小数点后2位 numberFormat.setMaximumFractionDigits(2); @@ -179,7 +195,6 @@ @ResponseBody public Object visitorApplyDetail() { List reasonGroup = applyMapper.selectByVisitReason(); - HashMap resultMap = new HashMap<>(); NumberFormat numberFormat = NumberFormat.getInstance(); // 设置精确到小数点后2位 numberFormat.setMaximumFractionDigits(2); @@ -187,12 +202,17 @@ if(0 == sum){ return ResponseData.success(); } + List resultList = new ArrayList<>(); reasonGroup.forEach(group -> { String reasonName = dictService.getDictNameByCode(SecurityEventDict.VISIT_REASON, group.getVisitReason()); String result = numberFormat.format((float) group.getQuantity() / (float) sum * 100); - resultMap.put(reasonName, result+"%"); + ApplyReasonGroupDTO applyReasonGroupDTO = new ApplyReasonGroupDTO(); + applyReasonGroupDTO.setQuantity(group.getQuantity()); + applyReasonGroupDTO.setVisitReason(reasonName); + applyReasonGroupDTO.setRatio(result+"%"); + resultList.add(applyReasonGroupDTO); }); - return ResponseData.success(resultMap); + return ResponseData.success(resultList); } /** @@ -247,6 +267,32 @@ } /** + * 机动力量实时在岗率,在岗人数除以总应在岗人数,用离岗+6小时内恢复为100%,6小时外再计算 + */ + @GetMapping("/staff/beOnDutyRatio") + @ResponseBody + public Object beOnDutyRatio() { + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("staff_type", 2); + // TODO: 2022/9/2 后续使用产品确定的每天出勤的安保人员的数量 + Integer total = staffInfoMapper.selectCount(wrapper); + if(0 == total){ + return ResponseData.success(null); + } + //当日离岗事件按设备去重后的个数 + // TODO: 2022/9/2 目前相当于24小时内的计算,之后看需要可改成自定义小时数计算离岗率,即离岗+6小时内仅一次离岗则恢复为100%,多次则累加离岗次数计算离岗率 + List onDutyRatioDTOS = caseInfoMapper.selectDemobilizedCountByHour(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); + onDutyRatioDTOS.forEach(dto -> { + NumberFormat numberFormat = NumberFormat.getInstance(); + // 设置精确到小数点后2位 + numberFormat.setMaximumFractionDigits(2); + String result = numberFormat.format(100 - Float.valueOf(dto.getQuantity()) / (float) total * 100); + dto.setRatio(result+"%"); + }); + return ResponseData.success(onDutyRatioDTOS); + } + + /** * 闸机速通门统计-设备状态分组计算数量,devType传闸机字典key * 视频频监控摄像机统计-设备状态分组计算数量,devType传摄像头字典key */ @@ -262,12 +308,17 @@ if(sum <= 0){ return ResponseData.error("无该类设备信息"); } + List resultList = new ArrayList<>(); gateStatusGroup.forEach(group -> { String devStatus = dictService.getDictNameByCode(SecurityEventDict.DEVICE_STATUS, group.getStatus()); String result = numberFormat.format((float) group.getQuantity() / (float) sum * 100); - resultMap.put(devStatus, result+"%"); + GateStatusGroupResponse gateStatusGroupResponse = new GateStatusGroupResponse(); + gateStatusGroupResponse.setStatus(devStatus); + gateStatusGroupResponse.setRatio(result+"%"); + resultList.add(gateStatusGroupResponse); }); - resultMap.put("总", sum); + resultMap.put("total", sum); + resultMap.put("list", resultList); return ResponseData.success(resultMap); } @@ -282,17 +333,38 @@ String position = securityScoreDTO.getPosition(); List caseInfos = caseInfoMapper.selectByPosition(position); //查询各危险级别权重、各类别权重,放入map,避免循环中多次查数据库 - + HashMap hazardScoreMap = new HashMap<>(); + List caseHazardLevelList = hazardLevelMapper.getCaseHazardLevelList(null); + caseHazardLevelList.forEach(hazardLevel -> { + hazardScoreMap.put(hazardLevel.getCode(), hazardLevel.getWeight()); + }); + HashMap categoryScoreMap = new HashMap<>(); + List categoryLevelList = categoryLevelMapper.getCaseCategoryLevelList(null); + categoryLevelList.forEach(categoryLevel -> { + categoryScoreMap.put(categoryLevel.getCode(), categoryLevel.getWeight()); + }); + //事件按楼层分组,计算 List securityScoreDTOs = new ArrayList<>(); caseInfos.forEach(caseInfo -> { SecurityScoreDTO securityScoreDTO1 = new SecurityScoreDTO(); + securityScoreDTO1.setPosition(caseInfo.getPosition()); securityScoreDTO1.setArea(caseInfo.getArea()); - // TODO: 2022/8/4 楼层评分计算根据产品定义调整 -// caseInfo.get -// securityScoreDTO1.setScore(); + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); + Double score = 100 - Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + securityScoreDTO1.setScore(score); + securityScoreDTOs.add(securityScoreDTO1); }); - - return null; + 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); + }); + return ResponseData.success(securityScoreDTOs); } /** @@ -303,9 +375,13 @@ public Object SecurityFrequency(@RequestBody SecurityFrequencyDTO securityFrequencyDTO) { String year = securityFrequencyDTO.getYear(); String month = securityFrequencyDTO.getMonth(); - Integer quantity = caseInfoMapper.selectCountByMonth(year, month); - securityFrequencyDTO.setQuantity(quantity); - return ResponseData.success(securityFrequencyDTO); + if(!StringUtils.isEmpty(year) && StringUtils.isEmpty(month)){ + Integer quantity = caseInfoMapper.selectCountByMonth(year, month); + securityFrequencyDTO.setQuantity(quantity); + return ResponseData.success(securityFrequencyDTO); + } + List list = caseInfoMapper.selectPreMonthCount(); + return ResponseData.success(list); } } 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 ae4d770..f4f075c 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 @@ -1,20 +1,25 @@ package com.casic.missiles.modular.controller.cockpit; +import cn.hutool.core.date.DateUnit; import cn.hutool.core.date.DateUtil; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.casic.missiles.model.response.ResponseData; -import com.casic.missiles.modular.dao.AttendanceInfoMapper; -import com.casic.missiles.modular.dao.CaseInfoMapper; -import com.casic.missiles.modular.dao.HazardLevelMapper; -import com.casic.missiles.modular.dao.StaffInfoMapper; +import com.casic.missiles.modular.dao.*; +import com.casic.missiles.modular.dto.DeviceRepairLogDTO; +import com.casic.missiles.modular.dto.DeviceRepairRequest; import com.casic.missiles.modular.dto.statistics.*; +import com.casic.missiles.modular.enums.SecurityEventType; +import com.casic.missiles.modular.model.CaseCategoryLevel; import com.casic.missiles.modular.model.CaseHazardLevel; +import com.casic.missiles.modular.model.CaseInfo; import com.casic.missiles.modular.model.StaffInfo; +import com.casic.missiles.modular.service.DeviceInfoService; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.util.CollectionUtils; import org.springframework.web.bind.annotation.*; +import java.math.BigDecimal; import java.text.NumberFormat; import java.util.*; import java.util.stream.Collectors; @@ -40,6 +45,12 @@ @Autowired private HazardLevelMapper hazardLevelMapper; + @Autowired + private CategoryLevelMapper categoryLevelMapper; + + @Autowired + private DeviceInfoService deviceInfoService; + /** * 安防事件时域频次统计,每月的每天安防事件个数(原方案) * 月维度:展示每个月的每天的数据 @@ -89,15 +100,17 @@ List monthList = caseInfoMapper.selectPreMonthCountByYear(year); Map> collect = monthList.stream().collect(Collectors.groupingBy(PreMonthOrWeekCaseDTO::getHazardLevelCode)); HashMap strAvgMap = new HashMap<>(); + List resultList = new ArrayList<>(); for (String key : collect.keySet()) { List preMonthOrWeekCaseDTOS = collect.get(key); int sum = preMonthOrWeekCaseDTOS.stream().mapToInt(PreMonthOrWeekCaseDTO::getQuantity).sum(); //若年份是本年,则使用个安防级别数量/当前月份数 //若不是本年,除数为12 MonthAndWeekDTO monthAndWeekDTO = new MonthAndWeekDTO(); + String hazardName = hazardLevelMapper.selectHazardNameByCode(key); + monthAndWeekDTO.setLevelName(hazardName); if(year.equals(String.valueOf(DateUtil.thisYear()))){ monthAndWeekDTO.setMonthQuantity(sum / DateUtil.thisMonth()); -// monthAndWeekDTO.setLevelName(); strAvgMap.put(key, monthAndWeekDTO); }else{ monthAndWeekDTO.setMonthQuantity(sum / 12); @@ -113,27 +126,37 @@ if(year.equals(String.valueOf(DateUtil.thisYear()))){ if(!Objects.isNull(strAvgMap.get(key))){ MonthAndWeekDTO monthAndWeekDTO = strAvgMap.get(key); + String hazardName = hazardLevelMapper.selectHazardNameByCode(key); + monthAndWeekDTO.setLevelName(hazardName); monthAndWeekDTO.setWeekQuantity(sum / DateUtil.thisWeekOfYear()); strAvgMap.put(key, monthAndWeekDTO); }else{ MonthAndWeekDTO monthAndWeekDTO = new MonthAndWeekDTO(); + String hazardName = hazardLevelMapper.selectHazardNameByCode(key); + monthAndWeekDTO.setLevelName(hazardName); monthAndWeekDTO.setWeekQuantity(sum / DateUtil.thisWeekOfYear()); strAvgMap.put(key, monthAndWeekDTO); } }else{ if(!Objects.isNull(strAvgMap.get(key))){ MonthAndWeekDTO monthAndWeekDTO = strAvgMap.get(key); + String hazardName = hazardLevelMapper.selectHazardNameByCode(key); + monthAndWeekDTO.setLevelName(hazardName); monthAndWeekDTO.setWeekQuantity(sum / 52); strAvgMap.put(key, monthAndWeekDTO); }else{ MonthAndWeekDTO monthAndWeekDTO = new MonthAndWeekDTO(); + String hazardName = hazardLevelMapper.selectHazardNameByCode(key); + monthAndWeekDTO.setLevelName(hazardName); monthAndWeekDTO.setWeekQuantity(sum / 52); strAvgMap.put(key, monthAndWeekDTO); } } } - avgMonthAndWeekGroupDTO.setMap(strAvgMap); - return ResponseData.success(avgMonthAndWeekGroupDTO); + strAvgMap.keySet().forEach(key -> { + resultList.add(strAvgMap.get(key)); + }); + return ResponseData.success(resultList); } /** @@ -181,12 +204,178 @@ } /** - * 员工考勤人数变化,功能待定 + * 员工考勤人数变化,统计当天(横坐标为时)及近7天(横坐标为天)的考勤人数变化,只要发生一次考勤识别,次数的基数就正常增加(没有上班下班区分) */ + @PostMapping("/staff/attendanceNumber/{dimension}") + @ResponseBody + public Object attendanceNumber(@PathVariable("dimension") String dimension) { + List attendanceNumberDTOs = null; + List> resultList = new ArrayList<>(); + if("week".equals(dimension)){ + //近7天数据按天分组统计 + attendanceNumberDTOs = attendanceInfoMapper.getCountForWeek(); + }else if("day".equals(dimension)) { + //今天数据按小时分组统计 + attendanceNumberDTOs = attendanceInfoMapper.getCountForDay(); + } + if(CollectionUtils.isEmpty(attendanceNumberDTOs)){ + return ResponseData.error("该查询条件下,无员工出勤数据!"); + } + Map> collect = attendanceNumberDTOs.stream().collect(Collectors.groupingBy(AttendanceNumberDTO::getDate)); + collect.keySet().forEach(key -> { + List attendanceNumberDTOS = collect.get(key); + AttendanceNumberDTO attendanceNumberDTO = attendanceNumberDTOS.get(0); + AttendanceNumberDTO attendanceNumberDTO2 = attendanceNumberDTOS.get(1); + Map resultMap = new HashMap<>(); + resultMap.put(attendanceNumberDTO.getStaffType(), attendanceNumberDTO.getQuantity()); + resultMap.put(attendanceNumberDTO2.getStaffType(), attendanceNumberDTO2.getQuantity()); + resultMap.put("staticTime", attendanceNumberDTO.getDate()); + resultList.add(resultMap); + }); + return ResponseData.success(resultList); + } /** - * 近30天/近一周安保人员到岗排行 + * 早晚高峰区域安防评估 */ + @PostMapping("/security/assessment/{dimension}") + @ResponseBody + public Object securityAssessment(@PathVariable("dimension") String dimension) { + //查询各危险级别权重、各类别权重,放入map,避免循环中多次查数据库 + HashMap hazardScoreMap = new HashMap<>(); + List caseHazardLevelList = hazardLevelMapper.getCaseHazardLevelList(null); + caseHazardLevelList.forEach(hazardLevel -> { + hazardScoreMap.put(hazardLevel.getCode(), hazardLevel.getWeight()); + }); + HashMap categoryScoreMap = new HashMap<>(); + List categoryLevelList = categoryLevelMapper.getCaseCategoryLevelList(null); + categoryLevelList.forEach(categoryLevel -> { + categoryScoreMap.put(categoryLevel.getCode(), categoryLevel.getWeight()); + }); + HashMap hashMap = new HashMap<>(); + if("week".equals(dimension)){ + //近7天早晚高峰数据 + List caseInfos = caseInfoMapper.selectListBySevenDay(); + //按时间(天)进行分组 + caseInfos.forEach(caseInfo -> { + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); + Double score = Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + String[] array = caseInfo.getHappenTime().split(" "); + String dayTime = array[0]; + BigDecimal preScore; + if(hashMap.containsKey(dayTime)){ + Double aDouble = hashMap.get(dayTime); + preScore = new BigDecimal(aDouble.toString()); + + }else{ + preScore = new BigDecimal("100.0"); + } + BigDecimal nowScore = new BigDecimal(score.toString()); + hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); + }); + return ResponseData.success(hashMap); + }else if("day".equals(dimension)) { + //今天数据按小时分组统计 + List caseInfos = caseInfoMapper.selectListByToday(); + caseInfos.forEach(caseInfo -> { + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); + Double score = Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + String[] array = caseInfo.getHappenTime().split(":"); + String dayTime = array[0]; + BigDecimal preScore; + if(hashMap.containsKey(dayTime)){ + Double aDouble = hashMap.get(dayTime); + preScore = new BigDecimal(aDouble.toString()); + + }else{ + preScore = new BigDecimal("100.0"); + } + BigDecimal nowScore = new BigDecimal(score.toString()); + hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); + }); + return ResponseData.success(hashMap); + } + return null; + } + + /** + * 重点区域安防事态评估,统计重点区域6:00-23:00按小时分组数据 + */ + @GetMapping("/security/keyAreaStatistic") + @ResponseBody + public Object keyAreaStatistic() { + //查询各危险级别权重、各类别权重,放入map,避免循环中多次查数据库 + HashMap hazardScoreMap = new HashMap<>(); + List caseHazardLevelList = hazardLevelMapper.getCaseHazardLevelList(null); + caseHazardLevelList.forEach(hazardLevel -> { + hazardScoreMap.put(hazardLevel.getCode(), hazardLevel.getWeight()); + }); + HashMap categoryScoreMap = new HashMap<>(); + List categoryLevelList = categoryLevelMapper.getCaseCategoryLevelList(null); + categoryLevelList.forEach(categoryLevel -> { + categoryScoreMap.put(categoryLevel.getCode(), categoryLevel.getWeight()); + }); + HashMap hashMap = new HashMap<>(); + //今天数据按小时分组统计 + List caseInfos = caseInfoMapper.selectListByToday2(); + caseInfos.forEach(caseInfo -> { + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); + Double score = Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + String[] array = caseInfo.getHappenTime().split(":"); + String dayTime = array[0]; + BigDecimal preScore; + if(hashMap.containsKey(dayTime)){ + Double aDouble = hashMap.get(dayTime); + preScore = new BigDecimal(aDouble.toString()); + + }else{ + preScore = new BigDecimal("100.0"); + } + BigDecimal nowScore = new BigDecimal(score.toString()); + hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); + }); + return ResponseData.success(hashMap); + } + + /** + * 安防机动支援力量调配响应评估,根据事件已解决状态及已解决时间-发送时间,按时间(小时)分组统计 + */ + @GetMapping("/security/responseAssess") + @ResponseBody + public Object responseAssess() { + //查询各危险级别权重、各类别权重,放入map,避免循环中多次查数据库 + HashMap hazardScoreMap = new HashMap<>(); + List caseHazardLevelList = hazardLevelMapper.getCaseHazardLevelList(null); + caseHazardLevelList.forEach(hazardLevel -> { + hazardScoreMap.put(hazardLevel.getCode(), hazardLevel.getWeight()); + }); + HashMap hashMap = new HashMap<>(); + //今天数据按小时分组统计 + List caseInfos = caseInfoMapper.selectListByToday3(); + caseInfos.forEach(caseInfo -> { + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + //扣分=事件级别权重*未解决小时数 + Date updateTime = DateUtil.parse(caseInfo.getUpdateTime()); + Date happenTime = DateUtil.parse(caseInfo.getHappenTime()); + long between = DateUtil.between(updateTime, happenTime, DateUnit.HOUR); + Double score = Double.valueOf(hazardWeight)*between; + String[] array = caseInfo.getHappenTime().split(":"); + String dayTime = array[0]; + BigDecimal preScore; + if(hashMap.containsKey(dayTime)){ + Double aDouble = hashMap.get(dayTime); + preScore = new BigDecimal(aDouble.toString()); + }else{ + preScore = new BigDecimal("100.0"); + } + BigDecimal nowScore = new BigDecimal(score.toString()); + hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); + }); + return ResponseData.success(hashMap); + } /** * 重点区域威胁事件类型统计,优先级2,统计近7天和近30天 @@ -224,7 +413,34 @@ } /** - * 设备状态计算系数和评判,优先级3,需确认设备恢复时间是否可以获取 + * 近30天/近一周安保人员到岗排行 */ + + /** + * 安保等级评估,发生离岗事件减1分 + */ + @GetMapping("/security/levelAssess") + @ResponseBody + public Object securityLevelAssess() { + //今天数据按小时分组统计 + List resultList = caseInfoMapper.selectListByType(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); + resultList.forEach(result -> { + BigDecimal deScore = new BigDecimal(result.getQuantity()); + BigDecimal preScore = new BigDecimal("100.0"); + result.setScore(preScore.subtract(deScore).doubleValue()); + }); + return ResponseData.success(resultList); + } + + /** + * 设备状态计算系数和评判,即设备维修管理查询(不分页) + */ + @PostMapping("/device/repairList") + @ResponseBody + public Object repairList(@RequestBody DeviceRepairRequest deviceRepairRequest) { + List deviceRepairLogDTOS = deviceInfoService.deviceRepairListPage(deviceRepairRequest); + return ResponseData.success(deviceRepairLogDTOS); + } + } 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 fbf8ab6..c71a15a 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 @@ -1,13 +1,12 @@ package com.casic.missiles.modular.controller.hik; +import cn.hutool.core.date.DateTime; +import cn.hutool.core.date.DateUtil; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.casic.missiles.model.response.ResponseData; import com.casic.missiles.modular.dao.HikFaceGroupInfoMapper; -import com.casic.missiles.modular.dto.hik.EventSubscribeRequest; -import com.casic.missiles.modular.dto.hik.FaceGroupAdditionRequest; -import com.casic.missiles.modular.dto.hik.HikRecvEvent; -import com.casic.missiles.modular.dto.hik.OrgBatchAdd; +import com.casic.missiles.modular.dto.hik.*; import com.casic.missiles.modular.enums.HikUri; import com.casic.missiles.modular.enums.SecurityEventType; import com.casic.missiles.modular.model.CaseInfo; @@ -18,16 +17,20 @@ import com.casic.missiles.modular.util.CaseInfoFactoryUtil; import com.casic.missiles.modular.util.HikUtil; import com.casic.missiles.modular.util.ThreadPoolUtil; +import com.casic.missiles.modular.util.WebSocket; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; -import org.springframework.web.bind.annotation.*; +import org.springframework.util.CollectionUtils; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.RestController; -import java.net.InetAddress; -import java.net.UnknownHostException; import java.util.ArrayList; +import java.util.Iterator; import java.util.List; import java.util.Objects; @@ -38,7 +41,6 @@ */ @Slf4j @RestController -@RequestMapping("/hik") public class HikController { @Autowired @@ -53,28 +55,37 @@ @Autowired private HikService hikService; + @Autowired + private HikFaceGroupInfoMapper hikFaceGroupInfoMapper; + + @Autowired + private WebSocket webSocket; + @Value("${server.port}") private int serverPort; - @Autowired - private HikFaceGroupInfoMapper hikFaceGroupInfoMapper; /** * 海康事件订阅 */ - @PostMapping("/event/subscribe") + @PostMapping("/hik/event/subscribe") @ResponseBody - public Object eventSubscribe() throws UnknownHostException { + public Object eventSubscribe() { EventSubscribeRequest eventSubscribeRequest = new EventSubscribeRequest(); ArrayList list = new ArrayList<>(); list.add(SecurityEventType.DEVICE_OFFLINE); + list.add(SecurityEventType.DEVICE_ONLINE); list.add(SecurityEventType.KEY_PERSONNEL_IDENTIFY_EVENT); list.add(SecurityEventType.MONITORING_POINT_OFFLINE); + list.add(SecurityEventType.MONITORING_POINT_ONLINE); list.add(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); list.add(SecurityEventType.PERSONNEL_GATHER_EVENT); - InetAddress localHost = InetAddress.getLocalHost(); + list.add(SecurityEventType.VISITOR_REGISTER); + list.add(SecurityEventType.VISITOR_CHECKOUT); + list.add(SecurityEventType.HIGH_ALTITUDE_PARABOLIC); +// InetAddress localHost = InetAddress.getLocalHost(); eventSubscribeRequest.setEventTypes(list); - eventSubscribeRequest.setEventDest("https://" + localHost + ":" + serverPort + "/eventRcv"); + eventSubscribeRequest.setEventDest("http://" + "192.168.10.6" + ":" + serverPort + "/eventRcv"); //订阅类型,0-订阅原始事件,1-联动事件,2-原始事件和联动事件,不填使用默认值0 eventSubscribeRequest.setSubType(0); /** @@ -92,19 +103,25 @@ } /** + * 查询事件订阅信息 + */ + @PostMapping("/hik/event/query") + @ResponseBody + public Object eventQuery() { + String result = HikUtil.hikApi(HikUri.EVENT_INFO, ""); + return result; + } + + /** * 海康事件接收 */ @PostMapping("/eventRcv") @ResponseBody public Object eventRcv(@RequestBody HikRecvEvent hikRecvEvent) { //1、接收所需事件类型 - Long eventType = hikRecvEvent.getEventType(); + Number eventType = hikRecvEvent.getEventType(); log.info("接收到安防事件类型为:{}", eventType); CaseInfo caseInfo = caseInfoFactoryUtil.getCaseInfo(eventType); - //接收到不关心事件直接返回 - if(Objects.isNull(caseInfo)){ - return ResponseData.success(); - } //2、不同事件不同处理,caseInfoFactoryUtil已设置好事件基础定义信息 // 再为事件添加状态、设备编码、设备名称、位置、区域、时间 // 异步处理事件 @@ -114,19 +131,23 @@ caseHandle(hikRecvEvent, eventType, caseInfo); } })); +// caseHandle(hikRecvEvent, eventType, caseInfo); - return null; + return ResponseData.success(); } - private void caseHandle(HikRecvEvent hikRecvEvent, Long eventType, CaseInfo caseInfo) { + private void caseHandle(HikRecvEvent hikRecvEvent, Number eventType, CaseInfo caseInfo) { JSONArray eventArray = hikRecvEvent.getEventArray(); List caseInfos = new ArrayList<>(); - while (eventArray.stream().iterator().hasNext()) { + Iterator iterator = eventArray.iterator(); + while (iterator.hasNext()) { CaseInfo caseInfo1 = new CaseInfo(); - BeanUtils.copyProperties(caseInfo, caseInfo1); - JSONObject event = (JSONObject) eventArray.stream().iterator().next(); + if(!Objects.isNull(caseInfo)){ + BeanUtils.copyProperties(caseInfo, caseInfo1); + } + JSONObject event = (JSONObject) iterator.next(); //5种事件进行不同处理 - if(SecurityEventType.KEY_PERSONNEL_IDENTIFY_EVENT == eventType){ + if (SecurityEventType.KEY_PERSONNEL_IDENTIFY_EVENT.equals(eventType)) { //判断所属人脸分组 JSONObject data = (JSONObject) event.get("data"); JSONObject faceRecognitionResult = (JSONObject) data.get("faceRecognitionResult"); @@ -142,52 +163,101 @@ if (faceGroupCode.equals(blackListGroup.getFaceGroupCode())) { //黑名单分组处理 caseInfo1 = hikService.blackListHandle(event, caseInfo1); - }else if(faceGroupCode.equals(propertyPersonnelGroup.getFaceGroupCode())){ + } else if (faceGroupCode.equals(propertyPersonnelGroup.getFaceGroupCode())) { //考勤分组处理-物业人员,添加到考勤表 hikService.propertyAttendanceHandle(event); - }else if(faceGroupCode.equals(securityPersonnelGroup.getFaceGroupCode())){ + } else if (faceGroupCode.equals(securityPersonnelGroup.getFaceGroupCode())) { //考勤分组处理-安保人员,添加到考勤表 hikService.securityPersonnelHandle(event); - }else { + } else { return; } - }else if(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT == eventType){ + } else if (SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT.equals(eventType)) { //离岗事件处理 caseInfo1 = hikService.demobilizedHandle(event, caseInfo1); - }else if(SecurityEventType.PERSONNEL_GATHER_EVENT == eventType){ + } else if (SecurityEventType.PERSONNEL_GATHER_EVENT.equals(eventType)) { //人员聚集事件处理 caseInfo1 = hikService.personGatherHandle(event, caseInfo1); - }else if(SecurityEventType.MONITORING_POINT_OFFLINE == eventType){ + } else if (SecurityEventType.MONITORING_POINT_OFFLINE.equals(eventType)) { //监控点离线事件处理 caseInfo1 = hikService.monitorPointOfflineHandle(event, caseInfo1); - }else if(SecurityEventType.DEVICE_OFFLINE == eventType){ + } else if (SecurityEventType.MONITORING_POINT_ONLINE.equals(eventType)) { + //监控点上线事件处理 + hikService.monitorPointOnlineHandle(event); + } else if (SecurityEventType.DEVICE_OFFLINE.equals(eventType)) { //装置离线事件处理 caseInfo1 = hikService.deviceOfflineHandle(event, caseInfo1); - }else if(SecurityEventType.VISITOR_REGISTER == eventType){ + } else if (SecurityEventType.DEVICE_ONLINE.equals(eventType)) { + //装置上线处理 + hikService.deviceOnlineHandle(event); + } else if (SecurityEventType.VISITOR_REGISTER.equals(eventType)) { //记录访客登记记录,添加到访客记录表 hikService.visitorRegisterHandler(event); - }else if(SecurityEventType.VISITOR_CHECKOUT == eventType){ + } else if (SecurityEventType.VISITOR_CHECKOUT.equals(eventType)) { //记录访客签离记录 hikService.visitorCheckOutHandler(event); } - if(!Objects.isNull(caseInfo1) && !StringUtils.isEmpty(caseInfo1.getHappenTime())){ + if (!Objects.isNull(caseInfo1) && !StringUtils.isEmpty(caseInfo1.getHappenTime())) { caseInfos.add(caseInfo1); } } //3、安防事件入库 - if(!caseInfoService.insertCaseInfoBatch(caseInfos)){ - log.error("安防事件批量入库异常"); + if (!CollectionUtils.isEmpty(caseInfos) && !caseInfoService.insertCaseInfoBatch(caseInfos)) { + log.error("安防事件批量入库异常!"); } // TODO: 2022/8/15 webSocket推送 + if (CollectionUtils.isEmpty(caseInfos)) { + log.info("webSocket事件推送"); + webSocket.sendAllMessage(JSONObject.toJSONString(caseInfos)); + } return; } /** + * 以图搜图,前端用于轨迹追踪 + */ + @PostMapping("/hik/search/picture") + @ResponseBody + public Object searchPictures(@RequestBody SearchPicturesRequest searchPicturesRequest) { + DateTime startDateTime = DateUtil.parse(searchPicturesRequest.getStartTime()); + DateTime endDateTime = DateUtil.parse(searchPicturesRequest.getEndTime()); + String startTime = DateUtil.format(startDateTime, "yyyy-MM-dd'T'HH:mm:ss.SSSXXX"); + String endTime = DateUtil.format(endDateTime, "yyyy-MM-dd'T'HH:mm:ss.SSSXXX"); + searchPicturesRequest.setStartTime(startTime); + searchPicturesRequest.setEndTime(endTime); + String body = JSONObject.toJSONString(searchPicturesRequest); + String resultStr = HikUtil.hikApi(HikUri.SEARCH_PICTURES, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (!"0".equals(resultJson.get("code"))) { + log.error("请求海康,以图搜图失败,海康response:{}", resultStr); + return ResponseData.error("以图搜图失败"); + } + return ResponseData.success(resultJson); + } + + + /** + * 海康事件取消订阅 + */ + @PostMapping("/hik/event/cancel") + @ResponseBody + public Object eventCancelSubscribe(@RequestBody CancelSubscribeRequest cancelSubscribeRequest) { + String body = JSONObject.toJSONString(cancelSubscribeRequest); + String resultStr = HikUtil.hikApi(HikUri.EVENT_CANCEL, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (!"0".equals(resultJson.get("code"))) { + log.error("请求海康,取消订阅失败,海康response:{}", resultStr); + return ResponseData.error("取消订阅失败"); + } + return ResponseData.success(resultJson); + } + + /** * 单个添加海康人脸分组 * api->hik单个添加人脸分组api->response->mysql */ - @PostMapping("/faceGroup/single/add") + @PostMapping("/hik/faceGroup/single/add") @ResponseBody public Object faceGroupAddition(@RequestBody FaceGroupAdditionRequest faceGroupAdditionRequest) { String body = JSONObject.toJSONString(faceGroupAdditionRequest); @@ -212,7 +282,7 @@ * 批量添加海康组织 * api->hik批量添加组织api->response */ - @PostMapping("/org/batch/add") + @PostMapping("/hik/org/batch/add") @ResponseBody public Object orgBatchAdd(@RequestBody List orgBatchAddRequest) { String body = JSONObject.toJSONString(orgBatchAddRequest); @@ -232,4 +302,62 @@ return ResponseData.error("批量添加组织失败"); } + /** + * 获取人员列表 + */ + @PostMapping("/hik/person/personList") + @ResponseBody + public Object personList() { + PersonListRequest request = new PersonListRequest(); + request.setPageNo(1); + request.setPageSize(100); + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi("/api/resource/v2/person/personList", body); + return resultStr; + } + + /** + * 获取组织列表 + */ + @PostMapping("/hik/org/orgList") + @ResponseBody + public Object orgList() { + PersonListRequest request = new PersonListRequest(); + request.setPageNo(1); + request.setPageSize(100); + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi("/api/resource/v1/org/orgList", body); + return resultStr; + } + + /** + * 查询访客权限下载记录 + */ + @PostMapping("/hik/auth/result") + @ResponseBody + public Object authResult() { + PersonListRequest request = new PersonListRequest(); + request.setPageNo(1); + request.setPageSize(100); + request.setOrderId("ba101db6246711edaea66f7939a13638"); + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi("/api/visitor/v1/auth/result", body); + return resultStr; + } + + /** + * 人脸图片获取 + */ + @PostMapping("/hik/face/picture") + @ResponseBody + public Object facePicture() { + FaceRequest request = new FaceRequest(); +// List list = new ArrayList<>(); +// list.add(""); + request.setCertificateNum("wanggong"); + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi("/api/frs/v1/face", body); + return resultStr; + } + } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/AssetInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/AssetInfoMapper.java index 4f64e83..c0684ee 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/AssetInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/AssetInfoMapper.java @@ -17,6 +17,6 @@ @Mapper public interface AssetInfoMapper extends BaseMapper { - List getAssetInfoListPage(@Param("page") Page page, AssetInfoRequest assetInfoRequest); + List getAssetInfoListPage(@Param("page") Page page, @Param("assetInfoRequest") AssetInfoRequest assetInfoRequest); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/AttendanceInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/AttendanceInfoMapper.java index f9e793e..ec87e46 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/AttendanceInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/AttendanceInfoMapper.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.statistics.AttendanceNumberDTO; import com.casic.missiles.modular.dto.statistics.AttendanceRatioDTO; import com.casic.missiles.modular.model.AttendanceInfo; import org.apache.ibatis.annotations.Mapper; @@ -17,7 +18,7 @@ */ @Mapper public interface AttendanceInfoMapper extends BaseMapper { - List getAttendanceInfoListPage(@Param("page") Page page, StaffInfoRequest attendanceInfoRequest); + List getAttendanceInfoListPage(@Param("page") Page page, @Param("attendanceInfoRequest") StaffInfoRequest attendanceInfoRequest); AttendanceInfo selectByCodeAndDate(@Param("staffCode") String staffCode); @@ -26,4 +27,8 @@ List getCountByTypeAndDateForMonth(@Param("staffType")String staffType); List getCountByTypeAndDateForYear(@Param("staffType")String staffType); + + List getCountForWeek(); + + List getCountForDay(); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java index ce94b8f..6137a7d 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java @@ -17,5 +17,5 @@ @Mapper public interface BlackInfoMapper extends BaseMapper { - List getBlackInfoListPage(@Param("page") Page page, BlackInfoRequest blackInfoRequest); + List getBlackInfoListPage(@Param("page") Page page, @Param("blackInfoRequest") BlackInfoRequest blackInfoRequest); } 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 efda6b3..50aaa6f 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 @@ -20,7 +20,7 @@ List getCaseInfoListPage(@Param("page") Page page, @Param("caseInfoRequest") CaseInfoRequest caseInfoRequest); - int updateStatusById(CaseInfoRequest caseInfoRequest); + int updateStatusById(@Param("caseInfoRequest") CaseInfoRequest caseInfoRequest); List selectByLevelAndMonth(@Param("year") String year); @@ -47,4 +47,20 @@ List selectPreWeekCountByThirtyDay(); List selectPreDayCountBySevenDay(); + + Integer selectDemobilizedCount(@Param("eventType") Number personnelDemobilizedEvent); + + List selectPreMonthCount(); + + List selectListBySevenDay(); + + List selectListByToday(); + + List selectListByToday2(); + + List selectListByToday3(); + + List selectListByType(@Param("eventType") Number eventType); + + List selectDemobilizedCountByHour(@Param("eventType") Number eventType); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/CategoryLevelMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/CategoryLevelMapper.java index 52fc714..afe1650 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/CategoryLevelMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/CategoryLevelMapper.java @@ -17,9 +17,9 @@ @Mapper public interface CategoryLevelMapper extends BaseMapper { - List getCaseCategoryLevelListPage(@Param("page") Page page, CategoryLevelRequest categoryLevelRequest); + List getCaseCategoryLevelListPage(@Param("page") Page page, @Param("categoryLevelRequest") CategoryLevelRequest categoryLevelRequest); - List getCaseCategoryLevelList(CategoryLevelRequest categoryLevelRequest); + List getCaseCategoryLevelList(@Param("categoryLevelRequest") CategoryLevelRequest categoryLevelRequest); CaseCategoryLevel getCaseCategoryLevel(@Param("categoryLevelCode") String categoryLevelCode); 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 66353b1..2555a09 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 @@ -19,7 +19,7 @@ @Mapper public interface DeviceInfoMapper extends BaseMapper { - List getDeviceInfoListPage(@Param("page") Page page, DeviceInfoRequest deviceInfoRequest); + List getDeviceInfoListPage(@Param("page") Page page, @Param("deviceInfoRequest") DeviceInfoRequest deviceInfoRequest); List getDeviceInfoList(@Param("deviceInfoRequest") DeviceInfoRequest deviceInfoRequest); @@ -27,6 +27,8 @@ DeviceInfo getByIndexCode(@Param("srcIndex") String srcIndex); + DeviceInfo getByIp(@Param("ip") String ip); + List selectIndexCodesByCodes(@Param("deviceCodes") List deviceCodes); List selectByType(@Param("devType") String devType); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java index 41dd0af..5bfaf63 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java @@ -5,6 +5,7 @@ import com.casic.missiles.modular.dto.DeviceRepairRequest; import com.casic.missiles.modular.model.DeviceRepairLog; import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; import java.util.List; @@ -16,7 +17,7 @@ @Mapper public interface DeviceRepairLogMapper extends BaseMapper { - List getDeviceRepairListPage(Page page, DeviceRepairRequest deviceRepairRequest); + List getDeviceRepairListPage(@Param("page") Page page, @Param("deviceRepairRequest")DeviceRepairRequest deviceRepairRequest); - List getDeviceRepairList(DeviceRepairRequest deviceRepairRequest); + List getDeviceRepairList(@Param("deviceRepairRequest") DeviceRepairRequest deviceRepairRequest); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java index 9035c47..4823ac1 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java @@ -18,7 +18,7 @@ @Mapper public interface FireEquipInfoMapper extends BaseMapper { - List getFireEquipInfoListPage(@Param("page") Page page, FireEquipRequest fireEquipRequest); + List getFireEquipInfoListPage(@Param("page") Page page, @Param("fireEquipRequest") FireEquipRequest fireEquipRequest); FireEquipInfo getFireEquipInfo(@Param("equipCode") String equipCode); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/GateGroupMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/GateGroupMapper.java index d8c330d..977a427 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/GateGroupMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/GateGroupMapper.java @@ -17,7 +17,7 @@ */ @Mapper public interface GateGroupMapper extends BaseMapper { - List getGateGroupListPage(@Param("page") Page page, GateGroupRequest gateGroupRequest); + List getGateGroupListPage(@Param("page") Page page, @Param("gateGroupRequest") GateGroupRequest gateGroupRequest); GateGroup getGateGroupByName(@Param("groupName") String groupName); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/HazardLevelMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/HazardLevelMapper.java index 8957780..dcf47bb 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/HazardLevelMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/HazardLevelMapper.java @@ -17,11 +17,13 @@ @Mapper public interface HazardLevelMapper extends BaseMapper { - List getCaseHazardLevelListPage(@Param("page") Page page, HazardLevelRequest hazardLevelRequest); + List getCaseHazardLevelListPage(@Param("page") Page page, @Param("hazardLevelRequest") HazardLevelRequest hazardLevelRequest); - List getCaseHazardLevelList(HazardLevelRequest hazardLevelRequest); + List getCaseHazardLevelList(@Param("hazardLevelRequest") HazardLevelRequest hazardLevelRequest); CaseHazardLevel getCaseHazardLevel(@Param("hazardLevelCode") String hazardLevelCode); List selectHazardName(); + + String selectHazardNameByCode(@Param("hazardLevelCode") String hazardLevelCode); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/HikCaseDefineMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/HikCaseDefineMapper.java index 0dc47d1..f162fef 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/HikCaseDefineMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/HikCaseDefineMapper.java @@ -12,5 +12,5 @@ */ @Mapper public interface HikCaseDefineMapper extends BaseMapper { - HikCaseDefine getHikCaseDefine(@Param("caseTypeCode") Long caseTypeCode); + HikCaseDefine getHikCaseDefine(@Param("caseTypeCode") Number caseTypeCode); } 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 f8a674c..fe5afc2 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 @@ -17,11 +17,13 @@ @Mapper public interface StaffInfoMapper extends BaseMapper { - List getStaffInfoListPage(@Param("page") Page page, StaffInfoRequest staffInfoRequest); + List getStaffInfoListPage(@Param("page") Page page, @Param("staffInfoRequest") StaffInfoRequest staffInfoRequest); StaffInfo selectByCode(@Param("staffCode") String staffCode); - List getStaffInfoList(StaffInfoRequest staffInfoRequest); + List getStaffInfoList(@Param("staffInfoRequest") StaffInfoRequest staffInfoRequest); - List selectBatchCodes(List list); + List selectBatchCodes(@Param("list") List list); + + int updateByCodeForCard(@Param("staffCode") String staffCode, @Param("cardNo") String cardNo); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitInfoMapper.java index b1217c5..6c52542 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitInfoMapper.java @@ -16,7 +16,7 @@ */ @Mapper public interface VisitInfoMapper extends BaseMapper { - List getVisitInfoListPage(@Param("page") Page page, VisitorRequest visitorRequest); + List getVisitInfoListPage(@Param("page") Page page, @Param("visitorRequest") VisitorRequest visitorRequest); VisitInfo selectByOrderId(@Param("orderId") String orderId); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitorApplyMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitorApplyMapper.java index c09f3c0..6ea55bd 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitorApplyMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitorApplyMapper.java @@ -18,7 +18,7 @@ @Mapper public interface VisitorApplyMapper extends BaseMapper { - List getVisitorApplyListPage(@Param("page") Page page, VisitorApplyRequest visitorApplyRequest); + List getVisitorApplyListPage(@Param("page") Page page, @Param("visitorApplyRequest") VisitorApplyRequest visitorApplyRequest); List selectByVisitReason(); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/AttendanceInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/AttendanceInfoMapper.xml index b2ece71..f8bdd6e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/AttendanceInfoMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/AttendanceInfoMapper.xml @@ -43,7 +43,8 @@ and staff_type = #{staffType} - and YEARWEEK(date_format(atte_date, '%Y-%m-%d'), 1) = YEARWEEK(now(),1); + AND DATE_SUB(CURDATE(), INTERVAL 7 DAY) <= DATE(atte_date) + GROUP BY DATE_FORMAT(atte_date, '%Y-%m-%d') @@ -69,4 +70,20 @@ GROUP BY DATE_FORMAT(atte_date, '%Y-%m') + + + \ No newline at end of file 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 2b6953f..06ec0a8 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 @@ -28,7 +28,9 @@ @@ -87,7 +89,8 @@ SELECT hazard_level_code as levelCode, count(id) as quantity FROM bus_case_info WHERE hazard_level_code is not null - AND DATE_SUB(CURDATE(), INTERVAL 7 DAY) <= date(happen_time); + AND is_key_area = 1 + AND DATE_SUB(CURDATE(), INTERVAL 7 DAY) <= date(happen_time) GROUP BY hazard_level_code @@ -95,7 +98,8 @@ SELECT hazard_level_code as levelCode, count(id) as quantity FROM bus_case_info WHERE hazard_level_code is not null - AND DATE_SUB(CURDATE(), INTERVAL 30 DAY) <= date(happen_time); + AND is_key_area = 1 + AND DATE_SUB(CURDATE(), INTERVAL 30 DAY) <= date(happen_time) GROUP BY hazard_level_code @@ -122,4 +126,71 @@ AND hazard_level_code is not null GROUP BY DATE_FORMAT(happen_time,'%Y-%m-%d') + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/CategoryLevelMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/CategoryLevelMapper.xml index 4670b1f..1d25cbd 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/CategoryLevelMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/CategoryLevelMapper.xml @@ -20,11 +20,11 @@ SELECT * FROM bus_case_category_level WHERE 1=1 - - and code = #{code} + + and code = #{categoryLevelRequest.code} - - and name = #{name} + + and name = #{categoryLevelRequest.name} ORDER by create_time DESC 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 9b66fd8..bfd84b7 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 @@ -98,4 +98,10 @@ #{item} + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceRepairLogMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceRepairLogMapper.xml index 078ed3c..cf1a481 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceRepairLogMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceRepairLogMapper.xml @@ -22,14 +22,14 @@ SELECT * FROM bus_device_repair_log WHERE 1=1 - - and device_code = #{devCode} + + and device_code = #{deviceRepairRequest.devCode} - - and device_name = #{devName} + + and device_name = #{deviceRepairRequest.devName} - - and DATE_FORMAT(create_time,"%y%m%d") = DATE_FORMAT(#{createTime},"%y%m%d") + + and DATE_FORMAT(create_time,"%y%m%d") = DATE_FORMAT(#{deviceRepairRequest.createTime},"%y%m%d") ORDER by create_time DESC diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/HazardLevelMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/HazardLevelMapper.xml index f16f2b9..458322b 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/HazardLevelMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/HazardLevelMapper.xml @@ -20,11 +20,11 @@ SELECT * FROM bus_case_hazard_level WHERE 1=1 - - and code = #{code} + + and code = #{hazardLevelRequest.code} - - and name = #{name} + + and name = #{hazardLevelRequest.name} ORDER by create_time DESC @@ -42,4 +42,10 @@ SELECT name FROM bus_case_hazard_level + + \ 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 557237e..b6a183a 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 @@ -50,4 +50,10 @@ + + + UPDATE bus_staff_info + SET card_no = #{cardNo} + WHERE staff_code = #{staffCode} + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitInfoMapper.xml index 84aa84f..230529a 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitInfoMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitInfoMapper.xml @@ -27,5 +27,6 @@ SELECT * FROM bus_visit_info WHERE order_id = #{orderId} and DATE_FORMAT(in_time,'%Y-%m-%d') = CURRENT_DATE + limit 1 \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/BlackPictureRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/BlackPictureRequest.java new file mode 100644 index 0000000..fc92701 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/BlackPictureRequest.java @@ -0,0 +1,14 @@ +package com.casic.missiles.modular.dto; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/29 19:26 + */ +@Data +public class BlackPictureRequest { + private String picUri; + private String serverIndexCode; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/CancelSubscribeRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/CancelSubscribeRequest.java new file mode 100644 index 0000000..e2d390a --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/CancelSubscribeRequest.java @@ -0,0 +1,15 @@ +package com.casic.missiles.modular.dto.hik; + +import lombok.Data; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/24 15:14 + */ +@Data +public class CancelSubscribeRequest { + private List eventTypes; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/CardInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/CardInfo.java new file mode 100644 index 0000000..341457d --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/CardInfo.java @@ -0,0 +1,24 @@ +package com.casic.missiles.modular.dto.hik; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/26 16:08 + */ +@Data +public class CardInfo { + //卡号,8~20个字符,支持数字和大写字母 + private String cardNo; + //人员ID,员工工号 + private String personId; + //人员所属组织IndexCode + private String orgIndexCode; + //卡片类型,默认是1:IC卡 + //1:IC卡 + //2:CPU卡 + //3:远距离卡 + //4:MIFARE卡 + private Number cardType; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/FaceRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/FaceRequest.java new file mode 100644 index 0000000..edc04bf --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/FaceRequest.java @@ -0,0 +1,16 @@ +package com.casic.missiles.modular.dto.hik; + +import lombok.Data; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/25 16:53 + */ +@Data +public class FaceRequest { + private String certificateNum; + private List indexCodes; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/HikRecvEvent.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/HikRecvEvent.java index a3e9845..1b2b2b1 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/HikRecvEvent.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/HikRecvEvent.java @@ -28,12 +28,12 @@ /** * 事件类型,用于判断所需接收到的事件类型 */ - public Long getEventType(){ + public Number getEventType(){ JSONObject jsonObject = (JSONObject)JSONObject.toJSON(params); //事件类别对应SecurityEventTypeEnum JSONArray eventTypeArray = (JSONArray)jsonObject.get("events"); JSONObject eventJsonObject = (JSONObject)JSONObject.toJSON(eventTypeArray.get(0)); - Long eventType = (Long) eventJsonObject.get("eventType"); + Number eventType = (Number) eventJsonObject.get("eventType"); return eventType; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonBatchDeleteRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonBatchDeleteRequest.java index 027d31d..9751929 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonBatchDeleteRequest.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonBatchDeleteRequest.java @@ -12,4 +12,6 @@ @Data public class PersonBatchDeleteRequest { private List personIds; + //删除人脸接口使用 + private String faceId; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonInfoRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonInfoRequest.java new file mode 100644 index 0000000..05dc9e1 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonInfoRequest.java @@ -0,0 +1,20 @@ +package com.casic.missiles.modular.dto.hik; + +import lombok.Data; + +import java.util.List; + +/** + * @Description: 获取员工照片请求实体 + * @Author: wangpeng + * @Date: 2022/8/25 16:53 + */ +@Data +public class PersonInfoRequest { + //获取员工详细信息使用 + private String paramName; + private List paramValue; + //获取照片使用 + private String picUri; + private String serverIndexCode; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonListRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonListRequest.java new file mode 100644 index 0000000..3f7149b --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonListRequest.java @@ -0,0 +1,16 @@ +package com.casic.missiles.modular.dto.hik; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/25 16:53 + */ +@Data +public class PersonListRequest { + private Number pageNo; + private Number pageSize; + + private String orderId; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/SearchPicturesRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/SearchPicturesRequest.java new file mode 100644 index 0000000..0a95966 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/SearchPicturesRequest.java @@ -0,0 +1,24 @@ +package com.casic.missiles.modular.dto.hik; + +import lombok.Data; + +import java.util.List; + +/** + * @Description: 以图搜图请求 + * @Author: wangpeng + * @Date: 2022/8/29 10:46 + */ +@Data +public class SearchPicturesRequest { + private String facePicBinaryData; + private String facePicUrl; + private List cameraIndexCodes; + private String startTime; + private String endTime; + //指定搜图的最小相似度,最小为1,最大为100 + private String minSimilarity; + private Number age; + //male-男性,female-女性 + private String sex; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/StaffCardRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/StaffCardRequest.java new file mode 100644 index 0000000..4052e6d --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/StaffCardRequest.java @@ -0,0 +1,20 @@ +package com.casic.missiles.modular.dto.hik; + +import lombok.Data; + +import java.util.List; + +/** + * @Description: 人员开卡请求实体 + * @Author: wangpeng + * @Date: 2022/8/26 16:05 + */ +@Data +public class StaffCardRequest { + //卡片开始有效时间,时间格式:yyyy-MM-dd + private String startDate; + //卡片截止有效时间,时间格式:yyyy-MM-dd,不能大于2037年12月31日 + private String endDate; + //cardList,待开卡列表,最大支持50张卡 + private List cardList; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/VisitorInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/VisitorInfo.java index 73aa316..b99f301 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/VisitorInfo.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/VisitorInfo.java @@ -14,7 +14,7 @@ //访客性别 //1: 男 //2: 女 - private String gender; + private Integer gender; //联系电话建议填写手机号码 private String phoneNo; //证件类型 diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/ApplyReasonGroupDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/ApplyReasonGroupDTO.java index 514f382..786143e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/ApplyReasonGroupDTO.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/ApplyReasonGroupDTO.java @@ -13,4 +13,6 @@ private String visitReason; //访问人数 private Integer quantity; + //占比 + private String ratio; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/AttendanceNumberDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/AttendanceNumberDTO.java new file mode 100644 index 0000000..a494321 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/AttendanceNumberDTO.java @@ -0,0 +1,24 @@ +package com.casic.missiles.modular.dto.statistics; + +import com.fasterxml.jackson.annotation.JsonIgnore; +import lombok.Data; + +/** + * @Description: 出勤人数统计实体 + * @Author: wangpeng + * @Date: 2022/8/31 19:24 + */ +@Data +public class AttendanceNumberDTO { + //日期维度,周、今日,入参 + @JsonIgnore + private String dateDimension; + + //日期,具体天/小时,出参 + private String date; + //出勤人数 + private String quantity; + //员工类型 + private String staffType; + +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/BlackListController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/BlackListController.java index a27f9f8..0c06661 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/BlackListController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/BlackListController.java @@ -1,13 +1,18 @@ package com.casic.missiles.modular.controller; +import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.base.controller.ExportController; import com.casic.missiles.core.page.PageFactory; import com.casic.missiles.model.response.ResponseData; import com.casic.missiles.modular.dto.BlackInfoRequest; +import com.casic.missiles.modular.dto.BlackPictureRequest; +import com.casic.missiles.modular.dto.hik.PersonInfoRequest; +import com.casic.missiles.modular.enums.HikUri; import com.casic.missiles.modular.enums.OperateTypeEnum; import com.casic.missiles.modular.model.BlackInfo; import com.casic.missiles.modular.service.BlackInfoService; +import com.casic.missiles.modular.util.HikUtil; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; @@ -56,4 +61,22 @@ return null; } + /** + * 黑名单人员照片 + */ + @PostMapping("/personPicture") + @ResponseBody + public Object personPicture(@RequestBody BlackPictureRequest blackPictureRequest){ + //获取照片 + String picUri = blackPictureRequest.getPicUri(); + String serverIndexCode = blackPictureRequest.getServerIndexCode(); + PersonInfoRequest picRequest = new PersonInfoRequest(); + picRequest.setPicUri(picUri); + picRequest.setServerIndexCode(serverIndexCode); + String reBody = JSONObject.toJSONString(picRequest); + //重定向地址获取 + String url = HikUtil.hikApiFor302(HikUri.PERSON_PICTURE, reBody); + return ResponseData.success(url); + } + } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/DeviceController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/DeviceController.java index e1c4eba..666bbee 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/DeviceController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/DeviceController.java @@ -107,7 +107,7 @@ } /** - * 设备维修管理查询(分页),需计算MTTR=总维修时间/故障次数 + * 设备状态计算与评判/设备维修管理查询(分页),需计算MTTR=总维修时间/故障次数 */ @PostMapping("/repair/listPage") @ResponseBody @@ -211,7 +211,7 @@ //需根据设备编号获取到对应的门禁点唯一标识 doorControlRequest.setDoorIndexCodes(indexCodes); doorControlRequest.setControlType(Integer.valueOf(gateGroupDTO.getStatus())); - String body = JSONObject.toJSONString(deviceCodes); + String body = JSONObject.toJSONString(doorControlRequest); String resultStr = HikUtil.hikApi(HikUri.DOOR_CONTROL, body); JSONObject resultJson = (JSONObject)JSONObject.parse(resultStr); if (!"0".equals(resultJson.get("code"))) { diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/StaffController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/StaffController.java index b58ccab..704093c 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/StaffController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/StaffController.java @@ -2,15 +2,21 @@ import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.util.StrUtil; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.base.controller.ExportController; import com.casic.missiles.core.page.PageFactory; import com.casic.missiles.model.response.ErrorResponseData; import com.casic.missiles.model.response.ResponseData; import com.casic.missiles.modular.dto.StaffInfoRequest; +import com.casic.missiles.modular.dto.hik.PersonInfoRequest; +import com.casic.missiles.modular.dto.hik.StaffCardRequest; +import com.casic.missiles.modular.enums.HikUri; import com.casic.missiles.modular.enums.OperateTypeEnum; import com.casic.missiles.modular.model.StaffInfo; import com.casic.missiles.modular.service.StaffInfoService; +import com.casic.missiles.modular.util.HikUtil; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; @@ -110,4 +116,60 @@ } return ResponseData.success(); } + + /** + * 批量开卡,添加人员之后调用,若在一个接口中添加人员成功开卡失败则第二次添加时会有问题 + */ + @PostMapping("/cardBinding") + @ResponseBody + public Object cardBinding(@RequestBody StaffCardRequest staffCardRequest) { + String body = JSONObject.toJSONString(staffCardRequest); + String resultStr = HikUtil.hikApi(HikUri.CARD_BINDING, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (!"0".equals(resultJson.get("code"))) { + log.error("请求海康,批量开卡失败,海康response:{}", resultStr); + return ResponseData.error("批量开卡失败"); + } + //保存卡号 + if(staffInfoService.saveCardInfo(staffCardRequest) > 0){ + return ResponseData.success(); + } + return ResponseData.error("批量开卡失败"); + } + + /** + * 获取员工照片,海康存储 + */ + @PostMapping("/personPicture/{staffCode}") + @ResponseBody + public Object personPicture(@PathVariable("staffCode") String staffCode){ + //获取员工详细信息,含图片服务器、uri + PersonInfoRequest request = new PersonInfoRequest(); + List list = new ArrayList<>(); + list.add(staffCode); + request.setParamName("personId"); + request.setParamValue(list); + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi(HikUri.PERSON_INFO, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (!"0".equals(resultJson.get("code"))) { + log.error("请求海康,根据人员唯一字段获取人员详细信息失败,海康response:{}", resultStr); + return ResponseData.error("获取员工照片失败"); + } + //获取照片 + JSONObject data = (JSONObject) resultJson.get("data"); + JSONArray dataArray = (JSONArray) data.get("list"); + JSONObject jsonObject = (JSONObject) dataArray.get(0); + JSONArray personPhoto = (JSONArray) jsonObject.get("personPhoto"); + JSONObject photo = (JSONObject) personPhoto.get(0); + String picUri = photo.getString("picUri"); + String serverIndexCode = photo.getString("serverIndexCode"); + PersonInfoRequest picRequest = new PersonInfoRequest(); + picRequest.setPicUri(picUri); + picRequest.setServerIndexCode(serverIndexCode); + String reBody = JSONObject.toJSONString(picRequest); + //重定向地址获取 + String url = HikUtil.hikApiFor302(HikUri.PERSON_PICTURE, reBody); + return ResponseData.success(url); + } } 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 4a07dd9..7b1dcf6 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 @@ -16,6 +16,7 @@ import com.casic.missiles.modular.redis.key.CacheKeys; import com.casic.missiles.modular.service.CockpitService; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.util.CollectionUtils; import org.springframework.web.bind.annotation.*; @@ -24,10 +25,7 @@ import java.text.NumberFormat; import java.time.LocalDateTime; import java.time.temporal.ChronoUnit; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.util.*; import java.util.stream.Collectors; /** @@ -73,6 +71,9 @@ private StatisticNumberMapper numberMapper; @Autowired + private HazardLevelMapper hazardLevelMapper; + + @Autowired private AccessGroupConfig accessGroupConfig; /** @@ -104,8 +105,24 @@ public Object buildingNumberPerHour(){ //当天按小时分组的人数 List list = numberMapper.selectListByTime(); - Map> collect = list.stream().collect(Collectors.groupingBy(BuildingNumberDTO::getStatisticPosition)); - return ResponseData.success(collect); + Map> collect = list.stream().collect(Collectors.groupingBy(BuildingNumberDTO::getStatisticTime)); + //定时任务中已将每小时三栋楼人数存到数据库 + //将一期主楼和录制楼人数合并,二期单算 + List> resultList = new ArrayList<>(); + collect.keySet().forEach(key -> { + List buildingNumberDTOS = collect.get(key); + BuildingNumberDTO mainBuildingOne = buildingNumberDTOS.get(0); + BuildingNumberDTO mainBuildingTwo = buildingNumberDTOS.get(1); + BuildingNumberDTO recordingBuilding = buildingNumberDTOS.get(2); + HashMap resultMap = new HashMap<>(); + Integer oneQuantity = Integer.valueOf(mainBuildingOne.getStatisticQuantity()); + Integer recordingQuantity = Integer.valueOf(recordingBuilding.getStatisticQuantity()); + resultMap.put("staticTime", mainBuildingOne.getStatisticTime()); + resultMap.put(mainBuildingOne.getStatisticPositionName()+"、"+recordingBuilding.getStatisticPositionName(), String.valueOf(oneQuantity+recordingQuantity)); + resultMap.put(mainBuildingTwo.getStatisticPositionName(), mainBuildingTwo.getStatisticQuantity()); + resultList.add(resultMap); + }); + return ResponseData.success(resultList); } /** @@ -151,12 +168,11 @@ public Object securityNumber() { QueryWrapper wrapper = new QueryWrapper<>(); wrapper.eq("staff_type", 2); + // TODO: 2022/9/2 后续使用产品确定的每天出勤的安保人员的数量 Integer total = staffInfoMapper.selectCount(wrapper); - //当日离岗事件个数 - QueryWrapper wrapper1 = new QueryWrapper<>(); - wrapper1.eq("hik_event_type", SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); - wrapper1.apply("date_format(now(),'%Y-%m-%d') = date_format(happen_time,'%Y-%m-%d')"); - Integer leave = caseInfoMapper.selectCount(wrapper1); + //当日离岗事件按设备去重后的个数 + // TODO: 2022/9/2 目前相当于24小时内的计算,之后看需要可改成自定义小时数计算离岗率,即离岗+6小时内仅一次离岗则恢复为100%,多次则累加离岗次数计算离岗率 + Integer leave = caseInfoMapper.selectDemobilizedCount(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); NumberFormat numberFormat = NumberFormat.getInstance(); // 设置精确到小数点后2位 numberFormat.setMaximumFractionDigits(2); @@ -179,7 +195,6 @@ @ResponseBody public Object visitorApplyDetail() { List reasonGroup = applyMapper.selectByVisitReason(); - HashMap resultMap = new HashMap<>(); NumberFormat numberFormat = NumberFormat.getInstance(); // 设置精确到小数点后2位 numberFormat.setMaximumFractionDigits(2); @@ -187,12 +202,17 @@ if(0 == sum){ return ResponseData.success(); } + List resultList = new ArrayList<>(); reasonGroup.forEach(group -> { String reasonName = dictService.getDictNameByCode(SecurityEventDict.VISIT_REASON, group.getVisitReason()); String result = numberFormat.format((float) group.getQuantity() / (float) sum * 100); - resultMap.put(reasonName, result+"%"); + ApplyReasonGroupDTO applyReasonGroupDTO = new ApplyReasonGroupDTO(); + applyReasonGroupDTO.setQuantity(group.getQuantity()); + applyReasonGroupDTO.setVisitReason(reasonName); + applyReasonGroupDTO.setRatio(result+"%"); + resultList.add(applyReasonGroupDTO); }); - return ResponseData.success(resultMap); + return ResponseData.success(resultList); } /** @@ -247,6 +267,32 @@ } /** + * 机动力量实时在岗率,在岗人数除以总应在岗人数,用离岗+6小时内恢复为100%,6小时外再计算 + */ + @GetMapping("/staff/beOnDutyRatio") + @ResponseBody + public Object beOnDutyRatio() { + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("staff_type", 2); + // TODO: 2022/9/2 后续使用产品确定的每天出勤的安保人员的数量 + Integer total = staffInfoMapper.selectCount(wrapper); + if(0 == total){ + return ResponseData.success(null); + } + //当日离岗事件按设备去重后的个数 + // TODO: 2022/9/2 目前相当于24小时内的计算,之后看需要可改成自定义小时数计算离岗率,即离岗+6小时内仅一次离岗则恢复为100%,多次则累加离岗次数计算离岗率 + List onDutyRatioDTOS = caseInfoMapper.selectDemobilizedCountByHour(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); + onDutyRatioDTOS.forEach(dto -> { + NumberFormat numberFormat = NumberFormat.getInstance(); + // 设置精确到小数点后2位 + numberFormat.setMaximumFractionDigits(2); + String result = numberFormat.format(100 - Float.valueOf(dto.getQuantity()) / (float) total * 100); + dto.setRatio(result+"%"); + }); + return ResponseData.success(onDutyRatioDTOS); + } + + /** * 闸机速通门统计-设备状态分组计算数量,devType传闸机字典key * 视频频监控摄像机统计-设备状态分组计算数量,devType传摄像头字典key */ @@ -262,12 +308,17 @@ if(sum <= 0){ return ResponseData.error("无该类设备信息"); } + List resultList = new ArrayList<>(); gateStatusGroup.forEach(group -> { String devStatus = dictService.getDictNameByCode(SecurityEventDict.DEVICE_STATUS, group.getStatus()); String result = numberFormat.format((float) group.getQuantity() / (float) sum * 100); - resultMap.put(devStatus, result+"%"); + GateStatusGroupResponse gateStatusGroupResponse = new GateStatusGroupResponse(); + gateStatusGroupResponse.setStatus(devStatus); + gateStatusGroupResponse.setRatio(result+"%"); + resultList.add(gateStatusGroupResponse); }); - resultMap.put("总", sum); + resultMap.put("total", sum); + resultMap.put("list", resultList); return ResponseData.success(resultMap); } @@ -282,17 +333,38 @@ String position = securityScoreDTO.getPosition(); List caseInfos = caseInfoMapper.selectByPosition(position); //查询各危险级别权重、各类别权重,放入map,避免循环中多次查数据库 - + HashMap hazardScoreMap = new HashMap<>(); + List caseHazardLevelList = hazardLevelMapper.getCaseHazardLevelList(null); + caseHazardLevelList.forEach(hazardLevel -> { + hazardScoreMap.put(hazardLevel.getCode(), hazardLevel.getWeight()); + }); + HashMap categoryScoreMap = new HashMap<>(); + List categoryLevelList = categoryLevelMapper.getCaseCategoryLevelList(null); + categoryLevelList.forEach(categoryLevel -> { + categoryScoreMap.put(categoryLevel.getCode(), categoryLevel.getWeight()); + }); + //事件按楼层分组,计算 List securityScoreDTOs = new ArrayList<>(); caseInfos.forEach(caseInfo -> { SecurityScoreDTO securityScoreDTO1 = new SecurityScoreDTO(); + securityScoreDTO1.setPosition(caseInfo.getPosition()); securityScoreDTO1.setArea(caseInfo.getArea()); - // TODO: 2022/8/4 楼层评分计算根据产品定义调整 -// caseInfo.get -// securityScoreDTO1.setScore(); + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); + Double score = 100 - Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + securityScoreDTO1.setScore(score); + securityScoreDTOs.add(securityScoreDTO1); }); - - return null; + 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); + }); + return ResponseData.success(securityScoreDTOs); } /** @@ -303,9 +375,13 @@ public Object SecurityFrequency(@RequestBody SecurityFrequencyDTO securityFrequencyDTO) { String year = securityFrequencyDTO.getYear(); String month = securityFrequencyDTO.getMonth(); - Integer quantity = caseInfoMapper.selectCountByMonth(year, month); - securityFrequencyDTO.setQuantity(quantity); - return ResponseData.success(securityFrequencyDTO); + if(!StringUtils.isEmpty(year) && StringUtils.isEmpty(month)){ + Integer quantity = caseInfoMapper.selectCountByMonth(year, month); + securityFrequencyDTO.setQuantity(quantity); + return ResponseData.success(securityFrequencyDTO); + } + List list = caseInfoMapper.selectPreMonthCount(); + return ResponseData.success(list); } } 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 ae4d770..f4f075c 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 @@ -1,20 +1,25 @@ package com.casic.missiles.modular.controller.cockpit; +import cn.hutool.core.date.DateUnit; import cn.hutool.core.date.DateUtil; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.casic.missiles.model.response.ResponseData; -import com.casic.missiles.modular.dao.AttendanceInfoMapper; -import com.casic.missiles.modular.dao.CaseInfoMapper; -import com.casic.missiles.modular.dao.HazardLevelMapper; -import com.casic.missiles.modular.dao.StaffInfoMapper; +import com.casic.missiles.modular.dao.*; +import com.casic.missiles.modular.dto.DeviceRepairLogDTO; +import com.casic.missiles.modular.dto.DeviceRepairRequest; import com.casic.missiles.modular.dto.statistics.*; +import com.casic.missiles.modular.enums.SecurityEventType; +import com.casic.missiles.modular.model.CaseCategoryLevel; import com.casic.missiles.modular.model.CaseHazardLevel; +import com.casic.missiles.modular.model.CaseInfo; import com.casic.missiles.modular.model.StaffInfo; +import com.casic.missiles.modular.service.DeviceInfoService; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.util.CollectionUtils; import org.springframework.web.bind.annotation.*; +import java.math.BigDecimal; import java.text.NumberFormat; import java.util.*; import java.util.stream.Collectors; @@ -40,6 +45,12 @@ @Autowired private HazardLevelMapper hazardLevelMapper; + @Autowired + private CategoryLevelMapper categoryLevelMapper; + + @Autowired + private DeviceInfoService deviceInfoService; + /** * 安防事件时域频次统计,每月的每天安防事件个数(原方案) * 月维度:展示每个月的每天的数据 @@ -89,15 +100,17 @@ List monthList = caseInfoMapper.selectPreMonthCountByYear(year); Map> collect = monthList.stream().collect(Collectors.groupingBy(PreMonthOrWeekCaseDTO::getHazardLevelCode)); HashMap strAvgMap = new HashMap<>(); + List resultList = new ArrayList<>(); for (String key : collect.keySet()) { List preMonthOrWeekCaseDTOS = collect.get(key); int sum = preMonthOrWeekCaseDTOS.stream().mapToInt(PreMonthOrWeekCaseDTO::getQuantity).sum(); //若年份是本年,则使用个安防级别数量/当前月份数 //若不是本年,除数为12 MonthAndWeekDTO monthAndWeekDTO = new MonthAndWeekDTO(); + String hazardName = hazardLevelMapper.selectHazardNameByCode(key); + monthAndWeekDTO.setLevelName(hazardName); if(year.equals(String.valueOf(DateUtil.thisYear()))){ monthAndWeekDTO.setMonthQuantity(sum / DateUtil.thisMonth()); -// monthAndWeekDTO.setLevelName(); strAvgMap.put(key, monthAndWeekDTO); }else{ monthAndWeekDTO.setMonthQuantity(sum / 12); @@ -113,27 +126,37 @@ if(year.equals(String.valueOf(DateUtil.thisYear()))){ if(!Objects.isNull(strAvgMap.get(key))){ MonthAndWeekDTO monthAndWeekDTO = strAvgMap.get(key); + String hazardName = hazardLevelMapper.selectHazardNameByCode(key); + monthAndWeekDTO.setLevelName(hazardName); monthAndWeekDTO.setWeekQuantity(sum / DateUtil.thisWeekOfYear()); strAvgMap.put(key, monthAndWeekDTO); }else{ MonthAndWeekDTO monthAndWeekDTO = new MonthAndWeekDTO(); + String hazardName = hazardLevelMapper.selectHazardNameByCode(key); + monthAndWeekDTO.setLevelName(hazardName); monthAndWeekDTO.setWeekQuantity(sum / DateUtil.thisWeekOfYear()); strAvgMap.put(key, monthAndWeekDTO); } }else{ if(!Objects.isNull(strAvgMap.get(key))){ MonthAndWeekDTO monthAndWeekDTO = strAvgMap.get(key); + String hazardName = hazardLevelMapper.selectHazardNameByCode(key); + monthAndWeekDTO.setLevelName(hazardName); monthAndWeekDTO.setWeekQuantity(sum / 52); strAvgMap.put(key, monthAndWeekDTO); }else{ MonthAndWeekDTO monthAndWeekDTO = new MonthAndWeekDTO(); + String hazardName = hazardLevelMapper.selectHazardNameByCode(key); + monthAndWeekDTO.setLevelName(hazardName); monthAndWeekDTO.setWeekQuantity(sum / 52); strAvgMap.put(key, monthAndWeekDTO); } } } - avgMonthAndWeekGroupDTO.setMap(strAvgMap); - return ResponseData.success(avgMonthAndWeekGroupDTO); + strAvgMap.keySet().forEach(key -> { + resultList.add(strAvgMap.get(key)); + }); + return ResponseData.success(resultList); } /** @@ -181,12 +204,178 @@ } /** - * 员工考勤人数变化,功能待定 + * 员工考勤人数变化,统计当天(横坐标为时)及近7天(横坐标为天)的考勤人数变化,只要发生一次考勤识别,次数的基数就正常增加(没有上班下班区分) */ + @PostMapping("/staff/attendanceNumber/{dimension}") + @ResponseBody + public Object attendanceNumber(@PathVariable("dimension") String dimension) { + List attendanceNumberDTOs = null; + List> resultList = new ArrayList<>(); + if("week".equals(dimension)){ + //近7天数据按天分组统计 + attendanceNumberDTOs = attendanceInfoMapper.getCountForWeek(); + }else if("day".equals(dimension)) { + //今天数据按小时分组统计 + attendanceNumberDTOs = attendanceInfoMapper.getCountForDay(); + } + if(CollectionUtils.isEmpty(attendanceNumberDTOs)){ + return ResponseData.error("该查询条件下,无员工出勤数据!"); + } + Map> collect = attendanceNumberDTOs.stream().collect(Collectors.groupingBy(AttendanceNumberDTO::getDate)); + collect.keySet().forEach(key -> { + List attendanceNumberDTOS = collect.get(key); + AttendanceNumberDTO attendanceNumberDTO = attendanceNumberDTOS.get(0); + AttendanceNumberDTO attendanceNumberDTO2 = attendanceNumberDTOS.get(1); + Map resultMap = new HashMap<>(); + resultMap.put(attendanceNumberDTO.getStaffType(), attendanceNumberDTO.getQuantity()); + resultMap.put(attendanceNumberDTO2.getStaffType(), attendanceNumberDTO2.getQuantity()); + resultMap.put("staticTime", attendanceNumberDTO.getDate()); + resultList.add(resultMap); + }); + return ResponseData.success(resultList); + } /** - * 近30天/近一周安保人员到岗排行 + * 早晚高峰区域安防评估 */ + @PostMapping("/security/assessment/{dimension}") + @ResponseBody + public Object securityAssessment(@PathVariable("dimension") String dimension) { + //查询各危险级别权重、各类别权重,放入map,避免循环中多次查数据库 + HashMap hazardScoreMap = new HashMap<>(); + List caseHazardLevelList = hazardLevelMapper.getCaseHazardLevelList(null); + caseHazardLevelList.forEach(hazardLevel -> { + hazardScoreMap.put(hazardLevel.getCode(), hazardLevel.getWeight()); + }); + HashMap categoryScoreMap = new HashMap<>(); + List categoryLevelList = categoryLevelMapper.getCaseCategoryLevelList(null); + categoryLevelList.forEach(categoryLevel -> { + categoryScoreMap.put(categoryLevel.getCode(), categoryLevel.getWeight()); + }); + HashMap hashMap = new HashMap<>(); + if("week".equals(dimension)){ + //近7天早晚高峰数据 + List caseInfos = caseInfoMapper.selectListBySevenDay(); + //按时间(天)进行分组 + caseInfos.forEach(caseInfo -> { + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); + Double score = Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + String[] array = caseInfo.getHappenTime().split(" "); + String dayTime = array[0]; + BigDecimal preScore; + if(hashMap.containsKey(dayTime)){ + Double aDouble = hashMap.get(dayTime); + preScore = new BigDecimal(aDouble.toString()); + + }else{ + preScore = new BigDecimal("100.0"); + } + BigDecimal nowScore = new BigDecimal(score.toString()); + hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); + }); + return ResponseData.success(hashMap); + }else if("day".equals(dimension)) { + //今天数据按小时分组统计 + List caseInfos = caseInfoMapper.selectListByToday(); + caseInfos.forEach(caseInfo -> { + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); + Double score = Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + String[] array = caseInfo.getHappenTime().split(":"); + String dayTime = array[0]; + BigDecimal preScore; + if(hashMap.containsKey(dayTime)){ + Double aDouble = hashMap.get(dayTime); + preScore = new BigDecimal(aDouble.toString()); + + }else{ + preScore = new BigDecimal("100.0"); + } + BigDecimal nowScore = new BigDecimal(score.toString()); + hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); + }); + return ResponseData.success(hashMap); + } + return null; + } + + /** + * 重点区域安防事态评估,统计重点区域6:00-23:00按小时分组数据 + */ + @GetMapping("/security/keyAreaStatistic") + @ResponseBody + public Object keyAreaStatistic() { + //查询各危险级别权重、各类别权重,放入map,避免循环中多次查数据库 + HashMap hazardScoreMap = new HashMap<>(); + List caseHazardLevelList = hazardLevelMapper.getCaseHazardLevelList(null); + caseHazardLevelList.forEach(hazardLevel -> { + hazardScoreMap.put(hazardLevel.getCode(), hazardLevel.getWeight()); + }); + HashMap categoryScoreMap = new HashMap<>(); + List categoryLevelList = categoryLevelMapper.getCaseCategoryLevelList(null); + categoryLevelList.forEach(categoryLevel -> { + categoryScoreMap.put(categoryLevel.getCode(), categoryLevel.getWeight()); + }); + HashMap hashMap = new HashMap<>(); + //今天数据按小时分组统计 + List caseInfos = caseInfoMapper.selectListByToday2(); + caseInfos.forEach(caseInfo -> { + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); + Double score = Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + String[] array = caseInfo.getHappenTime().split(":"); + String dayTime = array[0]; + BigDecimal preScore; + if(hashMap.containsKey(dayTime)){ + Double aDouble = hashMap.get(dayTime); + preScore = new BigDecimal(aDouble.toString()); + + }else{ + preScore = new BigDecimal("100.0"); + } + BigDecimal nowScore = new BigDecimal(score.toString()); + hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); + }); + return ResponseData.success(hashMap); + } + + /** + * 安防机动支援力量调配响应评估,根据事件已解决状态及已解决时间-发送时间,按时间(小时)分组统计 + */ + @GetMapping("/security/responseAssess") + @ResponseBody + public Object responseAssess() { + //查询各危险级别权重、各类别权重,放入map,避免循环中多次查数据库 + HashMap hazardScoreMap = new HashMap<>(); + List caseHazardLevelList = hazardLevelMapper.getCaseHazardLevelList(null); + caseHazardLevelList.forEach(hazardLevel -> { + hazardScoreMap.put(hazardLevel.getCode(), hazardLevel.getWeight()); + }); + HashMap hashMap = new HashMap<>(); + //今天数据按小时分组统计 + List caseInfos = caseInfoMapper.selectListByToday3(); + caseInfos.forEach(caseInfo -> { + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + //扣分=事件级别权重*未解决小时数 + Date updateTime = DateUtil.parse(caseInfo.getUpdateTime()); + Date happenTime = DateUtil.parse(caseInfo.getHappenTime()); + long between = DateUtil.between(updateTime, happenTime, DateUnit.HOUR); + Double score = Double.valueOf(hazardWeight)*between; + String[] array = caseInfo.getHappenTime().split(":"); + String dayTime = array[0]; + BigDecimal preScore; + if(hashMap.containsKey(dayTime)){ + Double aDouble = hashMap.get(dayTime); + preScore = new BigDecimal(aDouble.toString()); + }else{ + preScore = new BigDecimal("100.0"); + } + BigDecimal nowScore = new BigDecimal(score.toString()); + hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); + }); + return ResponseData.success(hashMap); + } /** * 重点区域威胁事件类型统计,优先级2,统计近7天和近30天 @@ -224,7 +413,34 @@ } /** - * 设备状态计算系数和评判,优先级3,需确认设备恢复时间是否可以获取 + * 近30天/近一周安保人员到岗排行 */ + + /** + * 安保等级评估,发生离岗事件减1分 + */ + @GetMapping("/security/levelAssess") + @ResponseBody + public Object securityLevelAssess() { + //今天数据按小时分组统计 + List resultList = caseInfoMapper.selectListByType(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); + resultList.forEach(result -> { + BigDecimal deScore = new BigDecimal(result.getQuantity()); + BigDecimal preScore = new BigDecimal("100.0"); + result.setScore(preScore.subtract(deScore).doubleValue()); + }); + return ResponseData.success(resultList); + } + + /** + * 设备状态计算系数和评判,即设备维修管理查询(不分页) + */ + @PostMapping("/device/repairList") + @ResponseBody + public Object repairList(@RequestBody DeviceRepairRequest deviceRepairRequest) { + List deviceRepairLogDTOS = deviceInfoService.deviceRepairListPage(deviceRepairRequest); + return ResponseData.success(deviceRepairLogDTOS); + } + } 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 fbf8ab6..c71a15a 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 @@ -1,13 +1,12 @@ package com.casic.missiles.modular.controller.hik; +import cn.hutool.core.date.DateTime; +import cn.hutool.core.date.DateUtil; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.casic.missiles.model.response.ResponseData; import com.casic.missiles.modular.dao.HikFaceGroupInfoMapper; -import com.casic.missiles.modular.dto.hik.EventSubscribeRequest; -import com.casic.missiles.modular.dto.hik.FaceGroupAdditionRequest; -import com.casic.missiles.modular.dto.hik.HikRecvEvent; -import com.casic.missiles.modular.dto.hik.OrgBatchAdd; +import com.casic.missiles.modular.dto.hik.*; import com.casic.missiles.modular.enums.HikUri; import com.casic.missiles.modular.enums.SecurityEventType; import com.casic.missiles.modular.model.CaseInfo; @@ -18,16 +17,20 @@ import com.casic.missiles.modular.util.CaseInfoFactoryUtil; import com.casic.missiles.modular.util.HikUtil; import com.casic.missiles.modular.util.ThreadPoolUtil; +import com.casic.missiles.modular.util.WebSocket; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; -import org.springframework.web.bind.annotation.*; +import org.springframework.util.CollectionUtils; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.RestController; -import java.net.InetAddress; -import java.net.UnknownHostException; import java.util.ArrayList; +import java.util.Iterator; import java.util.List; import java.util.Objects; @@ -38,7 +41,6 @@ */ @Slf4j @RestController -@RequestMapping("/hik") public class HikController { @Autowired @@ -53,28 +55,37 @@ @Autowired private HikService hikService; + @Autowired + private HikFaceGroupInfoMapper hikFaceGroupInfoMapper; + + @Autowired + private WebSocket webSocket; + @Value("${server.port}") private int serverPort; - @Autowired - private HikFaceGroupInfoMapper hikFaceGroupInfoMapper; /** * 海康事件订阅 */ - @PostMapping("/event/subscribe") + @PostMapping("/hik/event/subscribe") @ResponseBody - public Object eventSubscribe() throws UnknownHostException { + public Object eventSubscribe() { EventSubscribeRequest eventSubscribeRequest = new EventSubscribeRequest(); ArrayList list = new ArrayList<>(); list.add(SecurityEventType.DEVICE_OFFLINE); + list.add(SecurityEventType.DEVICE_ONLINE); list.add(SecurityEventType.KEY_PERSONNEL_IDENTIFY_EVENT); list.add(SecurityEventType.MONITORING_POINT_OFFLINE); + list.add(SecurityEventType.MONITORING_POINT_ONLINE); list.add(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); list.add(SecurityEventType.PERSONNEL_GATHER_EVENT); - InetAddress localHost = InetAddress.getLocalHost(); + list.add(SecurityEventType.VISITOR_REGISTER); + list.add(SecurityEventType.VISITOR_CHECKOUT); + list.add(SecurityEventType.HIGH_ALTITUDE_PARABOLIC); +// InetAddress localHost = InetAddress.getLocalHost(); eventSubscribeRequest.setEventTypes(list); - eventSubscribeRequest.setEventDest("https://" + localHost + ":" + serverPort + "/eventRcv"); + eventSubscribeRequest.setEventDest("http://" + "192.168.10.6" + ":" + serverPort + "/eventRcv"); //订阅类型,0-订阅原始事件,1-联动事件,2-原始事件和联动事件,不填使用默认值0 eventSubscribeRequest.setSubType(0); /** @@ -92,19 +103,25 @@ } /** + * 查询事件订阅信息 + */ + @PostMapping("/hik/event/query") + @ResponseBody + public Object eventQuery() { + String result = HikUtil.hikApi(HikUri.EVENT_INFO, ""); + return result; + } + + /** * 海康事件接收 */ @PostMapping("/eventRcv") @ResponseBody public Object eventRcv(@RequestBody HikRecvEvent hikRecvEvent) { //1、接收所需事件类型 - Long eventType = hikRecvEvent.getEventType(); + Number eventType = hikRecvEvent.getEventType(); log.info("接收到安防事件类型为:{}", eventType); CaseInfo caseInfo = caseInfoFactoryUtil.getCaseInfo(eventType); - //接收到不关心事件直接返回 - if(Objects.isNull(caseInfo)){ - return ResponseData.success(); - } //2、不同事件不同处理,caseInfoFactoryUtil已设置好事件基础定义信息 // 再为事件添加状态、设备编码、设备名称、位置、区域、时间 // 异步处理事件 @@ -114,19 +131,23 @@ caseHandle(hikRecvEvent, eventType, caseInfo); } })); +// caseHandle(hikRecvEvent, eventType, caseInfo); - return null; + return ResponseData.success(); } - private void caseHandle(HikRecvEvent hikRecvEvent, Long eventType, CaseInfo caseInfo) { + private void caseHandle(HikRecvEvent hikRecvEvent, Number eventType, CaseInfo caseInfo) { JSONArray eventArray = hikRecvEvent.getEventArray(); List caseInfos = new ArrayList<>(); - while (eventArray.stream().iterator().hasNext()) { + Iterator iterator = eventArray.iterator(); + while (iterator.hasNext()) { CaseInfo caseInfo1 = new CaseInfo(); - BeanUtils.copyProperties(caseInfo, caseInfo1); - JSONObject event = (JSONObject) eventArray.stream().iterator().next(); + if(!Objects.isNull(caseInfo)){ + BeanUtils.copyProperties(caseInfo, caseInfo1); + } + JSONObject event = (JSONObject) iterator.next(); //5种事件进行不同处理 - if(SecurityEventType.KEY_PERSONNEL_IDENTIFY_EVENT == eventType){ + if (SecurityEventType.KEY_PERSONNEL_IDENTIFY_EVENT.equals(eventType)) { //判断所属人脸分组 JSONObject data = (JSONObject) event.get("data"); JSONObject faceRecognitionResult = (JSONObject) data.get("faceRecognitionResult"); @@ -142,52 +163,101 @@ if (faceGroupCode.equals(blackListGroup.getFaceGroupCode())) { //黑名单分组处理 caseInfo1 = hikService.blackListHandle(event, caseInfo1); - }else if(faceGroupCode.equals(propertyPersonnelGroup.getFaceGroupCode())){ + } else if (faceGroupCode.equals(propertyPersonnelGroup.getFaceGroupCode())) { //考勤分组处理-物业人员,添加到考勤表 hikService.propertyAttendanceHandle(event); - }else if(faceGroupCode.equals(securityPersonnelGroup.getFaceGroupCode())){ + } else if (faceGroupCode.equals(securityPersonnelGroup.getFaceGroupCode())) { //考勤分组处理-安保人员,添加到考勤表 hikService.securityPersonnelHandle(event); - }else { + } else { return; } - }else if(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT == eventType){ + } else if (SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT.equals(eventType)) { //离岗事件处理 caseInfo1 = hikService.demobilizedHandle(event, caseInfo1); - }else if(SecurityEventType.PERSONNEL_GATHER_EVENT == eventType){ + } else if (SecurityEventType.PERSONNEL_GATHER_EVENT.equals(eventType)) { //人员聚集事件处理 caseInfo1 = hikService.personGatherHandle(event, caseInfo1); - }else if(SecurityEventType.MONITORING_POINT_OFFLINE == eventType){ + } else if (SecurityEventType.MONITORING_POINT_OFFLINE.equals(eventType)) { //监控点离线事件处理 caseInfo1 = hikService.monitorPointOfflineHandle(event, caseInfo1); - }else if(SecurityEventType.DEVICE_OFFLINE == eventType){ + } else if (SecurityEventType.MONITORING_POINT_ONLINE.equals(eventType)) { + //监控点上线事件处理 + hikService.monitorPointOnlineHandle(event); + } else if (SecurityEventType.DEVICE_OFFLINE.equals(eventType)) { //装置离线事件处理 caseInfo1 = hikService.deviceOfflineHandle(event, caseInfo1); - }else if(SecurityEventType.VISITOR_REGISTER == eventType){ + } else if (SecurityEventType.DEVICE_ONLINE.equals(eventType)) { + //装置上线处理 + hikService.deviceOnlineHandle(event); + } else if (SecurityEventType.VISITOR_REGISTER.equals(eventType)) { //记录访客登记记录,添加到访客记录表 hikService.visitorRegisterHandler(event); - }else if(SecurityEventType.VISITOR_CHECKOUT == eventType){ + } else if (SecurityEventType.VISITOR_CHECKOUT.equals(eventType)) { //记录访客签离记录 hikService.visitorCheckOutHandler(event); } - if(!Objects.isNull(caseInfo1) && !StringUtils.isEmpty(caseInfo1.getHappenTime())){ + if (!Objects.isNull(caseInfo1) && !StringUtils.isEmpty(caseInfo1.getHappenTime())) { caseInfos.add(caseInfo1); } } //3、安防事件入库 - if(!caseInfoService.insertCaseInfoBatch(caseInfos)){ - log.error("安防事件批量入库异常"); + if (!CollectionUtils.isEmpty(caseInfos) && !caseInfoService.insertCaseInfoBatch(caseInfos)) { + log.error("安防事件批量入库异常!"); } // TODO: 2022/8/15 webSocket推送 + if (CollectionUtils.isEmpty(caseInfos)) { + log.info("webSocket事件推送"); + webSocket.sendAllMessage(JSONObject.toJSONString(caseInfos)); + } return; } /** + * 以图搜图,前端用于轨迹追踪 + */ + @PostMapping("/hik/search/picture") + @ResponseBody + public Object searchPictures(@RequestBody SearchPicturesRequest searchPicturesRequest) { + DateTime startDateTime = DateUtil.parse(searchPicturesRequest.getStartTime()); + DateTime endDateTime = DateUtil.parse(searchPicturesRequest.getEndTime()); + String startTime = DateUtil.format(startDateTime, "yyyy-MM-dd'T'HH:mm:ss.SSSXXX"); + String endTime = DateUtil.format(endDateTime, "yyyy-MM-dd'T'HH:mm:ss.SSSXXX"); + searchPicturesRequest.setStartTime(startTime); + searchPicturesRequest.setEndTime(endTime); + String body = JSONObject.toJSONString(searchPicturesRequest); + String resultStr = HikUtil.hikApi(HikUri.SEARCH_PICTURES, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (!"0".equals(resultJson.get("code"))) { + log.error("请求海康,以图搜图失败,海康response:{}", resultStr); + return ResponseData.error("以图搜图失败"); + } + return ResponseData.success(resultJson); + } + + + /** + * 海康事件取消订阅 + */ + @PostMapping("/hik/event/cancel") + @ResponseBody + public Object eventCancelSubscribe(@RequestBody CancelSubscribeRequest cancelSubscribeRequest) { + String body = JSONObject.toJSONString(cancelSubscribeRequest); + String resultStr = HikUtil.hikApi(HikUri.EVENT_CANCEL, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (!"0".equals(resultJson.get("code"))) { + log.error("请求海康,取消订阅失败,海康response:{}", resultStr); + return ResponseData.error("取消订阅失败"); + } + return ResponseData.success(resultJson); + } + + /** * 单个添加海康人脸分组 * api->hik单个添加人脸分组api->response->mysql */ - @PostMapping("/faceGroup/single/add") + @PostMapping("/hik/faceGroup/single/add") @ResponseBody public Object faceGroupAddition(@RequestBody FaceGroupAdditionRequest faceGroupAdditionRequest) { String body = JSONObject.toJSONString(faceGroupAdditionRequest); @@ -212,7 +282,7 @@ * 批量添加海康组织 * api->hik批量添加组织api->response */ - @PostMapping("/org/batch/add") + @PostMapping("/hik/org/batch/add") @ResponseBody public Object orgBatchAdd(@RequestBody List orgBatchAddRequest) { String body = JSONObject.toJSONString(orgBatchAddRequest); @@ -232,4 +302,62 @@ return ResponseData.error("批量添加组织失败"); } + /** + * 获取人员列表 + */ + @PostMapping("/hik/person/personList") + @ResponseBody + public Object personList() { + PersonListRequest request = new PersonListRequest(); + request.setPageNo(1); + request.setPageSize(100); + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi("/api/resource/v2/person/personList", body); + return resultStr; + } + + /** + * 获取组织列表 + */ + @PostMapping("/hik/org/orgList") + @ResponseBody + public Object orgList() { + PersonListRequest request = new PersonListRequest(); + request.setPageNo(1); + request.setPageSize(100); + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi("/api/resource/v1/org/orgList", body); + return resultStr; + } + + /** + * 查询访客权限下载记录 + */ + @PostMapping("/hik/auth/result") + @ResponseBody + public Object authResult() { + PersonListRequest request = new PersonListRequest(); + request.setPageNo(1); + request.setPageSize(100); + request.setOrderId("ba101db6246711edaea66f7939a13638"); + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi("/api/visitor/v1/auth/result", body); + return resultStr; + } + + /** + * 人脸图片获取 + */ + @PostMapping("/hik/face/picture") + @ResponseBody + public Object facePicture() { + FaceRequest request = new FaceRequest(); +// List list = new ArrayList<>(); +// list.add(""); + request.setCertificateNum("wanggong"); + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi("/api/frs/v1/face", body); + return resultStr; + } + } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/AssetInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/AssetInfoMapper.java index 4f64e83..c0684ee 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/AssetInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/AssetInfoMapper.java @@ -17,6 +17,6 @@ @Mapper public interface AssetInfoMapper extends BaseMapper { - List getAssetInfoListPage(@Param("page") Page page, AssetInfoRequest assetInfoRequest); + List getAssetInfoListPage(@Param("page") Page page, @Param("assetInfoRequest") AssetInfoRequest assetInfoRequest); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/AttendanceInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/AttendanceInfoMapper.java index f9e793e..ec87e46 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/AttendanceInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/AttendanceInfoMapper.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.statistics.AttendanceNumberDTO; import com.casic.missiles.modular.dto.statistics.AttendanceRatioDTO; import com.casic.missiles.modular.model.AttendanceInfo; import org.apache.ibatis.annotations.Mapper; @@ -17,7 +18,7 @@ */ @Mapper public interface AttendanceInfoMapper extends BaseMapper { - List getAttendanceInfoListPage(@Param("page") Page page, StaffInfoRequest attendanceInfoRequest); + List getAttendanceInfoListPage(@Param("page") Page page, @Param("attendanceInfoRequest") StaffInfoRequest attendanceInfoRequest); AttendanceInfo selectByCodeAndDate(@Param("staffCode") String staffCode); @@ -26,4 +27,8 @@ List getCountByTypeAndDateForMonth(@Param("staffType")String staffType); List getCountByTypeAndDateForYear(@Param("staffType")String staffType); + + List getCountForWeek(); + + List getCountForDay(); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java index ce94b8f..6137a7d 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java @@ -17,5 +17,5 @@ @Mapper public interface BlackInfoMapper extends BaseMapper { - List getBlackInfoListPage(@Param("page") Page page, BlackInfoRequest blackInfoRequest); + List getBlackInfoListPage(@Param("page") Page page, @Param("blackInfoRequest") BlackInfoRequest blackInfoRequest); } 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 efda6b3..50aaa6f 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 @@ -20,7 +20,7 @@ List getCaseInfoListPage(@Param("page") Page page, @Param("caseInfoRequest") CaseInfoRequest caseInfoRequest); - int updateStatusById(CaseInfoRequest caseInfoRequest); + int updateStatusById(@Param("caseInfoRequest") CaseInfoRequest caseInfoRequest); List selectByLevelAndMonth(@Param("year") String year); @@ -47,4 +47,20 @@ List selectPreWeekCountByThirtyDay(); List selectPreDayCountBySevenDay(); + + Integer selectDemobilizedCount(@Param("eventType") Number personnelDemobilizedEvent); + + List selectPreMonthCount(); + + List selectListBySevenDay(); + + List selectListByToday(); + + List selectListByToday2(); + + List selectListByToday3(); + + List selectListByType(@Param("eventType") Number eventType); + + List selectDemobilizedCountByHour(@Param("eventType") Number eventType); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/CategoryLevelMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/CategoryLevelMapper.java index 52fc714..afe1650 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/CategoryLevelMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/CategoryLevelMapper.java @@ -17,9 +17,9 @@ @Mapper public interface CategoryLevelMapper extends BaseMapper { - List getCaseCategoryLevelListPage(@Param("page") Page page, CategoryLevelRequest categoryLevelRequest); + List getCaseCategoryLevelListPage(@Param("page") Page page, @Param("categoryLevelRequest") CategoryLevelRequest categoryLevelRequest); - List getCaseCategoryLevelList(CategoryLevelRequest categoryLevelRequest); + List getCaseCategoryLevelList(@Param("categoryLevelRequest") CategoryLevelRequest categoryLevelRequest); CaseCategoryLevel getCaseCategoryLevel(@Param("categoryLevelCode") String categoryLevelCode); 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 66353b1..2555a09 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 @@ -19,7 +19,7 @@ @Mapper public interface DeviceInfoMapper extends BaseMapper { - List getDeviceInfoListPage(@Param("page") Page page, DeviceInfoRequest deviceInfoRequest); + List getDeviceInfoListPage(@Param("page") Page page, @Param("deviceInfoRequest") DeviceInfoRequest deviceInfoRequest); List getDeviceInfoList(@Param("deviceInfoRequest") DeviceInfoRequest deviceInfoRequest); @@ -27,6 +27,8 @@ DeviceInfo getByIndexCode(@Param("srcIndex") String srcIndex); + DeviceInfo getByIp(@Param("ip") String ip); + List selectIndexCodesByCodes(@Param("deviceCodes") List deviceCodes); List selectByType(@Param("devType") String devType); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java index 41dd0af..5bfaf63 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java @@ -5,6 +5,7 @@ import com.casic.missiles.modular.dto.DeviceRepairRequest; import com.casic.missiles.modular.model.DeviceRepairLog; import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; import java.util.List; @@ -16,7 +17,7 @@ @Mapper public interface DeviceRepairLogMapper extends BaseMapper { - List getDeviceRepairListPage(Page page, DeviceRepairRequest deviceRepairRequest); + List getDeviceRepairListPage(@Param("page") Page page, @Param("deviceRepairRequest")DeviceRepairRequest deviceRepairRequest); - List getDeviceRepairList(DeviceRepairRequest deviceRepairRequest); + List getDeviceRepairList(@Param("deviceRepairRequest") DeviceRepairRequest deviceRepairRequest); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java index 9035c47..4823ac1 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java @@ -18,7 +18,7 @@ @Mapper public interface FireEquipInfoMapper extends BaseMapper { - List getFireEquipInfoListPage(@Param("page") Page page, FireEquipRequest fireEquipRequest); + List getFireEquipInfoListPage(@Param("page") Page page, @Param("fireEquipRequest") FireEquipRequest fireEquipRequest); FireEquipInfo getFireEquipInfo(@Param("equipCode") String equipCode); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/GateGroupMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/GateGroupMapper.java index d8c330d..977a427 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/GateGroupMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/GateGroupMapper.java @@ -17,7 +17,7 @@ */ @Mapper public interface GateGroupMapper extends BaseMapper { - List getGateGroupListPage(@Param("page") Page page, GateGroupRequest gateGroupRequest); + List getGateGroupListPage(@Param("page") Page page, @Param("gateGroupRequest") GateGroupRequest gateGroupRequest); GateGroup getGateGroupByName(@Param("groupName") String groupName); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/HazardLevelMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/HazardLevelMapper.java index 8957780..dcf47bb 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/HazardLevelMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/HazardLevelMapper.java @@ -17,11 +17,13 @@ @Mapper public interface HazardLevelMapper extends BaseMapper { - List getCaseHazardLevelListPage(@Param("page") Page page, HazardLevelRequest hazardLevelRequest); + List getCaseHazardLevelListPage(@Param("page") Page page, @Param("hazardLevelRequest") HazardLevelRequest hazardLevelRequest); - List getCaseHazardLevelList(HazardLevelRequest hazardLevelRequest); + List getCaseHazardLevelList(@Param("hazardLevelRequest") HazardLevelRequest hazardLevelRequest); CaseHazardLevel getCaseHazardLevel(@Param("hazardLevelCode") String hazardLevelCode); List selectHazardName(); + + String selectHazardNameByCode(@Param("hazardLevelCode") String hazardLevelCode); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/HikCaseDefineMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/HikCaseDefineMapper.java index 0dc47d1..f162fef 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/HikCaseDefineMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/HikCaseDefineMapper.java @@ -12,5 +12,5 @@ */ @Mapper public interface HikCaseDefineMapper extends BaseMapper { - HikCaseDefine getHikCaseDefine(@Param("caseTypeCode") Long caseTypeCode); + HikCaseDefine getHikCaseDefine(@Param("caseTypeCode") Number caseTypeCode); } 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 f8a674c..fe5afc2 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 @@ -17,11 +17,13 @@ @Mapper public interface StaffInfoMapper extends BaseMapper { - List getStaffInfoListPage(@Param("page") Page page, StaffInfoRequest staffInfoRequest); + List getStaffInfoListPage(@Param("page") Page page, @Param("staffInfoRequest") StaffInfoRequest staffInfoRequest); StaffInfo selectByCode(@Param("staffCode") String staffCode); - List getStaffInfoList(StaffInfoRequest staffInfoRequest); + List getStaffInfoList(@Param("staffInfoRequest") StaffInfoRequest staffInfoRequest); - List selectBatchCodes(List list); + List selectBatchCodes(@Param("list") List list); + + int updateByCodeForCard(@Param("staffCode") String staffCode, @Param("cardNo") String cardNo); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitInfoMapper.java index b1217c5..6c52542 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitInfoMapper.java @@ -16,7 +16,7 @@ */ @Mapper public interface VisitInfoMapper extends BaseMapper { - List getVisitInfoListPage(@Param("page") Page page, VisitorRequest visitorRequest); + List getVisitInfoListPage(@Param("page") Page page, @Param("visitorRequest") VisitorRequest visitorRequest); VisitInfo selectByOrderId(@Param("orderId") String orderId); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitorApplyMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitorApplyMapper.java index c09f3c0..6ea55bd 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitorApplyMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitorApplyMapper.java @@ -18,7 +18,7 @@ @Mapper public interface VisitorApplyMapper extends BaseMapper { - List getVisitorApplyListPage(@Param("page") Page page, VisitorApplyRequest visitorApplyRequest); + List getVisitorApplyListPage(@Param("page") Page page, @Param("visitorApplyRequest") VisitorApplyRequest visitorApplyRequest); List selectByVisitReason(); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/AttendanceInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/AttendanceInfoMapper.xml index b2ece71..f8bdd6e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/AttendanceInfoMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/AttendanceInfoMapper.xml @@ -43,7 +43,8 @@ and staff_type = #{staffType} - and YEARWEEK(date_format(atte_date, '%Y-%m-%d'), 1) = YEARWEEK(now(),1); + AND DATE_SUB(CURDATE(), INTERVAL 7 DAY) <= DATE(atte_date) + GROUP BY DATE_FORMAT(atte_date, '%Y-%m-%d') @@ -69,4 +70,20 @@ GROUP BY DATE_FORMAT(atte_date, '%Y-%m') + + + \ No newline at end of file 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 2b6953f..06ec0a8 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 @@ -28,7 +28,9 @@ @@ -87,7 +89,8 @@ SELECT hazard_level_code as levelCode, count(id) as quantity FROM bus_case_info WHERE hazard_level_code is not null - AND DATE_SUB(CURDATE(), INTERVAL 7 DAY) <= date(happen_time); + AND is_key_area = 1 + AND DATE_SUB(CURDATE(), INTERVAL 7 DAY) <= date(happen_time) GROUP BY hazard_level_code @@ -95,7 +98,8 @@ SELECT hazard_level_code as levelCode, count(id) as quantity FROM bus_case_info WHERE hazard_level_code is not null - AND DATE_SUB(CURDATE(), INTERVAL 30 DAY) <= date(happen_time); + AND is_key_area = 1 + AND DATE_SUB(CURDATE(), INTERVAL 30 DAY) <= date(happen_time) GROUP BY hazard_level_code @@ -122,4 +126,71 @@ AND hazard_level_code is not null GROUP BY DATE_FORMAT(happen_time,'%Y-%m-%d') + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/CategoryLevelMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/CategoryLevelMapper.xml index 4670b1f..1d25cbd 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/CategoryLevelMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/CategoryLevelMapper.xml @@ -20,11 +20,11 @@ SELECT * FROM bus_case_category_level WHERE 1=1 - - and code = #{code} + + and code = #{categoryLevelRequest.code} - - and name = #{name} + + and name = #{categoryLevelRequest.name} ORDER by create_time DESC 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 9b66fd8..bfd84b7 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 @@ -98,4 +98,10 @@ #{item} + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceRepairLogMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceRepairLogMapper.xml index 078ed3c..cf1a481 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceRepairLogMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceRepairLogMapper.xml @@ -22,14 +22,14 @@ SELECT * FROM bus_device_repair_log WHERE 1=1 - - and device_code = #{devCode} + + and device_code = #{deviceRepairRequest.devCode} - - and device_name = #{devName} + + and device_name = #{deviceRepairRequest.devName} - - and DATE_FORMAT(create_time,"%y%m%d") = DATE_FORMAT(#{createTime},"%y%m%d") + + and DATE_FORMAT(create_time,"%y%m%d") = DATE_FORMAT(#{deviceRepairRequest.createTime},"%y%m%d") ORDER by create_time DESC diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/HazardLevelMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/HazardLevelMapper.xml index f16f2b9..458322b 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/HazardLevelMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/HazardLevelMapper.xml @@ -20,11 +20,11 @@ SELECT * FROM bus_case_hazard_level WHERE 1=1 - - and code = #{code} + + and code = #{hazardLevelRequest.code} - - and name = #{name} + + and name = #{hazardLevelRequest.name} ORDER by create_time DESC @@ -42,4 +42,10 @@ SELECT name FROM bus_case_hazard_level + + \ 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 557237e..b6a183a 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 @@ -50,4 +50,10 @@ + + + UPDATE bus_staff_info + SET card_no = #{cardNo} + WHERE staff_code = #{staffCode} + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitInfoMapper.xml index 84aa84f..230529a 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitInfoMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitInfoMapper.xml @@ -27,5 +27,6 @@ SELECT * FROM bus_visit_info WHERE order_id = #{orderId} and DATE_FORMAT(in_time,'%Y-%m-%d') = CURRENT_DATE + limit 1 \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/BlackPictureRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/BlackPictureRequest.java new file mode 100644 index 0000000..fc92701 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/BlackPictureRequest.java @@ -0,0 +1,14 @@ +package com.casic.missiles.modular.dto; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/29 19:26 + */ +@Data +public class BlackPictureRequest { + private String picUri; + private String serverIndexCode; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/CancelSubscribeRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/CancelSubscribeRequest.java new file mode 100644 index 0000000..e2d390a --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/CancelSubscribeRequest.java @@ -0,0 +1,15 @@ +package com.casic.missiles.modular.dto.hik; + +import lombok.Data; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/24 15:14 + */ +@Data +public class CancelSubscribeRequest { + private List eventTypes; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/CardInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/CardInfo.java new file mode 100644 index 0000000..341457d --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/CardInfo.java @@ -0,0 +1,24 @@ +package com.casic.missiles.modular.dto.hik; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/26 16:08 + */ +@Data +public class CardInfo { + //卡号,8~20个字符,支持数字和大写字母 + private String cardNo; + //人员ID,员工工号 + private String personId; + //人员所属组织IndexCode + private String orgIndexCode; + //卡片类型,默认是1:IC卡 + //1:IC卡 + //2:CPU卡 + //3:远距离卡 + //4:MIFARE卡 + private Number cardType; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/FaceRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/FaceRequest.java new file mode 100644 index 0000000..edc04bf --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/FaceRequest.java @@ -0,0 +1,16 @@ +package com.casic.missiles.modular.dto.hik; + +import lombok.Data; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/25 16:53 + */ +@Data +public class FaceRequest { + private String certificateNum; + private List indexCodes; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/HikRecvEvent.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/HikRecvEvent.java index a3e9845..1b2b2b1 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/HikRecvEvent.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/HikRecvEvent.java @@ -28,12 +28,12 @@ /** * 事件类型,用于判断所需接收到的事件类型 */ - public Long getEventType(){ + public Number getEventType(){ JSONObject jsonObject = (JSONObject)JSONObject.toJSON(params); //事件类别对应SecurityEventTypeEnum JSONArray eventTypeArray = (JSONArray)jsonObject.get("events"); JSONObject eventJsonObject = (JSONObject)JSONObject.toJSON(eventTypeArray.get(0)); - Long eventType = (Long) eventJsonObject.get("eventType"); + Number eventType = (Number) eventJsonObject.get("eventType"); return eventType; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonBatchDeleteRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonBatchDeleteRequest.java index 027d31d..9751929 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonBatchDeleteRequest.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonBatchDeleteRequest.java @@ -12,4 +12,6 @@ @Data public class PersonBatchDeleteRequest { private List personIds; + //删除人脸接口使用 + private String faceId; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonInfoRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonInfoRequest.java new file mode 100644 index 0000000..05dc9e1 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonInfoRequest.java @@ -0,0 +1,20 @@ +package com.casic.missiles.modular.dto.hik; + +import lombok.Data; + +import java.util.List; + +/** + * @Description: 获取员工照片请求实体 + * @Author: wangpeng + * @Date: 2022/8/25 16:53 + */ +@Data +public class PersonInfoRequest { + //获取员工详细信息使用 + private String paramName; + private List paramValue; + //获取照片使用 + private String picUri; + private String serverIndexCode; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonListRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonListRequest.java new file mode 100644 index 0000000..3f7149b --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonListRequest.java @@ -0,0 +1,16 @@ +package com.casic.missiles.modular.dto.hik; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/25 16:53 + */ +@Data +public class PersonListRequest { + private Number pageNo; + private Number pageSize; + + private String orderId; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/SearchPicturesRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/SearchPicturesRequest.java new file mode 100644 index 0000000..0a95966 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/SearchPicturesRequest.java @@ -0,0 +1,24 @@ +package com.casic.missiles.modular.dto.hik; + +import lombok.Data; + +import java.util.List; + +/** + * @Description: 以图搜图请求 + * @Author: wangpeng + * @Date: 2022/8/29 10:46 + */ +@Data +public class SearchPicturesRequest { + private String facePicBinaryData; + private String facePicUrl; + private List cameraIndexCodes; + private String startTime; + private String endTime; + //指定搜图的最小相似度,最小为1,最大为100 + private String minSimilarity; + private Number age; + //male-男性,female-女性 + private String sex; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/StaffCardRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/StaffCardRequest.java new file mode 100644 index 0000000..4052e6d --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/StaffCardRequest.java @@ -0,0 +1,20 @@ +package com.casic.missiles.modular.dto.hik; + +import lombok.Data; + +import java.util.List; + +/** + * @Description: 人员开卡请求实体 + * @Author: wangpeng + * @Date: 2022/8/26 16:05 + */ +@Data +public class StaffCardRequest { + //卡片开始有效时间,时间格式:yyyy-MM-dd + private String startDate; + //卡片截止有效时间,时间格式:yyyy-MM-dd,不能大于2037年12月31日 + private String endDate; + //cardList,待开卡列表,最大支持50张卡 + private List cardList; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/VisitorInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/VisitorInfo.java index 73aa316..b99f301 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/VisitorInfo.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/VisitorInfo.java @@ -14,7 +14,7 @@ //访客性别 //1: 男 //2: 女 - private String gender; + private Integer gender; //联系电话建议填写手机号码 private String phoneNo; //证件类型 diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/ApplyReasonGroupDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/ApplyReasonGroupDTO.java index 514f382..786143e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/ApplyReasonGroupDTO.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/ApplyReasonGroupDTO.java @@ -13,4 +13,6 @@ private String visitReason; //访问人数 private Integer quantity; + //占比 + private String ratio; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/AttendanceNumberDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/AttendanceNumberDTO.java new file mode 100644 index 0000000..a494321 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/AttendanceNumberDTO.java @@ -0,0 +1,24 @@ +package com.casic.missiles.modular.dto.statistics; + +import com.fasterxml.jackson.annotation.JsonIgnore; +import lombok.Data; + +/** + * @Description: 出勤人数统计实体 + * @Author: wangpeng + * @Date: 2022/8/31 19:24 + */ +@Data +public class AttendanceNumberDTO { + //日期维度,周、今日,入参 + @JsonIgnore + private String dateDimension; + + //日期,具体天/小时,出参 + private String date; + //出勤人数 + private String quantity; + //员工类型 + private String staffType; + +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/AvgMonthAndWeekGroupDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/AvgMonthAndWeekGroupDTO.java index 4366916..331a9a9 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/AvgMonthAndWeekGroupDTO.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/AvgMonthAndWeekGroupDTO.java @@ -2,8 +2,6 @@ import lombok.Data; -import java.util.Map; - /** * @Description: 平均每月和每周的数据实体 * @Author: wangpeng @@ -13,6 +11,4 @@ public class AvgMonthAndWeekGroupDTO { //入参 private String year; - //出参,key:事件类型,value:周和月数据平均值 - private Map map; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/BlackListController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/BlackListController.java index a27f9f8..0c06661 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/BlackListController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/BlackListController.java @@ -1,13 +1,18 @@ package com.casic.missiles.modular.controller; +import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.base.controller.ExportController; import com.casic.missiles.core.page.PageFactory; import com.casic.missiles.model.response.ResponseData; import com.casic.missiles.modular.dto.BlackInfoRequest; +import com.casic.missiles.modular.dto.BlackPictureRequest; +import com.casic.missiles.modular.dto.hik.PersonInfoRequest; +import com.casic.missiles.modular.enums.HikUri; import com.casic.missiles.modular.enums.OperateTypeEnum; import com.casic.missiles.modular.model.BlackInfo; import com.casic.missiles.modular.service.BlackInfoService; +import com.casic.missiles.modular.util.HikUtil; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; @@ -56,4 +61,22 @@ return null; } + /** + * 黑名单人员照片 + */ + @PostMapping("/personPicture") + @ResponseBody + public Object personPicture(@RequestBody BlackPictureRequest blackPictureRequest){ + //获取照片 + String picUri = blackPictureRequest.getPicUri(); + String serverIndexCode = blackPictureRequest.getServerIndexCode(); + PersonInfoRequest picRequest = new PersonInfoRequest(); + picRequest.setPicUri(picUri); + picRequest.setServerIndexCode(serverIndexCode); + String reBody = JSONObject.toJSONString(picRequest); + //重定向地址获取 + String url = HikUtil.hikApiFor302(HikUri.PERSON_PICTURE, reBody); + return ResponseData.success(url); + } + } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/DeviceController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/DeviceController.java index e1c4eba..666bbee 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/DeviceController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/DeviceController.java @@ -107,7 +107,7 @@ } /** - * 设备维修管理查询(分页),需计算MTTR=总维修时间/故障次数 + * 设备状态计算与评判/设备维修管理查询(分页),需计算MTTR=总维修时间/故障次数 */ @PostMapping("/repair/listPage") @ResponseBody @@ -211,7 +211,7 @@ //需根据设备编号获取到对应的门禁点唯一标识 doorControlRequest.setDoorIndexCodes(indexCodes); doorControlRequest.setControlType(Integer.valueOf(gateGroupDTO.getStatus())); - String body = JSONObject.toJSONString(deviceCodes); + String body = JSONObject.toJSONString(doorControlRequest); String resultStr = HikUtil.hikApi(HikUri.DOOR_CONTROL, body); JSONObject resultJson = (JSONObject)JSONObject.parse(resultStr); if (!"0".equals(resultJson.get("code"))) { diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/StaffController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/StaffController.java index b58ccab..704093c 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/StaffController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/StaffController.java @@ -2,15 +2,21 @@ import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.util.StrUtil; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.base.controller.ExportController; import com.casic.missiles.core.page.PageFactory; import com.casic.missiles.model.response.ErrorResponseData; import com.casic.missiles.model.response.ResponseData; import com.casic.missiles.modular.dto.StaffInfoRequest; +import com.casic.missiles.modular.dto.hik.PersonInfoRequest; +import com.casic.missiles.modular.dto.hik.StaffCardRequest; +import com.casic.missiles.modular.enums.HikUri; import com.casic.missiles.modular.enums.OperateTypeEnum; import com.casic.missiles.modular.model.StaffInfo; import com.casic.missiles.modular.service.StaffInfoService; +import com.casic.missiles.modular.util.HikUtil; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; @@ -110,4 +116,60 @@ } return ResponseData.success(); } + + /** + * 批量开卡,添加人员之后调用,若在一个接口中添加人员成功开卡失败则第二次添加时会有问题 + */ + @PostMapping("/cardBinding") + @ResponseBody + public Object cardBinding(@RequestBody StaffCardRequest staffCardRequest) { + String body = JSONObject.toJSONString(staffCardRequest); + String resultStr = HikUtil.hikApi(HikUri.CARD_BINDING, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (!"0".equals(resultJson.get("code"))) { + log.error("请求海康,批量开卡失败,海康response:{}", resultStr); + return ResponseData.error("批量开卡失败"); + } + //保存卡号 + if(staffInfoService.saveCardInfo(staffCardRequest) > 0){ + return ResponseData.success(); + } + return ResponseData.error("批量开卡失败"); + } + + /** + * 获取员工照片,海康存储 + */ + @PostMapping("/personPicture/{staffCode}") + @ResponseBody + public Object personPicture(@PathVariable("staffCode") String staffCode){ + //获取员工详细信息,含图片服务器、uri + PersonInfoRequest request = new PersonInfoRequest(); + List list = new ArrayList<>(); + list.add(staffCode); + request.setParamName("personId"); + request.setParamValue(list); + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi(HikUri.PERSON_INFO, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (!"0".equals(resultJson.get("code"))) { + log.error("请求海康,根据人员唯一字段获取人员详细信息失败,海康response:{}", resultStr); + return ResponseData.error("获取员工照片失败"); + } + //获取照片 + JSONObject data = (JSONObject) resultJson.get("data"); + JSONArray dataArray = (JSONArray) data.get("list"); + JSONObject jsonObject = (JSONObject) dataArray.get(0); + JSONArray personPhoto = (JSONArray) jsonObject.get("personPhoto"); + JSONObject photo = (JSONObject) personPhoto.get(0); + String picUri = photo.getString("picUri"); + String serverIndexCode = photo.getString("serverIndexCode"); + PersonInfoRequest picRequest = new PersonInfoRequest(); + picRequest.setPicUri(picUri); + picRequest.setServerIndexCode(serverIndexCode); + String reBody = JSONObject.toJSONString(picRequest); + //重定向地址获取 + String url = HikUtil.hikApiFor302(HikUri.PERSON_PICTURE, reBody); + return ResponseData.success(url); + } } 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 4a07dd9..7b1dcf6 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 @@ -16,6 +16,7 @@ import com.casic.missiles.modular.redis.key.CacheKeys; import com.casic.missiles.modular.service.CockpitService; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.util.CollectionUtils; import org.springframework.web.bind.annotation.*; @@ -24,10 +25,7 @@ import java.text.NumberFormat; import java.time.LocalDateTime; import java.time.temporal.ChronoUnit; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.util.*; import java.util.stream.Collectors; /** @@ -73,6 +71,9 @@ private StatisticNumberMapper numberMapper; @Autowired + private HazardLevelMapper hazardLevelMapper; + + @Autowired private AccessGroupConfig accessGroupConfig; /** @@ -104,8 +105,24 @@ public Object buildingNumberPerHour(){ //当天按小时分组的人数 List list = numberMapper.selectListByTime(); - Map> collect = list.stream().collect(Collectors.groupingBy(BuildingNumberDTO::getStatisticPosition)); - return ResponseData.success(collect); + Map> collect = list.stream().collect(Collectors.groupingBy(BuildingNumberDTO::getStatisticTime)); + //定时任务中已将每小时三栋楼人数存到数据库 + //将一期主楼和录制楼人数合并,二期单算 + List> resultList = new ArrayList<>(); + collect.keySet().forEach(key -> { + List buildingNumberDTOS = collect.get(key); + BuildingNumberDTO mainBuildingOne = buildingNumberDTOS.get(0); + BuildingNumberDTO mainBuildingTwo = buildingNumberDTOS.get(1); + BuildingNumberDTO recordingBuilding = buildingNumberDTOS.get(2); + HashMap resultMap = new HashMap<>(); + Integer oneQuantity = Integer.valueOf(mainBuildingOne.getStatisticQuantity()); + Integer recordingQuantity = Integer.valueOf(recordingBuilding.getStatisticQuantity()); + resultMap.put("staticTime", mainBuildingOne.getStatisticTime()); + resultMap.put(mainBuildingOne.getStatisticPositionName()+"、"+recordingBuilding.getStatisticPositionName(), String.valueOf(oneQuantity+recordingQuantity)); + resultMap.put(mainBuildingTwo.getStatisticPositionName(), mainBuildingTwo.getStatisticQuantity()); + resultList.add(resultMap); + }); + return ResponseData.success(resultList); } /** @@ -151,12 +168,11 @@ public Object securityNumber() { QueryWrapper wrapper = new QueryWrapper<>(); wrapper.eq("staff_type", 2); + // TODO: 2022/9/2 后续使用产品确定的每天出勤的安保人员的数量 Integer total = staffInfoMapper.selectCount(wrapper); - //当日离岗事件个数 - QueryWrapper wrapper1 = new QueryWrapper<>(); - wrapper1.eq("hik_event_type", SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); - wrapper1.apply("date_format(now(),'%Y-%m-%d') = date_format(happen_time,'%Y-%m-%d')"); - Integer leave = caseInfoMapper.selectCount(wrapper1); + //当日离岗事件按设备去重后的个数 + // TODO: 2022/9/2 目前相当于24小时内的计算,之后看需要可改成自定义小时数计算离岗率,即离岗+6小时内仅一次离岗则恢复为100%,多次则累加离岗次数计算离岗率 + Integer leave = caseInfoMapper.selectDemobilizedCount(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); NumberFormat numberFormat = NumberFormat.getInstance(); // 设置精确到小数点后2位 numberFormat.setMaximumFractionDigits(2); @@ -179,7 +195,6 @@ @ResponseBody public Object visitorApplyDetail() { List reasonGroup = applyMapper.selectByVisitReason(); - HashMap resultMap = new HashMap<>(); NumberFormat numberFormat = NumberFormat.getInstance(); // 设置精确到小数点后2位 numberFormat.setMaximumFractionDigits(2); @@ -187,12 +202,17 @@ if(0 == sum){ return ResponseData.success(); } + List resultList = new ArrayList<>(); reasonGroup.forEach(group -> { String reasonName = dictService.getDictNameByCode(SecurityEventDict.VISIT_REASON, group.getVisitReason()); String result = numberFormat.format((float) group.getQuantity() / (float) sum * 100); - resultMap.put(reasonName, result+"%"); + ApplyReasonGroupDTO applyReasonGroupDTO = new ApplyReasonGroupDTO(); + applyReasonGroupDTO.setQuantity(group.getQuantity()); + applyReasonGroupDTO.setVisitReason(reasonName); + applyReasonGroupDTO.setRatio(result+"%"); + resultList.add(applyReasonGroupDTO); }); - return ResponseData.success(resultMap); + return ResponseData.success(resultList); } /** @@ -247,6 +267,32 @@ } /** + * 机动力量实时在岗率,在岗人数除以总应在岗人数,用离岗+6小时内恢复为100%,6小时外再计算 + */ + @GetMapping("/staff/beOnDutyRatio") + @ResponseBody + public Object beOnDutyRatio() { + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("staff_type", 2); + // TODO: 2022/9/2 后续使用产品确定的每天出勤的安保人员的数量 + Integer total = staffInfoMapper.selectCount(wrapper); + if(0 == total){ + return ResponseData.success(null); + } + //当日离岗事件按设备去重后的个数 + // TODO: 2022/9/2 目前相当于24小时内的计算,之后看需要可改成自定义小时数计算离岗率,即离岗+6小时内仅一次离岗则恢复为100%,多次则累加离岗次数计算离岗率 + List onDutyRatioDTOS = caseInfoMapper.selectDemobilizedCountByHour(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); + onDutyRatioDTOS.forEach(dto -> { + NumberFormat numberFormat = NumberFormat.getInstance(); + // 设置精确到小数点后2位 + numberFormat.setMaximumFractionDigits(2); + String result = numberFormat.format(100 - Float.valueOf(dto.getQuantity()) / (float) total * 100); + dto.setRatio(result+"%"); + }); + return ResponseData.success(onDutyRatioDTOS); + } + + /** * 闸机速通门统计-设备状态分组计算数量,devType传闸机字典key * 视频频监控摄像机统计-设备状态分组计算数量,devType传摄像头字典key */ @@ -262,12 +308,17 @@ if(sum <= 0){ return ResponseData.error("无该类设备信息"); } + List resultList = new ArrayList<>(); gateStatusGroup.forEach(group -> { String devStatus = dictService.getDictNameByCode(SecurityEventDict.DEVICE_STATUS, group.getStatus()); String result = numberFormat.format((float) group.getQuantity() / (float) sum * 100); - resultMap.put(devStatus, result+"%"); + GateStatusGroupResponse gateStatusGroupResponse = new GateStatusGroupResponse(); + gateStatusGroupResponse.setStatus(devStatus); + gateStatusGroupResponse.setRatio(result+"%"); + resultList.add(gateStatusGroupResponse); }); - resultMap.put("总", sum); + resultMap.put("total", sum); + resultMap.put("list", resultList); return ResponseData.success(resultMap); } @@ -282,17 +333,38 @@ String position = securityScoreDTO.getPosition(); List caseInfos = caseInfoMapper.selectByPosition(position); //查询各危险级别权重、各类别权重,放入map,避免循环中多次查数据库 - + HashMap hazardScoreMap = new HashMap<>(); + List caseHazardLevelList = hazardLevelMapper.getCaseHazardLevelList(null); + caseHazardLevelList.forEach(hazardLevel -> { + hazardScoreMap.put(hazardLevel.getCode(), hazardLevel.getWeight()); + }); + HashMap categoryScoreMap = new HashMap<>(); + List categoryLevelList = categoryLevelMapper.getCaseCategoryLevelList(null); + categoryLevelList.forEach(categoryLevel -> { + categoryScoreMap.put(categoryLevel.getCode(), categoryLevel.getWeight()); + }); + //事件按楼层分组,计算 List securityScoreDTOs = new ArrayList<>(); caseInfos.forEach(caseInfo -> { SecurityScoreDTO securityScoreDTO1 = new SecurityScoreDTO(); + securityScoreDTO1.setPosition(caseInfo.getPosition()); securityScoreDTO1.setArea(caseInfo.getArea()); - // TODO: 2022/8/4 楼层评分计算根据产品定义调整 -// caseInfo.get -// securityScoreDTO1.setScore(); + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); + Double score = 100 - Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + securityScoreDTO1.setScore(score); + securityScoreDTOs.add(securityScoreDTO1); }); - - return null; + 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); + }); + return ResponseData.success(securityScoreDTOs); } /** @@ -303,9 +375,13 @@ public Object SecurityFrequency(@RequestBody SecurityFrequencyDTO securityFrequencyDTO) { String year = securityFrequencyDTO.getYear(); String month = securityFrequencyDTO.getMonth(); - Integer quantity = caseInfoMapper.selectCountByMonth(year, month); - securityFrequencyDTO.setQuantity(quantity); - return ResponseData.success(securityFrequencyDTO); + if(!StringUtils.isEmpty(year) && StringUtils.isEmpty(month)){ + Integer quantity = caseInfoMapper.selectCountByMonth(year, month); + securityFrequencyDTO.setQuantity(quantity); + return ResponseData.success(securityFrequencyDTO); + } + List list = caseInfoMapper.selectPreMonthCount(); + return ResponseData.success(list); } } 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 ae4d770..f4f075c 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 @@ -1,20 +1,25 @@ package com.casic.missiles.modular.controller.cockpit; +import cn.hutool.core.date.DateUnit; import cn.hutool.core.date.DateUtil; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.casic.missiles.model.response.ResponseData; -import com.casic.missiles.modular.dao.AttendanceInfoMapper; -import com.casic.missiles.modular.dao.CaseInfoMapper; -import com.casic.missiles.modular.dao.HazardLevelMapper; -import com.casic.missiles.modular.dao.StaffInfoMapper; +import com.casic.missiles.modular.dao.*; +import com.casic.missiles.modular.dto.DeviceRepairLogDTO; +import com.casic.missiles.modular.dto.DeviceRepairRequest; import com.casic.missiles.modular.dto.statistics.*; +import com.casic.missiles.modular.enums.SecurityEventType; +import com.casic.missiles.modular.model.CaseCategoryLevel; import com.casic.missiles.modular.model.CaseHazardLevel; +import com.casic.missiles.modular.model.CaseInfo; import com.casic.missiles.modular.model.StaffInfo; +import com.casic.missiles.modular.service.DeviceInfoService; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.util.CollectionUtils; import org.springframework.web.bind.annotation.*; +import java.math.BigDecimal; import java.text.NumberFormat; import java.util.*; import java.util.stream.Collectors; @@ -40,6 +45,12 @@ @Autowired private HazardLevelMapper hazardLevelMapper; + @Autowired + private CategoryLevelMapper categoryLevelMapper; + + @Autowired + private DeviceInfoService deviceInfoService; + /** * 安防事件时域频次统计,每月的每天安防事件个数(原方案) * 月维度:展示每个月的每天的数据 @@ -89,15 +100,17 @@ List monthList = caseInfoMapper.selectPreMonthCountByYear(year); Map> collect = monthList.stream().collect(Collectors.groupingBy(PreMonthOrWeekCaseDTO::getHazardLevelCode)); HashMap strAvgMap = new HashMap<>(); + List resultList = new ArrayList<>(); for (String key : collect.keySet()) { List preMonthOrWeekCaseDTOS = collect.get(key); int sum = preMonthOrWeekCaseDTOS.stream().mapToInt(PreMonthOrWeekCaseDTO::getQuantity).sum(); //若年份是本年,则使用个安防级别数量/当前月份数 //若不是本年,除数为12 MonthAndWeekDTO monthAndWeekDTO = new MonthAndWeekDTO(); + String hazardName = hazardLevelMapper.selectHazardNameByCode(key); + monthAndWeekDTO.setLevelName(hazardName); if(year.equals(String.valueOf(DateUtil.thisYear()))){ monthAndWeekDTO.setMonthQuantity(sum / DateUtil.thisMonth()); -// monthAndWeekDTO.setLevelName(); strAvgMap.put(key, monthAndWeekDTO); }else{ monthAndWeekDTO.setMonthQuantity(sum / 12); @@ -113,27 +126,37 @@ if(year.equals(String.valueOf(DateUtil.thisYear()))){ if(!Objects.isNull(strAvgMap.get(key))){ MonthAndWeekDTO monthAndWeekDTO = strAvgMap.get(key); + String hazardName = hazardLevelMapper.selectHazardNameByCode(key); + monthAndWeekDTO.setLevelName(hazardName); monthAndWeekDTO.setWeekQuantity(sum / DateUtil.thisWeekOfYear()); strAvgMap.put(key, monthAndWeekDTO); }else{ MonthAndWeekDTO monthAndWeekDTO = new MonthAndWeekDTO(); + String hazardName = hazardLevelMapper.selectHazardNameByCode(key); + monthAndWeekDTO.setLevelName(hazardName); monthAndWeekDTO.setWeekQuantity(sum / DateUtil.thisWeekOfYear()); strAvgMap.put(key, monthAndWeekDTO); } }else{ if(!Objects.isNull(strAvgMap.get(key))){ MonthAndWeekDTO monthAndWeekDTO = strAvgMap.get(key); + String hazardName = hazardLevelMapper.selectHazardNameByCode(key); + monthAndWeekDTO.setLevelName(hazardName); monthAndWeekDTO.setWeekQuantity(sum / 52); strAvgMap.put(key, monthAndWeekDTO); }else{ MonthAndWeekDTO monthAndWeekDTO = new MonthAndWeekDTO(); + String hazardName = hazardLevelMapper.selectHazardNameByCode(key); + monthAndWeekDTO.setLevelName(hazardName); monthAndWeekDTO.setWeekQuantity(sum / 52); strAvgMap.put(key, monthAndWeekDTO); } } } - avgMonthAndWeekGroupDTO.setMap(strAvgMap); - return ResponseData.success(avgMonthAndWeekGroupDTO); + strAvgMap.keySet().forEach(key -> { + resultList.add(strAvgMap.get(key)); + }); + return ResponseData.success(resultList); } /** @@ -181,12 +204,178 @@ } /** - * 员工考勤人数变化,功能待定 + * 员工考勤人数变化,统计当天(横坐标为时)及近7天(横坐标为天)的考勤人数变化,只要发生一次考勤识别,次数的基数就正常增加(没有上班下班区分) */ + @PostMapping("/staff/attendanceNumber/{dimension}") + @ResponseBody + public Object attendanceNumber(@PathVariable("dimension") String dimension) { + List attendanceNumberDTOs = null; + List> resultList = new ArrayList<>(); + if("week".equals(dimension)){ + //近7天数据按天分组统计 + attendanceNumberDTOs = attendanceInfoMapper.getCountForWeek(); + }else if("day".equals(dimension)) { + //今天数据按小时分组统计 + attendanceNumberDTOs = attendanceInfoMapper.getCountForDay(); + } + if(CollectionUtils.isEmpty(attendanceNumberDTOs)){ + return ResponseData.error("该查询条件下,无员工出勤数据!"); + } + Map> collect = attendanceNumberDTOs.stream().collect(Collectors.groupingBy(AttendanceNumberDTO::getDate)); + collect.keySet().forEach(key -> { + List attendanceNumberDTOS = collect.get(key); + AttendanceNumberDTO attendanceNumberDTO = attendanceNumberDTOS.get(0); + AttendanceNumberDTO attendanceNumberDTO2 = attendanceNumberDTOS.get(1); + Map resultMap = new HashMap<>(); + resultMap.put(attendanceNumberDTO.getStaffType(), attendanceNumberDTO.getQuantity()); + resultMap.put(attendanceNumberDTO2.getStaffType(), attendanceNumberDTO2.getQuantity()); + resultMap.put("staticTime", attendanceNumberDTO.getDate()); + resultList.add(resultMap); + }); + return ResponseData.success(resultList); + } /** - * 近30天/近一周安保人员到岗排行 + * 早晚高峰区域安防评估 */ + @PostMapping("/security/assessment/{dimension}") + @ResponseBody + public Object securityAssessment(@PathVariable("dimension") String dimension) { + //查询各危险级别权重、各类别权重,放入map,避免循环中多次查数据库 + HashMap hazardScoreMap = new HashMap<>(); + List caseHazardLevelList = hazardLevelMapper.getCaseHazardLevelList(null); + caseHazardLevelList.forEach(hazardLevel -> { + hazardScoreMap.put(hazardLevel.getCode(), hazardLevel.getWeight()); + }); + HashMap categoryScoreMap = new HashMap<>(); + List categoryLevelList = categoryLevelMapper.getCaseCategoryLevelList(null); + categoryLevelList.forEach(categoryLevel -> { + categoryScoreMap.put(categoryLevel.getCode(), categoryLevel.getWeight()); + }); + HashMap hashMap = new HashMap<>(); + if("week".equals(dimension)){ + //近7天早晚高峰数据 + List caseInfos = caseInfoMapper.selectListBySevenDay(); + //按时间(天)进行分组 + caseInfos.forEach(caseInfo -> { + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); + Double score = Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + String[] array = caseInfo.getHappenTime().split(" "); + String dayTime = array[0]; + BigDecimal preScore; + if(hashMap.containsKey(dayTime)){ + Double aDouble = hashMap.get(dayTime); + preScore = new BigDecimal(aDouble.toString()); + + }else{ + preScore = new BigDecimal("100.0"); + } + BigDecimal nowScore = new BigDecimal(score.toString()); + hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); + }); + return ResponseData.success(hashMap); + }else if("day".equals(dimension)) { + //今天数据按小时分组统计 + List caseInfos = caseInfoMapper.selectListByToday(); + caseInfos.forEach(caseInfo -> { + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); + Double score = Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + String[] array = caseInfo.getHappenTime().split(":"); + String dayTime = array[0]; + BigDecimal preScore; + if(hashMap.containsKey(dayTime)){ + Double aDouble = hashMap.get(dayTime); + preScore = new BigDecimal(aDouble.toString()); + + }else{ + preScore = new BigDecimal("100.0"); + } + BigDecimal nowScore = new BigDecimal(score.toString()); + hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); + }); + return ResponseData.success(hashMap); + } + return null; + } + + /** + * 重点区域安防事态评估,统计重点区域6:00-23:00按小时分组数据 + */ + @GetMapping("/security/keyAreaStatistic") + @ResponseBody + public Object keyAreaStatistic() { + //查询各危险级别权重、各类别权重,放入map,避免循环中多次查数据库 + HashMap hazardScoreMap = new HashMap<>(); + List caseHazardLevelList = hazardLevelMapper.getCaseHazardLevelList(null); + caseHazardLevelList.forEach(hazardLevel -> { + hazardScoreMap.put(hazardLevel.getCode(), hazardLevel.getWeight()); + }); + HashMap categoryScoreMap = new HashMap<>(); + List categoryLevelList = categoryLevelMapper.getCaseCategoryLevelList(null); + categoryLevelList.forEach(categoryLevel -> { + categoryScoreMap.put(categoryLevel.getCode(), categoryLevel.getWeight()); + }); + HashMap hashMap = new HashMap<>(); + //今天数据按小时分组统计 + List caseInfos = caseInfoMapper.selectListByToday2(); + caseInfos.forEach(caseInfo -> { + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); + Double score = Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + String[] array = caseInfo.getHappenTime().split(":"); + String dayTime = array[0]; + BigDecimal preScore; + if(hashMap.containsKey(dayTime)){ + Double aDouble = hashMap.get(dayTime); + preScore = new BigDecimal(aDouble.toString()); + + }else{ + preScore = new BigDecimal("100.0"); + } + BigDecimal nowScore = new BigDecimal(score.toString()); + hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); + }); + return ResponseData.success(hashMap); + } + + /** + * 安防机动支援力量调配响应评估,根据事件已解决状态及已解决时间-发送时间,按时间(小时)分组统计 + */ + @GetMapping("/security/responseAssess") + @ResponseBody + public Object responseAssess() { + //查询各危险级别权重、各类别权重,放入map,避免循环中多次查数据库 + HashMap hazardScoreMap = new HashMap<>(); + List caseHazardLevelList = hazardLevelMapper.getCaseHazardLevelList(null); + caseHazardLevelList.forEach(hazardLevel -> { + hazardScoreMap.put(hazardLevel.getCode(), hazardLevel.getWeight()); + }); + HashMap hashMap = new HashMap<>(); + //今天数据按小时分组统计 + List caseInfos = caseInfoMapper.selectListByToday3(); + caseInfos.forEach(caseInfo -> { + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + //扣分=事件级别权重*未解决小时数 + Date updateTime = DateUtil.parse(caseInfo.getUpdateTime()); + Date happenTime = DateUtil.parse(caseInfo.getHappenTime()); + long between = DateUtil.between(updateTime, happenTime, DateUnit.HOUR); + Double score = Double.valueOf(hazardWeight)*between; + String[] array = caseInfo.getHappenTime().split(":"); + String dayTime = array[0]; + BigDecimal preScore; + if(hashMap.containsKey(dayTime)){ + Double aDouble = hashMap.get(dayTime); + preScore = new BigDecimal(aDouble.toString()); + }else{ + preScore = new BigDecimal("100.0"); + } + BigDecimal nowScore = new BigDecimal(score.toString()); + hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); + }); + return ResponseData.success(hashMap); + } /** * 重点区域威胁事件类型统计,优先级2,统计近7天和近30天 @@ -224,7 +413,34 @@ } /** - * 设备状态计算系数和评判,优先级3,需确认设备恢复时间是否可以获取 + * 近30天/近一周安保人员到岗排行 */ + + /** + * 安保等级评估,发生离岗事件减1分 + */ + @GetMapping("/security/levelAssess") + @ResponseBody + public Object securityLevelAssess() { + //今天数据按小时分组统计 + List resultList = caseInfoMapper.selectListByType(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); + resultList.forEach(result -> { + BigDecimal deScore = new BigDecimal(result.getQuantity()); + BigDecimal preScore = new BigDecimal("100.0"); + result.setScore(preScore.subtract(deScore).doubleValue()); + }); + return ResponseData.success(resultList); + } + + /** + * 设备状态计算系数和评判,即设备维修管理查询(不分页) + */ + @PostMapping("/device/repairList") + @ResponseBody + public Object repairList(@RequestBody DeviceRepairRequest deviceRepairRequest) { + List deviceRepairLogDTOS = deviceInfoService.deviceRepairListPage(deviceRepairRequest); + return ResponseData.success(deviceRepairLogDTOS); + } + } 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 fbf8ab6..c71a15a 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 @@ -1,13 +1,12 @@ package com.casic.missiles.modular.controller.hik; +import cn.hutool.core.date.DateTime; +import cn.hutool.core.date.DateUtil; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.casic.missiles.model.response.ResponseData; import com.casic.missiles.modular.dao.HikFaceGroupInfoMapper; -import com.casic.missiles.modular.dto.hik.EventSubscribeRequest; -import com.casic.missiles.modular.dto.hik.FaceGroupAdditionRequest; -import com.casic.missiles.modular.dto.hik.HikRecvEvent; -import com.casic.missiles.modular.dto.hik.OrgBatchAdd; +import com.casic.missiles.modular.dto.hik.*; import com.casic.missiles.modular.enums.HikUri; import com.casic.missiles.modular.enums.SecurityEventType; import com.casic.missiles.modular.model.CaseInfo; @@ -18,16 +17,20 @@ import com.casic.missiles.modular.util.CaseInfoFactoryUtil; import com.casic.missiles.modular.util.HikUtil; import com.casic.missiles.modular.util.ThreadPoolUtil; +import com.casic.missiles.modular.util.WebSocket; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; -import org.springframework.web.bind.annotation.*; +import org.springframework.util.CollectionUtils; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.RestController; -import java.net.InetAddress; -import java.net.UnknownHostException; import java.util.ArrayList; +import java.util.Iterator; import java.util.List; import java.util.Objects; @@ -38,7 +41,6 @@ */ @Slf4j @RestController -@RequestMapping("/hik") public class HikController { @Autowired @@ -53,28 +55,37 @@ @Autowired private HikService hikService; + @Autowired + private HikFaceGroupInfoMapper hikFaceGroupInfoMapper; + + @Autowired + private WebSocket webSocket; + @Value("${server.port}") private int serverPort; - @Autowired - private HikFaceGroupInfoMapper hikFaceGroupInfoMapper; /** * 海康事件订阅 */ - @PostMapping("/event/subscribe") + @PostMapping("/hik/event/subscribe") @ResponseBody - public Object eventSubscribe() throws UnknownHostException { + public Object eventSubscribe() { EventSubscribeRequest eventSubscribeRequest = new EventSubscribeRequest(); ArrayList list = new ArrayList<>(); list.add(SecurityEventType.DEVICE_OFFLINE); + list.add(SecurityEventType.DEVICE_ONLINE); list.add(SecurityEventType.KEY_PERSONNEL_IDENTIFY_EVENT); list.add(SecurityEventType.MONITORING_POINT_OFFLINE); + list.add(SecurityEventType.MONITORING_POINT_ONLINE); list.add(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); list.add(SecurityEventType.PERSONNEL_GATHER_EVENT); - InetAddress localHost = InetAddress.getLocalHost(); + list.add(SecurityEventType.VISITOR_REGISTER); + list.add(SecurityEventType.VISITOR_CHECKOUT); + list.add(SecurityEventType.HIGH_ALTITUDE_PARABOLIC); +// InetAddress localHost = InetAddress.getLocalHost(); eventSubscribeRequest.setEventTypes(list); - eventSubscribeRequest.setEventDest("https://" + localHost + ":" + serverPort + "/eventRcv"); + eventSubscribeRequest.setEventDest("http://" + "192.168.10.6" + ":" + serverPort + "/eventRcv"); //订阅类型,0-订阅原始事件,1-联动事件,2-原始事件和联动事件,不填使用默认值0 eventSubscribeRequest.setSubType(0); /** @@ -92,19 +103,25 @@ } /** + * 查询事件订阅信息 + */ + @PostMapping("/hik/event/query") + @ResponseBody + public Object eventQuery() { + String result = HikUtil.hikApi(HikUri.EVENT_INFO, ""); + return result; + } + + /** * 海康事件接收 */ @PostMapping("/eventRcv") @ResponseBody public Object eventRcv(@RequestBody HikRecvEvent hikRecvEvent) { //1、接收所需事件类型 - Long eventType = hikRecvEvent.getEventType(); + Number eventType = hikRecvEvent.getEventType(); log.info("接收到安防事件类型为:{}", eventType); CaseInfo caseInfo = caseInfoFactoryUtil.getCaseInfo(eventType); - //接收到不关心事件直接返回 - if(Objects.isNull(caseInfo)){ - return ResponseData.success(); - } //2、不同事件不同处理,caseInfoFactoryUtil已设置好事件基础定义信息 // 再为事件添加状态、设备编码、设备名称、位置、区域、时间 // 异步处理事件 @@ -114,19 +131,23 @@ caseHandle(hikRecvEvent, eventType, caseInfo); } })); +// caseHandle(hikRecvEvent, eventType, caseInfo); - return null; + return ResponseData.success(); } - private void caseHandle(HikRecvEvent hikRecvEvent, Long eventType, CaseInfo caseInfo) { + private void caseHandle(HikRecvEvent hikRecvEvent, Number eventType, CaseInfo caseInfo) { JSONArray eventArray = hikRecvEvent.getEventArray(); List caseInfos = new ArrayList<>(); - while (eventArray.stream().iterator().hasNext()) { + Iterator iterator = eventArray.iterator(); + while (iterator.hasNext()) { CaseInfo caseInfo1 = new CaseInfo(); - BeanUtils.copyProperties(caseInfo, caseInfo1); - JSONObject event = (JSONObject) eventArray.stream().iterator().next(); + if(!Objects.isNull(caseInfo)){ + BeanUtils.copyProperties(caseInfo, caseInfo1); + } + JSONObject event = (JSONObject) iterator.next(); //5种事件进行不同处理 - if(SecurityEventType.KEY_PERSONNEL_IDENTIFY_EVENT == eventType){ + if (SecurityEventType.KEY_PERSONNEL_IDENTIFY_EVENT.equals(eventType)) { //判断所属人脸分组 JSONObject data = (JSONObject) event.get("data"); JSONObject faceRecognitionResult = (JSONObject) data.get("faceRecognitionResult"); @@ -142,52 +163,101 @@ if (faceGroupCode.equals(blackListGroup.getFaceGroupCode())) { //黑名单分组处理 caseInfo1 = hikService.blackListHandle(event, caseInfo1); - }else if(faceGroupCode.equals(propertyPersonnelGroup.getFaceGroupCode())){ + } else if (faceGroupCode.equals(propertyPersonnelGroup.getFaceGroupCode())) { //考勤分组处理-物业人员,添加到考勤表 hikService.propertyAttendanceHandle(event); - }else if(faceGroupCode.equals(securityPersonnelGroup.getFaceGroupCode())){ + } else if (faceGroupCode.equals(securityPersonnelGroup.getFaceGroupCode())) { //考勤分组处理-安保人员,添加到考勤表 hikService.securityPersonnelHandle(event); - }else { + } else { return; } - }else if(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT == eventType){ + } else if (SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT.equals(eventType)) { //离岗事件处理 caseInfo1 = hikService.demobilizedHandle(event, caseInfo1); - }else if(SecurityEventType.PERSONNEL_GATHER_EVENT == eventType){ + } else if (SecurityEventType.PERSONNEL_GATHER_EVENT.equals(eventType)) { //人员聚集事件处理 caseInfo1 = hikService.personGatherHandle(event, caseInfo1); - }else if(SecurityEventType.MONITORING_POINT_OFFLINE == eventType){ + } else if (SecurityEventType.MONITORING_POINT_OFFLINE.equals(eventType)) { //监控点离线事件处理 caseInfo1 = hikService.monitorPointOfflineHandle(event, caseInfo1); - }else if(SecurityEventType.DEVICE_OFFLINE == eventType){ + } else if (SecurityEventType.MONITORING_POINT_ONLINE.equals(eventType)) { + //监控点上线事件处理 + hikService.monitorPointOnlineHandle(event); + } else if (SecurityEventType.DEVICE_OFFLINE.equals(eventType)) { //装置离线事件处理 caseInfo1 = hikService.deviceOfflineHandle(event, caseInfo1); - }else if(SecurityEventType.VISITOR_REGISTER == eventType){ + } else if (SecurityEventType.DEVICE_ONLINE.equals(eventType)) { + //装置上线处理 + hikService.deviceOnlineHandle(event); + } else if (SecurityEventType.VISITOR_REGISTER.equals(eventType)) { //记录访客登记记录,添加到访客记录表 hikService.visitorRegisterHandler(event); - }else if(SecurityEventType.VISITOR_CHECKOUT == eventType){ + } else if (SecurityEventType.VISITOR_CHECKOUT.equals(eventType)) { //记录访客签离记录 hikService.visitorCheckOutHandler(event); } - if(!Objects.isNull(caseInfo1) && !StringUtils.isEmpty(caseInfo1.getHappenTime())){ + if (!Objects.isNull(caseInfo1) && !StringUtils.isEmpty(caseInfo1.getHappenTime())) { caseInfos.add(caseInfo1); } } //3、安防事件入库 - if(!caseInfoService.insertCaseInfoBatch(caseInfos)){ - log.error("安防事件批量入库异常"); + if (!CollectionUtils.isEmpty(caseInfos) && !caseInfoService.insertCaseInfoBatch(caseInfos)) { + log.error("安防事件批量入库异常!"); } // TODO: 2022/8/15 webSocket推送 + if (CollectionUtils.isEmpty(caseInfos)) { + log.info("webSocket事件推送"); + webSocket.sendAllMessage(JSONObject.toJSONString(caseInfos)); + } return; } /** + * 以图搜图,前端用于轨迹追踪 + */ + @PostMapping("/hik/search/picture") + @ResponseBody + public Object searchPictures(@RequestBody SearchPicturesRequest searchPicturesRequest) { + DateTime startDateTime = DateUtil.parse(searchPicturesRequest.getStartTime()); + DateTime endDateTime = DateUtil.parse(searchPicturesRequest.getEndTime()); + String startTime = DateUtil.format(startDateTime, "yyyy-MM-dd'T'HH:mm:ss.SSSXXX"); + String endTime = DateUtil.format(endDateTime, "yyyy-MM-dd'T'HH:mm:ss.SSSXXX"); + searchPicturesRequest.setStartTime(startTime); + searchPicturesRequest.setEndTime(endTime); + String body = JSONObject.toJSONString(searchPicturesRequest); + String resultStr = HikUtil.hikApi(HikUri.SEARCH_PICTURES, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (!"0".equals(resultJson.get("code"))) { + log.error("请求海康,以图搜图失败,海康response:{}", resultStr); + return ResponseData.error("以图搜图失败"); + } + return ResponseData.success(resultJson); + } + + + /** + * 海康事件取消订阅 + */ + @PostMapping("/hik/event/cancel") + @ResponseBody + public Object eventCancelSubscribe(@RequestBody CancelSubscribeRequest cancelSubscribeRequest) { + String body = JSONObject.toJSONString(cancelSubscribeRequest); + String resultStr = HikUtil.hikApi(HikUri.EVENT_CANCEL, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (!"0".equals(resultJson.get("code"))) { + log.error("请求海康,取消订阅失败,海康response:{}", resultStr); + return ResponseData.error("取消订阅失败"); + } + return ResponseData.success(resultJson); + } + + /** * 单个添加海康人脸分组 * api->hik单个添加人脸分组api->response->mysql */ - @PostMapping("/faceGroup/single/add") + @PostMapping("/hik/faceGroup/single/add") @ResponseBody public Object faceGroupAddition(@RequestBody FaceGroupAdditionRequest faceGroupAdditionRequest) { String body = JSONObject.toJSONString(faceGroupAdditionRequest); @@ -212,7 +282,7 @@ * 批量添加海康组织 * api->hik批量添加组织api->response */ - @PostMapping("/org/batch/add") + @PostMapping("/hik/org/batch/add") @ResponseBody public Object orgBatchAdd(@RequestBody List orgBatchAddRequest) { String body = JSONObject.toJSONString(orgBatchAddRequest); @@ -232,4 +302,62 @@ return ResponseData.error("批量添加组织失败"); } + /** + * 获取人员列表 + */ + @PostMapping("/hik/person/personList") + @ResponseBody + public Object personList() { + PersonListRequest request = new PersonListRequest(); + request.setPageNo(1); + request.setPageSize(100); + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi("/api/resource/v2/person/personList", body); + return resultStr; + } + + /** + * 获取组织列表 + */ + @PostMapping("/hik/org/orgList") + @ResponseBody + public Object orgList() { + PersonListRequest request = new PersonListRequest(); + request.setPageNo(1); + request.setPageSize(100); + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi("/api/resource/v1/org/orgList", body); + return resultStr; + } + + /** + * 查询访客权限下载记录 + */ + @PostMapping("/hik/auth/result") + @ResponseBody + public Object authResult() { + PersonListRequest request = new PersonListRequest(); + request.setPageNo(1); + request.setPageSize(100); + request.setOrderId("ba101db6246711edaea66f7939a13638"); + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi("/api/visitor/v1/auth/result", body); + return resultStr; + } + + /** + * 人脸图片获取 + */ + @PostMapping("/hik/face/picture") + @ResponseBody + public Object facePicture() { + FaceRequest request = new FaceRequest(); +// List list = new ArrayList<>(); +// list.add(""); + request.setCertificateNum("wanggong"); + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi("/api/frs/v1/face", body); + return resultStr; + } + } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/AssetInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/AssetInfoMapper.java index 4f64e83..c0684ee 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/AssetInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/AssetInfoMapper.java @@ -17,6 +17,6 @@ @Mapper public interface AssetInfoMapper extends BaseMapper { - List getAssetInfoListPage(@Param("page") Page page, AssetInfoRequest assetInfoRequest); + List getAssetInfoListPage(@Param("page") Page page, @Param("assetInfoRequest") AssetInfoRequest assetInfoRequest); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/AttendanceInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/AttendanceInfoMapper.java index f9e793e..ec87e46 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/AttendanceInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/AttendanceInfoMapper.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.statistics.AttendanceNumberDTO; import com.casic.missiles.modular.dto.statistics.AttendanceRatioDTO; import com.casic.missiles.modular.model.AttendanceInfo; import org.apache.ibatis.annotations.Mapper; @@ -17,7 +18,7 @@ */ @Mapper public interface AttendanceInfoMapper extends BaseMapper { - List getAttendanceInfoListPage(@Param("page") Page page, StaffInfoRequest attendanceInfoRequest); + List getAttendanceInfoListPage(@Param("page") Page page, @Param("attendanceInfoRequest") StaffInfoRequest attendanceInfoRequest); AttendanceInfo selectByCodeAndDate(@Param("staffCode") String staffCode); @@ -26,4 +27,8 @@ List getCountByTypeAndDateForMonth(@Param("staffType")String staffType); List getCountByTypeAndDateForYear(@Param("staffType")String staffType); + + List getCountForWeek(); + + List getCountForDay(); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java index ce94b8f..6137a7d 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java @@ -17,5 +17,5 @@ @Mapper public interface BlackInfoMapper extends BaseMapper { - List getBlackInfoListPage(@Param("page") Page page, BlackInfoRequest blackInfoRequest); + List getBlackInfoListPage(@Param("page") Page page, @Param("blackInfoRequest") BlackInfoRequest blackInfoRequest); } 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 efda6b3..50aaa6f 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 @@ -20,7 +20,7 @@ List getCaseInfoListPage(@Param("page") Page page, @Param("caseInfoRequest") CaseInfoRequest caseInfoRequest); - int updateStatusById(CaseInfoRequest caseInfoRequest); + int updateStatusById(@Param("caseInfoRequest") CaseInfoRequest caseInfoRequest); List selectByLevelAndMonth(@Param("year") String year); @@ -47,4 +47,20 @@ List selectPreWeekCountByThirtyDay(); List selectPreDayCountBySevenDay(); + + Integer selectDemobilizedCount(@Param("eventType") Number personnelDemobilizedEvent); + + List selectPreMonthCount(); + + List selectListBySevenDay(); + + List selectListByToday(); + + List selectListByToday2(); + + List selectListByToday3(); + + List selectListByType(@Param("eventType") Number eventType); + + List selectDemobilizedCountByHour(@Param("eventType") Number eventType); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/CategoryLevelMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/CategoryLevelMapper.java index 52fc714..afe1650 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/CategoryLevelMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/CategoryLevelMapper.java @@ -17,9 +17,9 @@ @Mapper public interface CategoryLevelMapper extends BaseMapper { - List getCaseCategoryLevelListPage(@Param("page") Page page, CategoryLevelRequest categoryLevelRequest); + List getCaseCategoryLevelListPage(@Param("page") Page page, @Param("categoryLevelRequest") CategoryLevelRequest categoryLevelRequest); - List getCaseCategoryLevelList(CategoryLevelRequest categoryLevelRequest); + List getCaseCategoryLevelList(@Param("categoryLevelRequest") CategoryLevelRequest categoryLevelRequest); CaseCategoryLevel getCaseCategoryLevel(@Param("categoryLevelCode") String categoryLevelCode); 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 66353b1..2555a09 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 @@ -19,7 +19,7 @@ @Mapper public interface DeviceInfoMapper extends BaseMapper { - List getDeviceInfoListPage(@Param("page") Page page, DeviceInfoRequest deviceInfoRequest); + List getDeviceInfoListPage(@Param("page") Page page, @Param("deviceInfoRequest") DeviceInfoRequest deviceInfoRequest); List getDeviceInfoList(@Param("deviceInfoRequest") DeviceInfoRequest deviceInfoRequest); @@ -27,6 +27,8 @@ DeviceInfo getByIndexCode(@Param("srcIndex") String srcIndex); + DeviceInfo getByIp(@Param("ip") String ip); + List selectIndexCodesByCodes(@Param("deviceCodes") List deviceCodes); List selectByType(@Param("devType") String devType); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java index 41dd0af..5bfaf63 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java @@ -5,6 +5,7 @@ import com.casic.missiles.modular.dto.DeviceRepairRequest; import com.casic.missiles.modular.model.DeviceRepairLog; import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; import java.util.List; @@ -16,7 +17,7 @@ @Mapper public interface DeviceRepairLogMapper extends BaseMapper { - List getDeviceRepairListPage(Page page, DeviceRepairRequest deviceRepairRequest); + List getDeviceRepairListPage(@Param("page") Page page, @Param("deviceRepairRequest")DeviceRepairRequest deviceRepairRequest); - List getDeviceRepairList(DeviceRepairRequest deviceRepairRequest); + List getDeviceRepairList(@Param("deviceRepairRequest") DeviceRepairRequest deviceRepairRequest); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java index 9035c47..4823ac1 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java @@ -18,7 +18,7 @@ @Mapper public interface FireEquipInfoMapper extends BaseMapper { - List getFireEquipInfoListPage(@Param("page") Page page, FireEquipRequest fireEquipRequest); + List getFireEquipInfoListPage(@Param("page") Page page, @Param("fireEquipRequest") FireEquipRequest fireEquipRequest); FireEquipInfo getFireEquipInfo(@Param("equipCode") String equipCode); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/GateGroupMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/GateGroupMapper.java index d8c330d..977a427 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/GateGroupMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/GateGroupMapper.java @@ -17,7 +17,7 @@ */ @Mapper public interface GateGroupMapper extends BaseMapper { - List getGateGroupListPage(@Param("page") Page page, GateGroupRequest gateGroupRequest); + List getGateGroupListPage(@Param("page") Page page, @Param("gateGroupRequest") GateGroupRequest gateGroupRequest); GateGroup getGateGroupByName(@Param("groupName") String groupName); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/HazardLevelMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/HazardLevelMapper.java index 8957780..dcf47bb 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/HazardLevelMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/HazardLevelMapper.java @@ -17,11 +17,13 @@ @Mapper public interface HazardLevelMapper extends BaseMapper { - List getCaseHazardLevelListPage(@Param("page") Page page, HazardLevelRequest hazardLevelRequest); + List getCaseHazardLevelListPage(@Param("page") Page page, @Param("hazardLevelRequest") HazardLevelRequest hazardLevelRequest); - List getCaseHazardLevelList(HazardLevelRequest hazardLevelRequest); + List getCaseHazardLevelList(@Param("hazardLevelRequest") HazardLevelRequest hazardLevelRequest); CaseHazardLevel getCaseHazardLevel(@Param("hazardLevelCode") String hazardLevelCode); List selectHazardName(); + + String selectHazardNameByCode(@Param("hazardLevelCode") String hazardLevelCode); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/HikCaseDefineMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/HikCaseDefineMapper.java index 0dc47d1..f162fef 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/HikCaseDefineMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/HikCaseDefineMapper.java @@ -12,5 +12,5 @@ */ @Mapper public interface HikCaseDefineMapper extends BaseMapper { - HikCaseDefine getHikCaseDefine(@Param("caseTypeCode") Long caseTypeCode); + HikCaseDefine getHikCaseDefine(@Param("caseTypeCode") Number caseTypeCode); } 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 f8a674c..fe5afc2 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 @@ -17,11 +17,13 @@ @Mapper public interface StaffInfoMapper extends BaseMapper { - List getStaffInfoListPage(@Param("page") Page page, StaffInfoRequest staffInfoRequest); + List getStaffInfoListPage(@Param("page") Page page, @Param("staffInfoRequest") StaffInfoRequest staffInfoRequest); StaffInfo selectByCode(@Param("staffCode") String staffCode); - List getStaffInfoList(StaffInfoRequest staffInfoRequest); + List getStaffInfoList(@Param("staffInfoRequest") StaffInfoRequest staffInfoRequest); - List selectBatchCodes(List list); + List selectBatchCodes(@Param("list") List list); + + int updateByCodeForCard(@Param("staffCode") String staffCode, @Param("cardNo") String cardNo); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitInfoMapper.java index b1217c5..6c52542 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitInfoMapper.java @@ -16,7 +16,7 @@ */ @Mapper public interface VisitInfoMapper extends BaseMapper { - List getVisitInfoListPage(@Param("page") Page page, VisitorRequest visitorRequest); + List getVisitInfoListPage(@Param("page") Page page, @Param("visitorRequest") VisitorRequest visitorRequest); VisitInfo selectByOrderId(@Param("orderId") String orderId); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitorApplyMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitorApplyMapper.java index c09f3c0..6ea55bd 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitorApplyMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitorApplyMapper.java @@ -18,7 +18,7 @@ @Mapper public interface VisitorApplyMapper extends BaseMapper { - List getVisitorApplyListPage(@Param("page") Page page, VisitorApplyRequest visitorApplyRequest); + List getVisitorApplyListPage(@Param("page") Page page, @Param("visitorApplyRequest") VisitorApplyRequest visitorApplyRequest); List selectByVisitReason(); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/AttendanceInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/AttendanceInfoMapper.xml index b2ece71..f8bdd6e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/AttendanceInfoMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/AttendanceInfoMapper.xml @@ -43,7 +43,8 @@ and staff_type = #{staffType} - and YEARWEEK(date_format(atte_date, '%Y-%m-%d'), 1) = YEARWEEK(now(),1); + AND DATE_SUB(CURDATE(), INTERVAL 7 DAY) <= DATE(atte_date) + GROUP BY DATE_FORMAT(atte_date, '%Y-%m-%d') @@ -69,4 +70,20 @@ GROUP BY DATE_FORMAT(atte_date, '%Y-%m') + + + \ No newline at end of file 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 2b6953f..06ec0a8 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 @@ -28,7 +28,9 @@ @@ -87,7 +89,8 @@ SELECT hazard_level_code as levelCode, count(id) as quantity FROM bus_case_info WHERE hazard_level_code is not null - AND DATE_SUB(CURDATE(), INTERVAL 7 DAY) <= date(happen_time); + AND is_key_area = 1 + AND DATE_SUB(CURDATE(), INTERVAL 7 DAY) <= date(happen_time) GROUP BY hazard_level_code @@ -95,7 +98,8 @@ SELECT hazard_level_code as levelCode, count(id) as quantity FROM bus_case_info WHERE hazard_level_code is not null - AND DATE_SUB(CURDATE(), INTERVAL 30 DAY) <= date(happen_time); + AND is_key_area = 1 + AND DATE_SUB(CURDATE(), INTERVAL 30 DAY) <= date(happen_time) GROUP BY hazard_level_code @@ -122,4 +126,71 @@ AND hazard_level_code is not null GROUP BY DATE_FORMAT(happen_time,'%Y-%m-%d') + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/CategoryLevelMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/CategoryLevelMapper.xml index 4670b1f..1d25cbd 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/CategoryLevelMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/CategoryLevelMapper.xml @@ -20,11 +20,11 @@ SELECT * FROM bus_case_category_level WHERE 1=1 - - and code = #{code} + + and code = #{categoryLevelRequest.code} - - and name = #{name} + + and name = #{categoryLevelRequest.name} ORDER by create_time DESC 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 9b66fd8..bfd84b7 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 @@ -98,4 +98,10 @@ #{item} + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceRepairLogMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceRepairLogMapper.xml index 078ed3c..cf1a481 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceRepairLogMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceRepairLogMapper.xml @@ -22,14 +22,14 @@ SELECT * FROM bus_device_repair_log WHERE 1=1 - - and device_code = #{devCode} + + and device_code = #{deviceRepairRequest.devCode} - - and device_name = #{devName} + + and device_name = #{deviceRepairRequest.devName} - - and DATE_FORMAT(create_time,"%y%m%d") = DATE_FORMAT(#{createTime},"%y%m%d") + + and DATE_FORMAT(create_time,"%y%m%d") = DATE_FORMAT(#{deviceRepairRequest.createTime},"%y%m%d") ORDER by create_time DESC diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/HazardLevelMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/HazardLevelMapper.xml index f16f2b9..458322b 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/HazardLevelMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/HazardLevelMapper.xml @@ -20,11 +20,11 @@ SELECT * FROM bus_case_hazard_level WHERE 1=1 - - and code = #{code} + + and code = #{hazardLevelRequest.code} - - and name = #{name} + + and name = #{hazardLevelRequest.name} ORDER by create_time DESC @@ -42,4 +42,10 @@ SELECT name FROM bus_case_hazard_level + + \ 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 557237e..b6a183a 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 @@ -50,4 +50,10 @@ + + + UPDATE bus_staff_info + SET card_no = #{cardNo} + WHERE staff_code = #{staffCode} + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitInfoMapper.xml index 84aa84f..230529a 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitInfoMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitInfoMapper.xml @@ -27,5 +27,6 @@ SELECT * FROM bus_visit_info WHERE order_id = #{orderId} and DATE_FORMAT(in_time,'%Y-%m-%d') = CURRENT_DATE + limit 1 \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/BlackPictureRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/BlackPictureRequest.java new file mode 100644 index 0000000..fc92701 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/BlackPictureRequest.java @@ -0,0 +1,14 @@ +package com.casic.missiles.modular.dto; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/29 19:26 + */ +@Data +public class BlackPictureRequest { + private String picUri; + private String serverIndexCode; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/CancelSubscribeRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/CancelSubscribeRequest.java new file mode 100644 index 0000000..e2d390a --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/CancelSubscribeRequest.java @@ -0,0 +1,15 @@ +package com.casic.missiles.modular.dto.hik; + +import lombok.Data; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/24 15:14 + */ +@Data +public class CancelSubscribeRequest { + private List eventTypes; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/CardInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/CardInfo.java new file mode 100644 index 0000000..341457d --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/CardInfo.java @@ -0,0 +1,24 @@ +package com.casic.missiles.modular.dto.hik; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/26 16:08 + */ +@Data +public class CardInfo { + //卡号,8~20个字符,支持数字和大写字母 + private String cardNo; + //人员ID,员工工号 + private String personId; + //人员所属组织IndexCode + private String orgIndexCode; + //卡片类型,默认是1:IC卡 + //1:IC卡 + //2:CPU卡 + //3:远距离卡 + //4:MIFARE卡 + private Number cardType; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/FaceRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/FaceRequest.java new file mode 100644 index 0000000..edc04bf --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/FaceRequest.java @@ -0,0 +1,16 @@ +package com.casic.missiles.modular.dto.hik; + +import lombok.Data; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/25 16:53 + */ +@Data +public class FaceRequest { + private String certificateNum; + private List indexCodes; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/HikRecvEvent.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/HikRecvEvent.java index a3e9845..1b2b2b1 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/HikRecvEvent.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/HikRecvEvent.java @@ -28,12 +28,12 @@ /** * 事件类型,用于判断所需接收到的事件类型 */ - public Long getEventType(){ + public Number getEventType(){ JSONObject jsonObject = (JSONObject)JSONObject.toJSON(params); //事件类别对应SecurityEventTypeEnum JSONArray eventTypeArray = (JSONArray)jsonObject.get("events"); JSONObject eventJsonObject = (JSONObject)JSONObject.toJSON(eventTypeArray.get(0)); - Long eventType = (Long) eventJsonObject.get("eventType"); + Number eventType = (Number) eventJsonObject.get("eventType"); return eventType; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonBatchDeleteRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonBatchDeleteRequest.java index 027d31d..9751929 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonBatchDeleteRequest.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonBatchDeleteRequest.java @@ -12,4 +12,6 @@ @Data public class PersonBatchDeleteRequest { private List personIds; + //删除人脸接口使用 + private String faceId; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonInfoRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonInfoRequest.java new file mode 100644 index 0000000..05dc9e1 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonInfoRequest.java @@ -0,0 +1,20 @@ +package com.casic.missiles.modular.dto.hik; + +import lombok.Data; + +import java.util.List; + +/** + * @Description: 获取员工照片请求实体 + * @Author: wangpeng + * @Date: 2022/8/25 16:53 + */ +@Data +public class PersonInfoRequest { + //获取员工详细信息使用 + private String paramName; + private List paramValue; + //获取照片使用 + private String picUri; + private String serverIndexCode; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonListRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonListRequest.java new file mode 100644 index 0000000..3f7149b --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonListRequest.java @@ -0,0 +1,16 @@ +package com.casic.missiles.modular.dto.hik; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/25 16:53 + */ +@Data +public class PersonListRequest { + private Number pageNo; + private Number pageSize; + + private String orderId; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/SearchPicturesRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/SearchPicturesRequest.java new file mode 100644 index 0000000..0a95966 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/SearchPicturesRequest.java @@ -0,0 +1,24 @@ +package com.casic.missiles.modular.dto.hik; + +import lombok.Data; + +import java.util.List; + +/** + * @Description: 以图搜图请求 + * @Author: wangpeng + * @Date: 2022/8/29 10:46 + */ +@Data +public class SearchPicturesRequest { + private String facePicBinaryData; + private String facePicUrl; + private List cameraIndexCodes; + private String startTime; + private String endTime; + //指定搜图的最小相似度,最小为1,最大为100 + private String minSimilarity; + private Number age; + //male-男性,female-女性 + private String sex; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/StaffCardRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/StaffCardRequest.java new file mode 100644 index 0000000..4052e6d --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/StaffCardRequest.java @@ -0,0 +1,20 @@ +package com.casic.missiles.modular.dto.hik; + +import lombok.Data; + +import java.util.List; + +/** + * @Description: 人员开卡请求实体 + * @Author: wangpeng + * @Date: 2022/8/26 16:05 + */ +@Data +public class StaffCardRequest { + //卡片开始有效时间,时间格式:yyyy-MM-dd + private String startDate; + //卡片截止有效时间,时间格式:yyyy-MM-dd,不能大于2037年12月31日 + private String endDate; + //cardList,待开卡列表,最大支持50张卡 + private List cardList; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/VisitorInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/VisitorInfo.java index 73aa316..b99f301 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/VisitorInfo.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/VisitorInfo.java @@ -14,7 +14,7 @@ //访客性别 //1: 男 //2: 女 - private String gender; + private Integer gender; //联系电话建议填写手机号码 private String phoneNo; //证件类型 diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/ApplyReasonGroupDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/ApplyReasonGroupDTO.java index 514f382..786143e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/ApplyReasonGroupDTO.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/ApplyReasonGroupDTO.java @@ -13,4 +13,6 @@ private String visitReason; //访问人数 private Integer quantity; + //占比 + private String ratio; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/AttendanceNumberDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/AttendanceNumberDTO.java new file mode 100644 index 0000000..a494321 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/AttendanceNumberDTO.java @@ -0,0 +1,24 @@ +package com.casic.missiles.modular.dto.statistics; + +import com.fasterxml.jackson.annotation.JsonIgnore; +import lombok.Data; + +/** + * @Description: 出勤人数统计实体 + * @Author: wangpeng + * @Date: 2022/8/31 19:24 + */ +@Data +public class AttendanceNumberDTO { + //日期维度,周、今日,入参 + @JsonIgnore + private String dateDimension; + + //日期,具体天/小时,出参 + private String date; + //出勤人数 + private String quantity; + //员工类型 + private String staffType; + +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/AvgMonthAndWeekGroupDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/AvgMonthAndWeekGroupDTO.java index 4366916..331a9a9 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/AvgMonthAndWeekGroupDTO.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/AvgMonthAndWeekGroupDTO.java @@ -2,8 +2,6 @@ import lombok.Data; -import java.util.Map; - /** * @Description: 平均每月和每周的数据实体 * @Author: wangpeng @@ -13,6 +11,4 @@ public class AvgMonthAndWeekGroupDTO { //入参 private String year; - //出参,key:事件类型,value:周和月数据平均值 - private Map map; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/GateStatusGroupResponse.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/GateStatusGroupResponse.java new file mode 100644 index 0000000..d16f4e5 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/GateStatusGroupResponse.java @@ -0,0 +1,16 @@ +package com.casic.missiles.modular.dto.statistics; + +import lombok.Data; + +/** + * @Description: 闸机/摄像机统计响应实体 + * @Author: wangpeng + * @Date: 2022/8/30 14:22 + */ +@Data +public class GateStatusGroupResponse { + //设备状态 + private String status; + //占比 + private String ratio; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/BlackListController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/BlackListController.java index a27f9f8..0c06661 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/BlackListController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/BlackListController.java @@ -1,13 +1,18 @@ package com.casic.missiles.modular.controller; +import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.base.controller.ExportController; import com.casic.missiles.core.page.PageFactory; import com.casic.missiles.model.response.ResponseData; import com.casic.missiles.modular.dto.BlackInfoRequest; +import com.casic.missiles.modular.dto.BlackPictureRequest; +import com.casic.missiles.modular.dto.hik.PersonInfoRequest; +import com.casic.missiles.modular.enums.HikUri; import com.casic.missiles.modular.enums.OperateTypeEnum; import com.casic.missiles.modular.model.BlackInfo; import com.casic.missiles.modular.service.BlackInfoService; +import com.casic.missiles.modular.util.HikUtil; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; @@ -56,4 +61,22 @@ return null; } + /** + * 黑名单人员照片 + */ + @PostMapping("/personPicture") + @ResponseBody + public Object personPicture(@RequestBody BlackPictureRequest blackPictureRequest){ + //获取照片 + String picUri = blackPictureRequest.getPicUri(); + String serverIndexCode = blackPictureRequest.getServerIndexCode(); + PersonInfoRequest picRequest = new PersonInfoRequest(); + picRequest.setPicUri(picUri); + picRequest.setServerIndexCode(serverIndexCode); + String reBody = JSONObject.toJSONString(picRequest); + //重定向地址获取 + String url = HikUtil.hikApiFor302(HikUri.PERSON_PICTURE, reBody); + return ResponseData.success(url); + } + } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/DeviceController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/DeviceController.java index e1c4eba..666bbee 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/DeviceController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/DeviceController.java @@ -107,7 +107,7 @@ } /** - * 设备维修管理查询(分页),需计算MTTR=总维修时间/故障次数 + * 设备状态计算与评判/设备维修管理查询(分页),需计算MTTR=总维修时间/故障次数 */ @PostMapping("/repair/listPage") @ResponseBody @@ -211,7 +211,7 @@ //需根据设备编号获取到对应的门禁点唯一标识 doorControlRequest.setDoorIndexCodes(indexCodes); doorControlRequest.setControlType(Integer.valueOf(gateGroupDTO.getStatus())); - String body = JSONObject.toJSONString(deviceCodes); + String body = JSONObject.toJSONString(doorControlRequest); String resultStr = HikUtil.hikApi(HikUri.DOOR_CONTROL, body); JSONObject resultJson = (JSONObject)JSONObject.parse(resultStr); if (!"0".equals(resultJson.get("code"))) { diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/StaffController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/StaffController.java index b58ccab..704093c 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/StaffController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/StaffController.java @@ -2,15 +2,21 @@ import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.util.StrUtil; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.base.controller.ExportController; import com.casic.missiles.core.page.PageFactory; import com.casic.missiles.model.response.ErrorResponseData; import com.casic.missiles.model.response.ResponseData; import com.casic.missiles.modular.dto.StaffInfoRequest; +import com.casic.missiles.modular.dto.hik.PersonInfoRequest; +import com.casic.missiles.modular.dto.hik.StaffCardRequest; +import com.casic.missiles.modular.enums.HikUri; import com.casic.missiles.modular.enums.OperateTypeEnum; import com.casic.missiles.modular.model.StaffInfo; import com.casic.missiles.modular.service.StaffInfoService; +import com.casic.missiles.modular.util.HikUtil; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; @@ -110,4 +116,60 @@ } return ResponseData.success(); } + + /** + * 批量开卡,添加人员之后调用,若在一个接口中添加人员成功开卡失败则第二次添加时会有问题 + */ + @PostMapping("/cardBinding") + @ResponseBody + public Object cardBinding(@RequestBody StaffCardRequest staffCardRequest) { + String body = JSONObject.toJSONString(staffCardRequest); + String resultStr = HikUtil.hikApi(HikUri.CARD_BINDING, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (!"0".equals(resultJson.get("code"))) { + log.error("请求海康,批量开卡失败,海康response:{}", resultStr); + return ResponseData.error("批量开卡失败"); + } + //保存卡号 + if(staffInfoService.saveCardInfo(staffCardRequest) > 0){ + return ResponseData.success(); + } + return ResponseData.error("批量开卡失败"); + } + + /** + * 获取员工照片,海康存储 + */ + @PostMapping("/personPicture/{staffCode}") + @ResponseBody + public Object personPicture(@PathVariable("staffCode") String staffCode){ + //获取员工详细信息,含图片服务器、uri + PersonInfoRequest request = new PersonInfoRequest(); + List list = new ArrayList<>(); + list.add(staffCode); + request.setParamName("personId"); + request.setParamValue(list); + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi(HikUri.PERSON_INFO, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (!"0".equals(resultJson.get("code"))) { + log.error("请求海康,根据人员唯一字段获取人员详细信息失败,海康response:{}", resultStr); + return ResponseData.error("获取员工照片失败"); + } + //获取照片 + JSONObject data = (JSONObject) resultJson.get("data"); + JSONArray dataArray = (JSONArray) data.get("list"); + JSONObject jsonObject = (JSONObject) dataArray.get(0); + JSONArray personPhoto = (JSONArray) jsonObject.get("personPhoto"); + JSONObject photo = (JSONObject) personPhoto.get(0); + String picUri = photo.getString("picUri"); + String serverIndexCode = photo.getString("serverIndexCode"); + PersonInfoRequest picRequest = new PersonInfoRequest(); + picRequest.setPicUri(picUri); + picRequest.setServerIndexCode(serverIndexCode); + String reBody = JSONObject.toJSONString(picRequest); + //重定向地址获取 + String url = HikUtil.hikApiFor302(HikUri.PERSON_PICTURE, reBody); + return ResponseData.success(url); + } } 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 4a07dd9..7b1dcf6 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 @@ -16,6 +16,7 @@ import com.casic.missiles.modular.redis.key.CacheKeys; import com.casic.missiles.modular.service.CockpitService; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.util.CollectionUtils; import org.springframework.web.bind.annotation.*; @@ -24,10 +25,7 @@ import java.text.NumberFormat; import java.time.LocalDateTime; import java.time.temporal.ChronoUnit; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.util.*; import java.util.stream.Collectors; /** @@ -73,6 +71,9 @@ private StatisticNumberMapper numberMapper; @Autowired + private HazardLevelMapper hazardLevelMapper; + + @Autowired private AccessGroupConfig accessGroupConfig; /** @@ -104,8 +105,24 @@ public Object buildingNumberPerHour(){ //当天按小时分组的人数 List list = numberMapper.selectListByTime(); - Map> collect = list.stream().collect(Collectors.groupingBy(BuildingNumberDTO::getStatisticPosition)); - return ResponseData.success(collect); + Map> collect = list.stream().collect(Collectors.groupingBy(BuildingNumberDTO::getStatisticTime)); + //定时任务中已将每小时三栋楼人数存到数据库 + //将一期主楼和录制楼人数合并,二期单算 + List> resultList = new ArrayList<>(); + collect.keySet().forEach(key -> { + List buildingNumberDTOS = collect.get(key); + BuildingNumberDTO mainBuildingOne = buildingNumberDTOS.get(0); + BuildingNumberDTO mainBuildingTwo = buildingNumberDTOS.get(1); + BuildingNumberDTO recordingBuilding = buildingNumberDTOS.get(2); + HashMap resultMap = new HashMap<>(); + Integer oneQuantity = Integer.valueOf(mainBuildingOne.getStatisticQuantity()); + Integer recordingQuantity = Integer.valueOf(recordingBuilding.getStatisticQuantity()); + resultMap.put("staticTime", mainBuildingOne.getStatisticTime()); + resultMap.put(mainBuildingOne.getStatisticPositionName()+"、"+recordingBuilding.getStatisticPositionName(), String.valueOf(oneQuantity+recordingQuantity)); + resultMap.put(mainBuildingTwo.getStatisticPositionName(), mainBuildingTwo.getStatisticQuantity()); + resultList.add(resultMap); + }); + return ResponseData.success(resultList); } /** @@ -151,12 +168,11 @@ public Object securityNumber() { QueryWrapper wrapper = new QueryWrapper<>(); wrapper.eq("staff_type", 2); + // TODO: 2022/9/2 后续使用产品确定的每天出勤的安保人员的数量 Integer total = staffInfoMapper.selectCount(wrapper); - //当日离岗事件个数 - QueryWrapper wrapper1 = new QueryWrapper<>(); - wrapper1.eq("hik_event_type", SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); - wrapper1.apply("date_format(now(),'%Y-%m-%d') = date_format(happen_time,'%Y-%m-%d')"); - Integer leave = caseInfoMapper.selectCount(wrapper1); + //当日离岗事件按设备去重后的个数 + // TODO: 2022/9/2 目前相当于24小时内的计算,之后看需要可改成自定义小时数计算离岗率,即离岗+6小时内仅一次离岗则恢复为100%,多次则累加离岗次数计算离岗率 + Integer leave = caseInfoMapper.selectDemobilizedCount(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); NumberFormat numberFormat = NumberFormat.getInstance(); // 设置精确到小数点后2位 numberFormat.setMaximumFractionDigits(2); @@ -179,7 +195,6 @@ @ResponseBody public Object visitorApplyDetail() { List reasonGroup = applyMapper.selectByVisitReason(); - HashMap resultMap = new HashMap<>(); NumberFormat numberFormat = NumberFormat.getInstance(); // 设置精确到小数点后2位 numberFormat.setMaximumFractionDigits(2); @@ -187,12 +202,17 @@ if(0 == sum){ return ResponseData.success(); } + List resultList = new ArrayList<>(); reasonGroup.forEach(group -> { String reasonName = dictService.getDictNameByCode(SecurityEventDict.VISIT_REASON, group.getVisitReason()); String result = numberFormat.format((float) group.getQuantity() / (float) sum * 100); - resultMap.put(reasonName, result+"%"); + ApplyReasonGroupDTO applyReasonGroupDTO = new ApplyReasonGroupDTO(); + applyReasonGroupDTO.setQuantity(group.getQuantity()); + applyReasonGroupDTO.setVisitReason(reasonName); + applyReasonGroupDTO.setRatio(result+"%"); + resultList.add(applyReasonGroupDTO); }); - return ResponseData.success(resultMap); + return ResponseData.success(resultList); } /** @@ -247,6 +267,32 @@ } /** + * 机动力量实时在岗率,在岗人数除以总应在岗人数,用离岗+6小时内恢复为100%,6小时外再计算 + */ + @GetMapping("/staff/beOnDutyRatio") + @ResponseBody + public Object beOnDutyRatio() { + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("staff_type", 2); + // TODO: 2022/9/2 后续使用产品确定的每天出勤的安保人员的数量 + Integer total = staffInfoMapper.selectCount(wrapper); + if(0 == total){ + return ResponseData.success(null); + } + //当日离岗事件按设备去重后的个数 + // TODO: 2022/9/2 目前相当于24小时内的计算,之后看需要可改成自定义小时数计算离岗率,即离岗+6小时内仅一次离岗则恢复为100%,多次则累加离岗次数计算离岗率 + List onDutyRatioDTOS = caseInfoMapper.selectDemobilizedCountByHour(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); + onDutyRatioDTOS.forEach(dto -> { + NumberFormat numberFormat = NumberFormat.getInstance(); + // 设置精确到小数点后2位 + numberFormat.setMaximumFractionDigits(2); + String result = numberFormat.format(100 - Float.valueOf(dto.getQuantity()) / (float) total * 100); + dto.setRatio(result+"%"); + }); + return ResponseData.success(onDutyRatioDTOS); + } + + /** * 闸机速通门统计-设备状态分组计算数量,devType传闸机字典key * 视频频监控摄像机统计-设备状态分组计算数量,devType传摄像头字典key */ @@ -262,12 +308,17 @@ if(sum <= 0){ return ResponseData.error("无该类设备信息"); } + List resultList = new ArrayList<>(); gateStatusGroup.forEach(group -> { String devStatus = dictService.getDictNameByCode(SecurityEventDict.DEVICE_STATUS, group.getStatus()); String result = numberFormat.format((float) group.getQuantity() / (float) sum * 100); - resultMap.put(devStatus, result+"%"); + GateStatusGroupResponse gateStatusGroupResponse = new GateStatusGroupResponse(); + gateStatusGroupResponse.setStatus(devStatus); + gateStatusGroupResponse.setRatio(result+"%"); + resultList.add(gateStatusGroupResponse); }); - resultMap.put("总", sum); + resultMap.put("total", sum); + resultMap.put("list", resultList); return ResponseData.success(resultMap); } @@ -282,17 +333,38 @@ String position = securityScoreDTO.getPosition(); List caseInfos = caseInfoMapper.selectByPosition(position); //查询各危险级别权重、各类别权重,放入map,避免循环中多次查数据库 - + HashMap hazardScoreMap = new HashMap<>(); + List caseHazardLevelList = hazardLevelMapper.getCaseHazardLevelList(null); + caseHazardLevelList.forEach(hazardLevel -> { + hazardScoreMap.put(hazardLevel.getCode(), hazardLevel.getWeight()); + }); + HashMap categoryScoreMap = new HashMap<>(); + List categoryLevelList = categoryLevelMapper.getCaseCategoryLevelList(null); + categoryLevelList.forEach(categoryLevel -> { + categoryScoreMap.put(categoryLevel.getCode(), categoryLevel.getWeight()); + }); + //事件按楼层分组,计算 List securityScoreDTOs = new ArrayList<>(); caseInfos.forEach(caseInfo -> { SecurityScoreDTO securityScoreDTO1 = new SecurityScoreDTO(); + securityScoreDTO1.setPosition(caseInfo.getPosition()); securityScoreDTO1.setArea(caseInfo.getArea()); - // TODO: 2022/8/4 楼层评分计算根据产品定义调整 -// caseInfo.get -// securityScoreDTO1.setScore(); + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); + Double score = 100 - Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + securityScoreDTO1.setScore(score); + securityScoreDTOs.add(securityScoreDTO1); }); - - return null; + 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); + }); + return ResponseData.success(securityScoreDTOs); } /** @@ -303,9 +375,13 @@ public Object SecurityFrequency(@RequestBody SecurityFrequencyDTO securityFrequencyDTO) { String year = securityFrequencyDTO.getYear(); String month = securityFrequencyDTO.getMonth(); - Integer quantity = caseInfoMapper.selectCountByMonth(year, month); - securityFrequencyDTO.setQuantity(quantity); - return ResponseData.success(securityFrequencyDTO); + if(!StringUtils.isEmpty(year) && StringUtils.isEmpty(month)){ + Integer quantity = caseInfoMapper.selectCountByMonth(year, month); + securityFrequencyDTO.setQuantity(quantity); + return ResponseData.success(securityFrequencyDTO); + } + List list = caseInfoMapper.selectPreMonthCount(); + return ResponseData.success(list); } } 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 ae4d770..f4f075c 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 @@ -1,20 +1,25 @@ package com.casic.missiles.modular.controller.cockpit; +import cn.hutool.core.date.DateUnit; import cn.hutool.core.date.DateUtil; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.casic.missiles.model.response.ResponseData; -import com.casic.missiles.modular.dao.AttendanceInfoMapper; -import com.casic.missiles.modular.dao.CaseInfoMapper; -import com.casic.missiles.modular.dao.HazardLevelMapper; -import com.casic.missiles.modular.dao.StaffInfoMapper; +import com.casic.missiles.modular.dao.*; +import com.casic.missiles.modular.dto.DeviceRepairLogDTO; +import com.casic.missiles.modular.dto.DeviceRepairRequest; import com.casic.missiles.modular.dto.statistics.*; +import com.casic.missiles.modular.enums.SecurityEventType; +import com.casic.missiles.modular.model.CaseCategoryLevel; import com.casic.missiles.modular.model.CaseHazardLevel; +import com.casic.missiles.modular.model.CaseInfo; import com.casic.missiles.modular.model.StaffInfo; +import com.casic.missiles.modular.service.DeviceInfoService; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.util.CollectionUtils; import org.springframework.web.bind.annotation.*; +import java.math.BigDecimal; import java.text.NumberFormat; import java.util.*; import java.util.stream.Collectors; @@ -40,6 +45,12 @@ @Autowired private HazardLevelMapper hazardLevelMapper; + @Autowired + private CategoryLevelMapper categoryLevelMapper; + + @Autowired + private DeviceInfoService deviceInfoService; + /** * 安防事件时域频次统计,每月的每天安防事件个数(原方案) * 月维度:展示每个月的每天的数据 @@ -89,15 +100,17 @@ List monthList = caseInfoMapper.selectPreMonthCountByYear(year); Map> collect = monthList.stream().collect(Collectors.groupingBy(PreMonthOrWeekCaseDTO::getHazardLevelCode)); HashMap strAvgMap = new HashMap<>(); + List resultList = new ArrayList<>(); for (String key : collect.keySet()) { List preMonthOrWeekCaseDTOS = collect.get(key); int sum = preMonthOrWeekCaseDTOS.stream().mapToInt(PreMonthOrWeekCaseDTO::getQuantity).sum(); //若年份是本年,则使用个安防级别数量/当前月份数 //若不是本年,除数为12 MonthAndWeekDTO monthAndWeekDTO = new MonthAndWeekDTO(); + String hazardName = hazardLevelMapper.selectHazardNameByCode(key); + monthAndWeekDTO.setLevelName(hazardName); if(year.equals(String.valueOf(DateUtil.thisYear()))){ monthAndWeekDTO.setMonthQuantity(sum / DateUtil.thisMonth()); -// monthAndWeekDTO.setLevelName(); strAvgMap.put(key, monthAndWeekDTO); }else{ monthAndWeekDTO.setMonthQuantity(sum / 12); @@ -113,27 +126,37 @@ if(year.equals(String.valueOf(DateUtil.thisYear()))){ if(!Objects.isNull(strAvgMap.get(key))){ MonthAndWeekDTO monthAndWeekDTO = strAvgMap.get(key); + String hazardName = hazardLevelMapper.selectHazardNameByCode(key); + monthAndWeekDTO.setLevelName(hazardName); monthAndWeekDTO.setWeekQuantity(sum / DateUtil.thisWeekOfYear()); strAvgMap.put(key, monthAndWeekDTO); }else{ MonthAndWeekDTO monthAndWeekDTO = new MonthAndWeekDTO(); + String hazardName = hazardLevelMapper.selectHazardNameByCode(key); + monthAndWeekDTO.setLevelName(hazardName); monthAndWeekDTO.setWeekQuantity(sum / DateUtil.thisWeekOfYear()); strAvgMap.put(key, monthAndWeekDTO); } }else{ if(!Objects.isNull(strAvgMap.get(key))){ MonthAndWeekDTO monthAndWeekDTO = strAvgMap.get(key); + String hazardName = hazardLevelMapper.selectHazardNameByCode(key); + monthAndWeekDTO.setLevelName(hazardName); monthAndWeekDTO.setWeekQuantity(sum / 52); strAvgMap.put(key, monthAndWeekDTO); }else{ MonthAndWeekDTO monthAndWeekDTO = new MonthAndWeekDTO(); + String hazardName = hazardLevelMapper.selectHazardNameByCode(key); + monthAndWeekDTO.setLevelName(hazardName); monthAndWeekDTO.setWeekQuantity(sum / 52); strAvgMap.put(key, monthAndWeekDTO); } } } - avgMonthAndWeekGroupDTO.setMap(strAvgMap); - return ResponseData.success(avgMonthAndWeekGroupDTO); + strAvgMap.keySet().forEach(key -> { + resultList.add(strAvgMap.get(key)); + }); + return ResponseData.success(resultList); } /** @@ -181,12 +204,178 @@ } /** - * 员工考勤人数变化,功能待定 + * 员工考勤人数变化,统计当天(横坐标为时)及近7天(横坐标为天)的考勤人数变化,只要发生一次考勤识别,次数的基数就正常增加(没有上班下班区分) */ + @PostMapping("/staff/attendanceNumber/{dimension}") + @ResponseBody + public Object attendanceNumber(@PathVariable("dimension") String dimension) { + List attendanceNumberDTOs = null; + List> resultList = new ArrayList<>(); + if("week".equals(dimension)){ + //近7天数据按天分组统计 + attendanceNumberDTOs = attendanceInfoMapper.getCountForWeek(); + }else if("day".equals(dimension)) { + //今天数据按小时分组统计 + attendanceNumberDTOs = attendanceInfoMapper.getCountForDay(); + } + if(CollectionUtils.isEmpty(attendanceNumberDTOs)){ + return ResponseData.error("该查询条件下,无员工出勤数据!"); + } + Map> collect = attendanceNumberDTOs.stream().collect(Collectors.groupingBy(AttendanceNumberDTO::getDate)); + collect.keySet().forEach(key -> { + List attendanceNumberDTOS = collect.get(key); + AttendanceNumberDTO attendanceNumberDTO = attendanceNumberDTOS.get(0); + AttendanceNumberDTO attendanceNumberDTO2 = attendanceNumberDTOS.get(1); + Map resultMap = new HashMap<>(); + resultMap.put(attendanceNumberDTO.getStaffType(), attendanceNumberDTO.getQuantity()); + resultMap.put(attendanceNumberDTO2.getStaffType(), attendanceNumberDTO2.getQuantity()); + resultMap.put("staticTime", attendanceNumberDTO.getDate()); + resultList.add(resultMap); + }); + return ResponseData.success(resultList); + } /** - * 近30天/近一周安保人员到岗排行 + * 早晚高峰区域安防评估 */ + @PostMapping("/security/assessment/{dimension}") + @ResponseBody + public Object securityAssessment(@PathVariable("dimension") String dimension) { + //查询各危险级别权重、各类别权重,放入map,避免循环中多次查数据库 + HashMap hazardScoreMap = new HashMap<>(); + List caseHazardLevelList = hazardLevelMapper.getCaseHazardLevelList(null); + caseHazardLevelList.forEach(hazardLevel -> { + hazardScoreMap.put(hazardLevel.getCode(), hazardLevel.getWeight()); + }); + HashMap categoryScoreMap = new HashMap<>(); + List categoryLevelList = categoryLevelMapper.getCaseCategoryLevelList(null); + categoryLevelList.forEach(categoryLevel -> { + categoryScoreMap.put(categoryLevel.getCode(), categoryLevel.getWeight()); + }); + HashMap hashMap = new HashMap<>(); + if("week".equals(dimension)){ + //近7天早晚高峰数据 + List caseInfos = caseInfoMapper.selectListBySevenDay(); + //按时间(天)进行分组 + caseInfos.forEach(caseInfo -> { + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); + Double score = Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + String[] array = caseInfo.getHappenTime().split(" "); + String dayTime = array[0]; + BigDecimal preScore; + if(hashMap.containsKey(dayTime)){ + Double aDouble = hashMap.get(dayTime); + preScore = new BigDecimal(aDouble.toString()); + + }else{ + preScore = new BigDecimal("100.0"); + } + BigDecimal nowScore = new BigDecimal(score.toString()); + hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); + }); + return ResponseData.success(hashMap); + }else if("day".equals(dimension)) { + //今天数据按小时分组统计 + List caseInfos = caseInfoMapper.selectListByToday(); + caseInfos.forEach(caseInfo -> { + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); + Double score = Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + String[] array = caseInfo.getHappenTime().split(":"); + String dayTime = array[0]; + BigDecimal preScore; + if(hashMap.containsKey(dayTime)){ + Double aDouble = hashMap.get(dayTime); + preScore = new BigDecimal(aDouble.toString()); + + }else{ + preScore = new BigDecimal("100.0"); + } + BigDecimal nowScore = new BigDecimal(score.toString()); + hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); + }); + return ResponseData.success(hashMap); + } + return null; + } + + /** + * 重点区域安防事态评估,统计重点区域6:00-23:00按小时分组数据 + */ + @GetMapping("/security/keyAreaStatistic") + @ResponseBody + public Object keyAreaStatistic() { + //查询各危险级别权重、各类别权重,放入map,避免循环中多次查数据库 + HashMap hazardScoreMap = new HashMap<>(); + List caseHazardLevelList = hazardLevelMapper.getCaseHazardLevelList(null); + caseHazardLevelList.forEach(hazardLevel -> { + hazardScoreMap.put(hazardLevel.getCode(), hazardLevel.getWeight()); + }); + HashMap categoryScoreMap = new HashMap<>(); + List categoryLevelList = categoryLevelMapper.getCaseCategoryLevelList(null); + categoryLevelList.forEach(categoryLevel -> { + categoryScoreMap.put(categoryLevel.getCode(), categoryLevel.getWeight()); + }); + HashMap hashMap = new HashMap<>(); + //今天数据按小时分组统计 + List caseInfos = caseInfoMapper.selectListByToday2(); + caseInfos.forEach(caseInfo -> { + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); + Double score = Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + String[] array = caseInfo.getHappenTime().split(":"); + String dayTime = array[0]; + BigDecimal preScore; + if(hashMap.containsKey(dayTime)){ + Double aDouble = hashMap.get(dayTime); + preScore = new BigDecimal(aDouble.toString()); + + }else{ + preScore = new BigDecimal("100.0"); + } + BigDecimal nowScore = new BigDecimal(score.toString()); + hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); + }); + return ResponseData.success(hashMap); + } + + /** + * 安防机动支援力量调配响应评估,根据事件已解决状态及已解决时间-发送时间,按时间(小时)分组统计 + */ + @GetMapping("/security/responseAssess") + @ResponseBody + public Object responseAssess() { + //查询各危险级别权重、各类别权重,放入map,避免循环中多次查数据库 + HashMap hazardScoreMap = new HashMap<>(); + List caseHazardLevelList = hazardLevelMapper.getCaseHazardLevelList(null); + caseHazardLevelList.forEach(hazardLevel -> { + hazardScoreMap.put(hazardLevel.getCode(), hazardLevel.getWeight()); + }); + HashMap hashMap = new HashMap<>(); + //今天数据按小时分组统计 + List caseInfos = caseInfoMapper.selectListByToday3(); + caseInfos.forEach(caseInfo -> { + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + //扣分=事件级别权重*未解决小时数 + Date updateTime = DateUtil.parse(caseInfo.getUpdateTime()); + Date happenTime = DateUtil.parse(caseInfo.getHappenTime()); + long between = DateUtil.between(updateTime, happenTime, DateUnit.HOUR); + Double score = Double.valueOf(hazardWeight)*between; + String[] array = caseInfo.getHappenTime().split(":"); + String dayTime = array[0]; + BigDecimal preScore; + if(hashMap.containsKey(dayTime)){ + Double aDouble = hashMap.get(dayTime); + preScore = new BigDecimal(aDouble.toString()); + }else{ + preScore = new BigDecimal("100.0"); + } + BigDecimal nowScore = new BigDecimal(score.toString()); + hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); + }); + return ResponseData.success(hashMap); + } /** * 重点区域威胁事件类型统计,优先级2,统计近7天和近30天 @@ -224,7 +413,34 @@ } /** - * 设备状态计算系数和评判,优先级3,需确认设备恢复时间是否可以获取 + * 近30天/近一周安保人员到岗排行 */ + + /** + * 安保等级评估,发生离岗事件减1分 + */ + @GetMapping("/security/levelAssess") + @ResponseBody + public Object securityLevelAssess() { + //今天数据按小时分组统计 + List resultList = caseInfoMapper.selectListByType(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); + resultList.forEach(result -> { + BigDecimal deScore = new BigDecimal(result.getQuantity()); + BigDecimal preScore = new BigDecimal("100.0"); + result.setScore(preScore.subtract(deScore).doubleValue()); + }); + return ResponseData.success(resultList); + } + + /** + * 设备状态计算系数和评判,即设备维修管理查询(不分页) + */ + @PostMapping("/device/repairList") + @ResponseBody + public Object repairList(@RequestBody DeviceRepairRequest deviceRepairRequest) { + List deviceRepairLogDTOS = deviceInfoService.deviceRepairListPage(deviceRepairRequest); + return ResponseData.success(deviceRepairLogDTOS); + } + } 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 fbf8ab6..c71a15a 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 @@ -1,13 +1,12 @@ package com.casic.missiles.modular.controller.hik; +import cn.hutool.core.date.DateTime; +import cn.hutool.core.date.DateUtil; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.casic.missiles.model.response.ResponseData; import com.casic.missiles.modular.dao.HikFaceGroupInfoMapper; -import com.casic.missiles.modular.dto.hik.EventSubscribeRequest; -import com.casic.missiles.modular.dto.hik.FaceGroupAdditionRequest; -import com.casic.missiles.modular.dto.hik.HikRecvEvent; -import com.casic.missiles.modular.dto.hik.OrgBatchAdd; +import com.casic.missiles.modular.dto.hik.*; import com.casic.missiles.modular.enums.HikUri; import com.casic.missiles.modular.enums.SecurityEventType; import com.casic.missiles.modular.model.CaseInfo; @@ -18,16 +17,20 @@ import com.casic.missiles.modular.util.CaseInfoFactoryUtil; import com.casic.missiles.modular.util.HikUtil; import com.casic.missiles.modular.util.ThreadPoolUtil; +import com.casic.missiles.modular.util.WebSocket; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; -import org.springframework.web.bind.annotation.*; +import org.springframework.util.CollectionUtils; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.RestController; -import java.net.InetAddress; -import java.net.UnknownHostException; import java.util.ArrayList; +import java.util.Iterator; import java.util.List; import java.util.Objects; @@ -38,7 +41,6 @@ */ @Slf4j @RestController -@RequestMapping("/hik") public class HikController { @Autowired @@ -53,28 +55,37 @@ @Autowired private HikService hikService; + @Autowired + private HikFaceGroupInfoMapper hikFaceGroupInfoMapper; + + @Autowired + private WebSocket webSocket; + @Value("${server.port}") private int serverPort; - @Autowired - private HikFaceGroupInfoMapper hikFaceGroupInfoMapper; /** * 海康事件订阅 */ - @PostMapping("/event/subscribe") + @PostMapping("/hik/event/subscribe") @ResponseBody - public Object eventSubscribe() throws UnknownHostException { + public Object eventSubscribe() { EventSubscribeRequest eventSubscribeRequest = new EventSubscribeRequest(); ArrayList list = new ArrayList<>(); list.add(SecurityEventType.DEVICE_OFFLINE); + list.add(SecurityEventType.DEVICE_ONLINE); list.add(SecurityEventType.KEY_PERSONNEL_IDENTIFY_EVENT); list.add(SecurityEventType.MONITORING_POINT_OFFLINE); + list.add(SecurityEventType.MONITORING_POINT_ONLINE); list.add(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); list.add(SecurityEventType.PERSONNEL_GATHER_EVENT); - InetAddress localHost = InetAddress.getLocalHost(); + list.add(SecurityEventType.VISITOR_REGISTER); + list.add(SecurityEventType.VISITOR_CHECKOUT); + list.add(SecurityEventType.HIGH_ALTITUDE_PARABOLIC); +// InetAddress localHost = InetAddress.getLocalHost(); eventSubscribeRequest.setEventTypes(list); - eventSubscribeRequest.setEventDest("https://" + localHost + ":" + serverPort + "/eventRcv"); + eventSubscribeRequest.setEventDest("http://" + "192.168.10.6" + ":" + serverPort + "/eventRcv"); //订阅类型,0-订阅原始事件,1-联动事件,2-原始事件和联动事件,不填使用默认值0 eventSubscribeRequest.setSubType(0); /** @@ -92,19 +103,25 @@ } /** + * 查询事件订阅信息 + */ + @PostMapping("/hik/event/query") + @ResponseBody + public Object eventQuery() { + String result = HikUtil.hikApi(HikUri.EVENT_INFO, ""); + return result; + } + + /** * 海康事件接收 */ @PostMapping("/eventRcv") @ResponseBody public Object eventRcv(@RequestBody HikRecvEvent hikRecvEvent) { //1、接收所需事件类型 - Long eventType = hikRecvEvent.getEventType(); + Number eventType = hikRecvEvent.getEventType(); log.info("接收到安防事件类型为:{}", eventType); CaseInfo caseInfo = caseInfoFactoryUtil.getCaseInfo(eventType); - //接收到不关心事件直接返回 - if(Objects.isNull(caseInfo)){ - return ResponseData.success(); - } //2、不同事件不同处理,caseInfoFactoryUtil已设置好事件基础定义信息 // 再为事件添加状态、设备编码、设备名称、位置、区域、时间 // 异步处理事件 @@ -114,19 +131,23 @@ caseHandle(hikRecvEvent, eventType, caseInfo); } })); +// caseHandle(hikRecvEvent, eventType, caseInfo); - return null; + return ResponseData.success(); } - private void caseHandle(HikRecvEvent hikRecvEvent, Long eventType, CaseInfo caseInfo) { + private void caseHandle(HikRecvEvent hikRecvEvent, Number eventType, CaseInfo caseInfo) { JSONArray eventArray = hikRecvEvent.getEventArray(); List caseInfos = new ArrayList<>(); - while (eventArray.stream().iterator().hasNext()) { + Iterator iterator = eventArray.iterator(); + while (iterator.hasNext()) { CaseInfo caseInfo1 = new CaseInfo(); - BeanUtils.copyProperties(caseInfo, caseInfo1); - JSONObject event = (JSONObject) eventArray.stream().iterator().next(); + if(!Objects.isNull(caseInfo)){ + BeanUtils.copyProperties(caseInfo, caseInfo1); + } + JSONObject event = (JSONObject) iterator.next(); //5种事件进行不同处理 - if(SecurityEventType.KEY_PERSONNEL_IDENTIFY_EVENT == eventType){ + if (SecurityEventType.KEY_PERSONNEL_IDENTIFY_EVENT.equals(eventType)) { //判断所属人脸分组 JSONObject data = (JSONObject) event.get("data"); JSONObject faceRecognitionResult = (JSONObject) data.get("faceRecognitionResult"); @@ -142,52 +163,101 @@ if (faceGroupCode.equals(blackListGroup.getFaceGroupCode())) { //黑名单分组处理 caseInfo1 = hikService.blackListHandle(event, caseInfo1); - }else if(faceGroupCode.equals(propertyPersonnelGroup.getFaceGroupCode())){ + } else if (faceGroupCode.equals(propertyPersonnelGroup.getFaceGroupCode())) { //考勤分组处理-物业人员,添加到考勤表 hikService.propertyAttendanceHandle(event); - }else if(faceGroupCode.equals(securityPersonnelGroup.getFaceGroupCode())){ + } else if (faceGroupCode.equals(securityPersonnelGroup.getFaceGroupCode())) { //考勤分组处理-安保人员,添加到考勤表 hikService.securityPersonnelHandle(event); - }else { + } else { return; } - }else if(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT == eventType){ + } else if (SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT.equals(eventType)) { //离岗事件处理 caseInfo1 = hikService.demobilizedHandle(event, caseInfo1); - }else if(SecurityEventType.PERSONNEL_GATHER_EVENT == eventType){ + } else if (SecurityEventType.PERSONNEL_GATHER_EVENT.equals(eventType)) { //人员聚集事件处理 caseInfo1 = hikService.personGatherHandle(event, caseInfo1); - }else if(SecurityEventType.MONITORING_POINT_OFFLINE == eventType){ + } else if (SecurityEventType.MONITORING_POINT_OFFLINE.equals(eventType)) { //监控点离线事件处理 caseInfo1 = hikService.monitorPointOfflineHandle(event, caseInfo1); - }else if(SecurityEventType.DEVICE_OFFLINE == eventType){ + } else if (SecurityEventType.MONITORING_POINT_ONLINE.equals(eventType)) { + //监控点上线事件处理 + hikService.monitorPointOnlineHandle(event); + } else if (SecurityEventType.DEVICE_OFFLINE.equals(eventType)) { //装置离线事件处理 caseInfo1 = hikService.deviceOfflineHandle(event, caseInfo1); - }else if(SecurityEventType.VISITOR_REGISTER == eventType){ + } else if (SecurityEventType.DEVICE_ONLINE.equals(eventType)) { + //装置上线处理 + hikService.deviceOnlineHandle(event); + } else if (SecurityEventType.VISITOR_REGISTER.equals(eventType)) { //记录访客登记记录,添加到访客记录表 hikService.visitorRegisterHandler(event); - }else if(SecurityEventType.VISITOR_CHECKOUT == eventType){ + } else if (SecurityEventType.VISITOR_CHECKOUT.equals(eventType)) { //记录访客签离记录 hikService.visitorCheckOutHandler(event); } - if(!Objects.isNull(caseInfo1) && !StringUtils.isEmpty(caseInfo1.getHappenTime())){ + if (!Objects.isNull(caseInfo1) && !StringUtils.isEmpty(caseInfo1.getHappenTime())) { caseInfos.add(caseInfo1); } } //3、安防事件入库 - if(!caseInfoService.insertCaseInfoBatch(caseInfos)){ - log.error("安防事件批量入库异常"); + if (!CollectionUtils.isEmpty(caseInfos) && !caseInfoService.insertCaseInfoBatch(caseInfos)) { + log.error("安防事件批量入库异常!"); } // TODO: 2022/8/15 webSocket推送 + if (CollectionUtils.isEmpty(caseInfos)) { + log.info("webSocket事件推送"); + webSocket.sendAllMessage(JSONObject.toJSONString(caseInfos)); + } return; } /** + * 以图搜图,前端用于轨迹追踪 + */ + @PostMapping("/hik/search/picture") + @ResponseBody + public Object searchPictures(@RequestBody SearchPicturesRequest searchPicturesRequest) { + DateTime startDateTime = DateUtil.parse(searchPicturesRequest.getStartTime()); + DateTime endDateTime = DateUtil.parse(searchPicturesRequest.getEndTime()); + String startTime = DateUtil.format(startDateTime, "yyyy-MM-dd'T'HH:mm:ss.SSSXXX"); + String endTime = DateUtil.format(endDateTime, "yyyy-MM-dd'T'HH:mm:ss.SSSXXX"); + searchPicturesRequest.setStartTime(startTime); + searchPicturesRequest.setEndTime(endTime); + String body = JSONObject.toJSONString(searchPicturesRequest); + String resultStr = HikUtil.hikApi(HikUri.SEARCH_PICTURES, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (!"0".equals(resultJson.get("code"))) { + log.error("请求海康,以图搜图失败,海康response:{}", resultStr); + return ResponseData.error("以图搜图失败"); + } + return ResponseData.success(resultJson); + } + + + /** + * 海康事件取消订阅 + */ + @PostMapping("/hik/event/cancel") + @ResponseBody + public Object eventCancelSubscribe(@RequestBody CancelSubscribeRequest cancelSubscribeRequest) { + String body = JSONObject.toJSONString(cancelSubscribeRequest); + String resultStr = HikUtil.hikApi(HikUri.EVENT_CANCEL, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (!"0".equals(resultJson.get("code"))) { + log.error("请求海康,取消订阅失败,海康response:{}", resultStr); + return ResponseData.error("取消订阅失败"); + } + return ResponseData.success(resultJson); + } + + /** * 单个添加海康人脸分组 * api->hik单个添加人脸分组api->response->mysql */ - @PostMapping("/faceGroup/single/add") + @PostMapping("/hik/faceGroup/single/add") @ResponseBody public Object faceGroupAddition(@RequestBody FaceGroupAdditionRequest faceGroupAdditionRequest) { String body = JSONObject.toJSONString(faceGroupAdditionRequest); @@ -212,7 +282,7 @@ * 批量添加海康组织 * api->hik批量添加组织api->response */ - @PostMapping("/org/batch/add") + @PostMapping("/hik/org/batch/add") @ResponseBody public Object orgBatchAdd(@RequestBody List orgBatchAddRequest) { String body = JSONObject.toJSONString(orgBatchAddRequest); @@ -232,4 +302,62 @@ return ResponseData.error("批量添加组织失败"); } + /** + * 获取人员列表 + */ + @PostMapping("/hik/person/personList") + @ResponseBody + public Object personList() { + PersonListRequest request = new PersonListRequest(); + request.setPageNo(1); + request.setPageSize(100); + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi("/api/resource/v2/person/personList", body); + return resultStr; + } + + /** + * 获取组织列表 + */ + @PostMapping("/hik/org/orgList") + @ResponseBody + public Object orgList() { + PersonListRequest request = new PersonListRequest(); + request.setPageNo(1); + request.setPageSize(100); + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi("/api/resource/v1/org/orgList", body); + return resultStr; + } + + /** + * 查询访客权限下载记录 + */ + @PostMapping("/hik/auth/result") + @ResponseBody + public Object authResult() { + PersonListRequest request = new PersonListRequest(); + request.setPageNo(1); + request.setPageSize(100); + request.setOrderId("ba101db6246711edaea66f7939a13638"); + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi("/api/visitor/v1/auth/result", body); + return resultStr; + } + + /** + * 人脸图片获取 + */ + @PostMapping("/hik/face/picture") + @ResponseBody + public Object facePicture() { + FaceRequest request = new FaceRequest(); +// List list = new ArrayList<>(); +// list.add(""); + request.setCertificateNum("wanggong"); + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi("/api/frs/v1/face", body); + return resultStr; + } + } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/AssetInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/AssetInfoMapper.java index 4f64e83..c0684ee 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/AssetInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/AssetInfoMapper.java @@ -17,6 +17,6 @@ @Mapper public interface AssetInfoMapper extends BaseMapper { - List getAssetInfoListPage(@Param("page") Page page, AssetInfoRequest assetInfoRequest); + List getAssetInfoListPage(@Param("page") Page page, @Param("assetInfoRequest") AssetInfoRequest assetInfoRequest); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/AttendanceInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/AttendanceInfoMapper.java index f9e793e..ec87e46 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/AttendanceInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/AttendanceInfoMapper.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.statistics.AttendanceNumberDTO; import com.casic.missiles.modular.dto.statistics.AttendanceRatioDTO; import com.casic.missiles.modular.model.AttendanceInfo; import org.apache.ibatis.annotations.Mapper; @@ -17,7 +18,7 @@ */ @Mapper public interface AttendanceInfoMapper extends BaseMapper { - List getAttendanceInfoListPage(@Param("page") Page page, StaffInfoRequest attendanceInfoRequest); + List getAttendanceInfoListPage(@Param("page") Page page, @Param("attendanceInfoRequest") StaffInfoRequest attendanceInfoRequest); AttendanceInfo selectByCodeAndDate(@Param("staffCode") String staffCode); @@ -26,4 +27,8 @@ List getCountByTypeAndDateForMonth(@Param("staffType")String staffType); List getCountByTypeAndDateForYear(@Param("staffType")String staffType); + + List getCountForWeek(); + + List getCountForDay(); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java index ce94b8f..6137a7d 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java @@ -17,5 +17,5 @@ @Mapper public interface BlackInfoMapper extends BaseMapper { - List getBlackInfoListPage(@Param("page") Page page, BlackInfoRequest blackInfoRequest); + List getBlackInfoListPage(@Param("page") Page page, @Param("blackInfoRequest") BlackInfoRequest blackInfoRequest); } 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 efda6b3..50aaa6f 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 @@ -20,7 +20,7 @@ List getCaseInfoListPage(@Param("page") Page page, @Param("caseInfoRequest") CaseInfoRequest caseInfoRequest); - int updateStatusById(CaseInfoRequest caseInfoRequest); + int updateStatusById(@Param("caseInfoRequest") CaseInfoRequest caseInfoRequest); List selectByLevelAndMonth(@Param("year") String year); @@ -47,4 +47,20 @@ List selectPreWeekCountByThirtyDay(); List selectPreDayCountBySevenDay(); + + Integer selectDemobilizedCount(@Param("eventType") Number personnelDemobilizedEvent); + + List selectPreMonthCount(); + + List selectListBySevenDay(); + + List selectListByToday(); + + List selectListByToday2(); + + List selectListByToday3(); + + List selectListByType(@Param("eventType") Number eventType); + + List selectDemobilizedCountByHour(@Param("eventType") Number eventType); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/CategoryLevelMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/CategoryLevelMapper.java index 52fc714..afe1650 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/CategoryLevelMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/CategoryLevelMapper.java @@ -17,9 +17,9 @@ @Mapper public interface CategoryLevelMapper extends BaseMapper { - List getCaseCategoryLevelListPage(@Param("page") Page page, CategoryLevelRequest categoryLevelRequest); + List getCaseCategoryLevelListPage(@Param("page") Page page, @Param("categoryLevelRequest") CategoryLevelRequest categoryLevelRequest); - List getCaseCategoryLevelList(CategoryLevelRequest categoryLevelRequest); + List getCaseCategoryLevelList(@Param("categoryLevelRequest") CategoryLevelRequest categoryLevelRequest); CaseCategoryLevel getCaseCategoryLevel(@Param("categoryLevelCode") String categoryLevelCode); 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 66353b1..2555a09 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 @@ -19,7 +19,7 @@ @Mapper public interface DeviceInfoMapper extends BaseMapper { - List getDeviceInfoListPage(@Param("page") Page page, DeviceInfoRequest deviceInfoRequest); + List getDeviceInfoListPage(@Param("page") Page page, @Param("deviceInfoRequest") DeviceInfoRequest deviceInfoRequest); List getDeviceInfoList(@Param("deviceInfoRequest") DeviceInfoRequest deviceInfoRequest); @@ -27,6 +27,8 @@ DeviceInfo getByIndexCode(@Param("srcIndex") String srcIndex); + DeviceInfo getByIp(@Param("ip") String ip); + List selectIndexCodesByCodes(@Param("deviceCodes") List deviceCodes); List selectByType(@Param("devType") String devType); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java index 41dd0af..5bfaf63 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java @@ -5,6 +5,7 @@ import com.casic.missiles.modular.dto.DeviceRepairRequest; import com.casic.missiles.modular.model.DeviceRepairLog; import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; import java.util.List; @@ -16,7 +17,7 @@ @Mapper public interface DeviceRepairLogMapper extends BaseMapper { - List getDeviceRepairListPage(Page page, DeviceRepairRequest deviceRepairRequest); + List getDeviceRepairListPage(@Param("page") Page page, @Param("deviceRepairRequest")DeviceRepairRequest deviceRepairRequest); - List getDeviceRepairList(DeviceRepairRequest deviceRepairRequest); + List getDeviceRepairList(@Param("deviceRepairRequest") DeviceRepairRequest deviceRepairRequest); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java index 9035c47..4823ac1 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java @@ -18,7 +18,7 @@ @Mapper public interface FireEquipInfoMapper extends BaseMapper { - List getFireEquipInfoListPage(@Param("page") Page page, FireEquipRequest fireEquipRequest); + List getFireEquipInfoListPage(@Param("page") Page page, @Param("fireEquipRequest") FireEquipRequest fireEquipRequest); FireEquipInfo getFireEquipInfo(@Param("equipCode") String equipCode); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/GateGroupMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/GateGroupMapper.java index d8c330d..977a427 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/GateGroupMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/GateGroupMapper.java @@ -17,7 +17,7 @@ */ @Mapper public interface GateGroupMapper extends BaseMapper { - List getGateGroupListPage(@Param("page") Page page, GateGroupRequest gateGroupRequest); + List getGateGroupListPage(@Param("page") Page page, @Param("gateGroupRequest") GateGroupRequest gateGroupRequest); GateGroup getGateGroupByName(@Param("groupName") String groupName); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/HazardLevelMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/HazardLevelMapper.java index 8957780..dcf47bb 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/HazardLevelMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/HazardLevelMapper.java @@ -17,11 +17,13 @@ @Mapper public interface HazardLevelMapper extends BaseMapper { - List getCaseHazardLevelListPage(@Param("page") Page page, HazardLevelRequest hazardLevelRequest); + List getCaseHazardLevelListPage(@Param("page") Page page, @Param("hazardLevelRequest") HazardLevelRequest hazardLevelRequest); - List getCaseHazardLevelList(HazardLevelRequest hazardLevelRequest); + List getCaseHazardLevelList(@Param("hazardLevelRequest") HazardLevelRequest hazardLevelRequest); CaseHazardLevel getCaseHazardLevel(@Param("hazardLevelCode") String hazardLevelCode); List selectHazardName(); + + String selectHazardNameByCode(@Param("hazardLevelCode") String hazardLevelCode); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/HikCaseDefineMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/HikCaseDefineMapper.java index 0dc47d1..f162fef 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/HikCaseDefineMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/HikCaseDefineMapper.java @@ -12,5 +12,5 @@ */ @Mapper public interface HikCaseDefineMapper extends BaseMapper { - HikCaseDefine getHikCaseDefine(@Param("caseTypeCode") Long caseTypeCode); + HikCaseDefine getHikCaseDefine(@Param("caseTypeCode") Number caseTypeCode); } 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 f8a674c..fe5afc2 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 @@ -17,11 +17,13 @@ @Mapper public interface StaffInfoMapper extends BaseMapper { - List getStaffInfoListPage(@Param("page") Page page, StaffInfoRequest staffInfoRequest); + List getStaffInfoListPage(@Param("page") Page page, @Param("staffInfoRequest") StaffInfoRequest staffInfoRequest); StaffInfo selectByCode(@Param("staffCode") String staffCode); - List getStaffInfoList(StaffInfoRequest staffInfoRequest); + List getStaffInfoList(@Param("staffInfoRequest") StaffInfoRequest staffInfoRequest); - List selectBatchCodes(List list); + List selectBatchCodes(@Param("list") List list); + + int updateByCodeForCard(@Param("staffCode") String staffCode, @Param("cardNo") String cardNo); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitInfoMapper.java index b1217c5..6c52542 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitInfoMapper.java @@ -16,7 +16,7 @@ */ @Mapper public interface VisitInfoMapper extends BaseMapper { - List getVisitInfoListPage(@Param("page") Page page, VisitorRequest visitorRequest); + List getVisitInfoListPage(@Param("page") Page page, @Param("visitorRequest") VisitorRequest visitorRequest); VisitInfo selectByOrderId(@Param("orderId") String orderId); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitorApplyMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitorApplyMapper.java index c09f3c0..6ea55bd 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitorApplyMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitorApplyMapper.java @@ -18,7 +18,7 @@ @Mapper public interface VisitorApplyMapper extends BaseMapper { - List getVisitorApplyListPage(@Param("page") Page page, VisitorApplyRequest visitorApplyRequest); + List getVisitorApplyListPage(@Param("page") Page page, @Param("visitorApplyRequest") VisitorApplyRequest visitorApplyRequest); List selectByVisitReason(); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/AttendanceInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/AttendanceInfoMapper.xml index b2ece71..f8bdd6e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/AttendanceInfoMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/AttendanceInfoMapper.xml @@ -43,7 +43,8 @@ and staff_type = #{staffType} - and YEARWEEK(date_format(atte_date, '%Y-%m-%d'), 1) = YEARWEEK(now(),1); + AND DATE_SUB(CURDATE(), INTERVAL 7 DAY) <= DATE(atte_date) + GROUP BY DATE_FORMAT(atte_date, '%Y-%m-%d') @@ -69,4 +70,20 @@ GROUP BY DATE_FORMAT(atte_date, '%Y-%m') + + + \ No newline at end of file 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 2b6953f..06ec0a8 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 @@ -28,7 +28,9 @@ @@ -87,7 +89,8 @@ SELECT hazard_level_code as levelCode, count(id) as quantity FROM bus_case_info WHERE hazard_level_code is not null - AND DATE_SUB(CURDATE(), INTERVAL 7 DAY) <= date(happen_time); + AND is_key_area = 1 + AND DATE_SUB(CURDATE(), INTERVAL 7 DAY) <= date(happen_time) GROUP BY hazard_level_code @@ -95,7 +98,8 @@ SELECT hazard_level_code as levelCode, count(id) as quantity FROM bus_case_info WHERE hazard_level_code is not null - AND DATE_SUB(CURDATE(), INTERVAL 30 DAY) <= date(happen_time); + AND is_key_area = 1 + AND DATE_SUB(CURDATE(), INTERVAL 30 DAY) <= date(happen_time) GROUP BY hazard_level_code @@ -122,4 +126,71 @@ AND hazard_level_code is not null GROUP BY DATE_FORMAT(happen_time,'%Y-%m-%d') + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/CategoryLevelMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/CategoryLevelMapper.xml index 4670b1f..1d25cbd 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/CategoryLevelMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/CategoryLevelMapper.xml @@ -20,11 +20,11 @@ SELECT * FROM bus_case_category_level WHERE 1=1 - - and code = #{code} + + and code = #{categoryLevelRequest.code} - - and name = #{name} + + and name = #{categoryLevelRequest.name} ORDER by create_time DESC 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 9b66fd8..bfd84b7 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 @@ -98,4 +98,10 @@ #{item} + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceRepairLogMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceRepairLogMapper.xml index 078ed3c..cf1a481 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceRepairLogMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceRepairLogMapper.xml @@ -22,14 +22,14 @@ SELECT * FROM bus_device_repair_log WHERE 1=1 - - and device_code = #{devCode} + + and device_code = #{deviceRepairRequest.devCode} - - and device_name = #{devName} + + and device_name = #{deviceRepairRequest.devName} - - and DATE_FORMAT(create_time,"%y%m%d") = DATE_FORMAT(#{createTime},"%y%m%d") + + and DATE_FORMAT(create_time,"%y%m%d") = DATE_FORMAT(#{deviceRepairRequest.createTime},"%y%m%d") ORDER by create_time DESC diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/HazardLevelMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/HazardLevelMapper.xml index f16f2b9..458322b 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/HazardLevelMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/HazardLevelMapper.xml @@ -20,11 +20,11 @@ SELECT * FROM bus_case_hazard_level WHERE 1=1 - - and code = #{code} + + and code = #{hazardLevelRequest.code} - - and name = #{name} + + and name = #{hazardLevelRequest.name} ORDER by create_time DESC @@ -42,4 +42,10 @@ SELECT name FROM bus_case_hazard_level + + \ 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 557237e..b6a183a 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 @@ -50,4 +50,10 @@ + + + UPDATE bus_staff_info + SET card_no = #{cardNo} + WHERE staff_code = #{staffCode} + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitInfoMapper.xml index 84aa84f..230529a 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitInfoMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitInfoMapper.xml @@ -27,5 +27,6 @@ SELECT * FROM bus_visit_info WHERE order_id = #{orderId} and DATE_FORMAT(in_time,'%Y-%m-%d') = CURRENT_DATE + limit 1 \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/BlackPictureRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/BlackPictureRequest.java new file mode 100644 index 0000000..fc92701 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/BlackPictureRequest.java @@ -0,0 +1,14 @@ +package com.casic.missiles.modular.dto; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/29 19:26 + */ +@Data +public class BlackPictureRequest { + private String picUri; + private String serverIndexCode; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/CancelSubscribeRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/CancelSubscribeRequest.java new file mode 100644 index 0000000..e2d390a --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/CancelSubscribeRequest.java @@ -0,0 +1,15 @@ +package com.casic.missiles.modular.dto.hik; + +import lombok.Data; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/24 15:14 + */ +@Data +public class CancelSubscribeRequest { + private List eventTypes; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/CardInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/CardInfo.java new file mode 100644 index 0000000..341457d --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/CardInfo.java @@ -0,0 +1,24 @@ +package com.casic.missiles.modular.dto.hik; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/26 16:08 + */ +@Data +public class CardInfo { + //卡号,8~20个字符,支持数字和大写字母 + private String cardNo; + //人员ID,员工工号 + private String personId; + //人员所属组织IndexCode + private String orgIndexCode; + //卡片类型,默认是1:IC卡 + //1:IC卡 + //2:CPU卡 + //3:远距离卡 + //4:MIFARE卡 + private Number cardType; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/FaceRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/FaceRequest.java new file mode 100644 index 0000000..edc04bf --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/FaceRequest.java @@ -0,0 +1,16 @@ +package com.casic.missiles.modular.dto.hik; + +import lombok.Data; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/25 16:53 + */ +@Data +public class FaceRequest { + private String certificateNum; + private List indexCodes; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/HikRecvEvent.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/HikRecvEvent.java index a3e9845..1b2b2b1 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/HikRecvEvent.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/HikRecvEvent.java @@ -28,12 +28,12 @@ /** * 事件类型,用于判断所需接收到的事件类型 */ - public Long getEventType(){ + public Number getEventType(){ JSONObject jsonObject = (JSONObject)JSONObject.toJSON(params); //事件类别对应SecurityEventTypeEnum JSONArray eventTypeArray = (JSONArray)jsonObject.get("events"); JSONObject eventJsonObject = (JSONObject)JSONObject.toJSON(eventTypeArray.get(0)); - Long eventType = (Long) eventJsonObject.get("eventType"); + Number eventType = (Number) eventJsonObject.get("eventType"); return eventType; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonBatchDeleteRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonBatchDeleteRequest.java index 027d31d..9751929 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonBatchDeleteRequest.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonBatchDeleteRequest.java @@ -12,4 +12,6 @@ @Data public class PersonBatchDeleteRequest { private List personIds; + //删除人脸接口使用 + private String faceId; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonInfoRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonInfoRequest.java new file mode 100644 index 0000000..05dc9e1 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonInfoRequest.java @@ -0,0 +1,20 @@ +package com.casic.missiles.modular.dto.hik; + +import lombok.Data; + +import java.util.List; + +/** + * @Description: 获取员工照片请求实体 + * @Author: wangpeng + * @Date: 2022/8/25 16:53 + */ +@Data +public class PersonInfoRequest { + //获取员工详细信息使用 + private String paramName; + private List paramValue; + //获取照片使用 + private String picUri; + private String serverIndexCode; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonListRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonListRequest.java new file mode 100644 index 0000000..3f7149b --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonListRequest.java @@ -0,0 +1,16 @@ +package com.casic.missiles.modular.dto.hik; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/25 16:53 + */ +@Data +public class PersonListRequest { + private Number pageNo; + private Number pageSize; + + private String orderId; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/SearchPicturesRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/SearchPicturesRequest.java new file mode 100644 index 0000000..0a95966 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/SearchPicturesRequest.java @@ -0,0 +1,24 @@ +package com.casic.missiles.modular.dto.hik; + +import lombok.Data; + +import java.util.List; + +/** + * @Description: 以图搜图请求 + * @Author: wangpeng + * @Date: 2022/8/29 10:46 + */ +@Data +public class SearchPicturesRequest { + private String facePicBinaryData; + private String facePicUrl; + private List cameraIndexCodes; + private String startTime; + private String endTime; + //指定搜图的最小相似度,最小为1,最大为100 + private String minSimilarity; + private Number age; + //male-男性,female-女性 + private String sex; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/StaffCardRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/StaffCardRequest.java new file mode 100644 index 0000000..4052e6d --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/StaffCardRequest.java @@ -0,0 +1,20 @@ +package com.casic.missiles.modular.dto.hik; + +import lombok.Data; + +import java.util.List; + +/** + * @Description: 人员开卡请求实体 + * @Author: wangpeng + * @Date: 2022/8/26 16:05 + */ +@Data +public class StaffCardRequest { + //卡片开始有效时间,时间格式:yyyy-MM-dd + private String startDate; + //卡片截止有效时间,时间格式:yyyy-MM-dd,不能大于2037年12月31日 + private String endDate; + //cardList,待开卡列表,最大支持50张卡 + private List cardList; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/VisitorInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/VisitorInfo.java index 73aa316..b99f301 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/VisitorInfo.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/VisitorInfo.java @@ -14,7 +14,7 @@ //访客性别 //1: 男 //2: 女 - private String gender; + private Integer gender; //联系电话建议填写手机号码 private String phoneNo; //证件类型 diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/ApplyReasonGroupDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/ApplyReasonGroupDTO.java index 514f382..786143e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/ApplyReasonGroupDTO.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/ApplyReasonGroupDTO.java @@ -13,4 +13,6 @@ private String visitReason; //访问人数 private Integer quantity; + //占比 + private String ratio; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/AttendanceNumberDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/AttendanceNumberDTO.java new file mode 100644 index 0000000..a494321 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/AttendanceNumberDTO.java @@ -0,0 +1,24 @@ +package com.casic.missiles.modular.dto.statistics; + +import com.fasterxml.jackson.annotation.JsonIgnore; +import lombok.Data; + +/** + * @Description: 出勤人数统计实体 + * @Author: wangpeng + * @Date: 2022/8/31 19:24 + */ +@Data +public class AttendanceNumberDTO { + //日期维度,周、今日,入参 + @JsonIgnore + private String dateDimension; + + //日期,具体天/小时,出参 + private String date; + //出勤人数 + private String quantity; + //员工类型 + private String staffType; + +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/AvgMonthAndWeekGroupDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/AvgMonthAndWeekGroupDTO.java index 4366916..331a9a9 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/AvgMonthAndWeekGroupDTO.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/AvgMonthAndWeekGroupDTO.java @@ -2,8 +2,6 @@ import lombok.Data; -import java.util.Map; - /** * @Description: 平均每月和每周的数据实体 * @Author: wangpeng @@ -13,6 +11,4 @@ public class AvgMonthAndWeekGroupDTO { //入参 private String year; - //出参,key:事件类型,value:周和月数据平均值 - private Map map; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/GateStatusGroupResponse.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/GateStatusGroupResponse.java new file mode 100644 index 0000000..d16f4e5 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/GateStatusGroupResponse.java @@ -0,0 +1,16 @@ +package com.casic.missiles.modular.dto.statistics; + +import lombok.Data; + +/** + * @Description: 闸机/摄像机统计响应实体 + * @Author: wangpeng + * @Date: 2022/8/30 14:22 + */ +@Data +public class GateStatusGroupResponse { + //设备状态 + private String status; + //占比 + private String ratio; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/MonthAndWeekDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/MonthAndWeekDTO.java index 7482b2a..284115a 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/MonthAndWeekDTO.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/MonthAndWeekDTO.java @@ -9,7 +9,7 @@ */ @Data public class MonthAndWeekDTO { -// private String levelName; + private String levelName; private Integer monthQuantity; private Integer weekQuantity; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/BlackListController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/BlackListController.java index a27f9f8..0c06661 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/BlackListController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/BlackListController.java @@ -1,13 +1,18 @@ package com.casic.missiles.modular.controller; +import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.base.controller.ExportController; import com.casic.missiles.core.page.PageFactory; import com.casic.missiles.model.response.ResponseData; import com.casic.missiles.modular.dto.BlackInfoRequest; +import com.casic.missiles.modular.dto.BlackPictureRequest; +import com.casic.missiles.modular.dto.hik.PersonInfoRequest; +import com.casic.missiles.modular.enums.HikUri; import com.casic.missiles.modular.enums.OperateTypeEnum; import com.casic.missiles.modular.model.BlackInfo; import com.casic.missiles.modular.service.BlackInfoService; +import com.casic.missiles.modular.util.HikUtil; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; @@ -56,4 +61,22 @@ return null; } + /** + * 黑名单人员照片 + */ + @PostMapping("/personPicture") + @ResponseBody + public Object personPicture(@RequestBody BlackPictureRequest blackPictureRequest){ + //获取照片 + String picUri = blackPictureRequest.getPicUri(); + String serverIndexCode = blackPictureRequest.getServerIndexCode(); + PersonInfoRequest picRequest = new PersonInfoRequest(); + picRequest.setPicUri(picUri); + picRequest.setServerIndexCode(serverIndexCode); + String reBody = JSONObject.toJSONString(picRequest); + //重定向地址获取 + String url = HikUtil.hikApiFor302(HikUri.PERSON_PICTURE, reBody); + return ResponseData.success(url); + } + } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/DeviceController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/DeviceController.java index e1c4eba..666bbee 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/DeviceController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/DeviceController.java @@ -107,7 +107,7 @@ } /** - * 设备维修管理查询(分页),需计算MTTR=总维修时间/故障次数 + * 设备状态计算与评判/设备维修管理查询(分页),需计算MTTR=总维修时间/故障次数 */ @PostMapping("/repair/listPage") @ResponseBody @@ -211,7 +211,7 @@ //需根据设备编号获取到对应的门禁点唯一标识 doorControlRequest.setDoorIndexCodes(indexCodes); doorControlRequest.setControlType(Integer.valueOf(gateGroupDTO.getStatus())); - String body = JSONObject.toJSONString(deviceCodes); + String body = JSONObject.toJSONString(doorControlRequest); String resultStr = HikUtil.hikApi(HikUri.DOOR_CONTROL, body); JSONObject resultJson = (JSONObject)JSONObject.parse(resultStr); if (!"0".equals(resultJson.get("code"))) { diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/StaffController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/StaffController.java index b58ccab..704093c 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/StaffController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/StaffController.java @@ -2,15 +2,21 @@ import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.util.StrUtil; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.base.controller.ExportController; import com.casic.missiles.core.page.PageFactory; import com.casic.missiles.model.response.ErrorResponseData; import com.casic.missiles.model.response.ResponseData; import com.casic.missiles.modular.dto.StaffInfoRequest; +import com.casic.missiles.modular.dto.hik.PersonInfoRequest; +import com.casic.missiles.modular.dto.hik.StaffCardRequest; +import com.casic.missiles.modular.enums.HikUri; import com.casic.missiles.modular.enums.OperateTypeEnum; import com.casic.missiles.modular.model.StaffInfo; import com.casic.missiles.modular.service.StaffInfoService; +import com.casic.missiles.modular.util.HikUtil; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; @@ -110,4 +116,60 @@ } return ResponseData.success(); } + + /** + * 批量开卡,添加人员之后调用,若在一个接口中添加人员成功开卡失败则第二次添加时会有问题 + */ + @PostMapping("/cardBinding") + @ResponseBody + public Object cardBinding(@RequestBody StaffCardRequest staffCardRequest) { + String body = JSONObject.toJSONString(staffCardRequest); + String resultStr = HikUtil.hikApi(HikUri.CARD_BINDING, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (!"0".equals(resultJson.get("code"))) { + log.error("请求海康,批量开卡失败,海康response:{}", resultStr); + return ResponseData.error("批量开卡失败"); + } + //保存卡号 + if(staffInfoService.saveCardInfo(staffCardRequest) > 0){ + return ResponseData.success(); + } + return ResponseData.error("批量开卡失败"); + } + + /** + * 获取员工照片,海康存储 + */ + @PostMapping("/personPicture/{staffCode}") + @ResponseBody + public Object personPicture(@PathVariable("staffCode") String staffCode){ + //获取员工详细信息,含图片服务器、uri + PersonInfoRequest request = new PersonInfoRequest(); + List list = new ArrayList<>(); + list.add(staffCode); + request.setParamName("personId"); + request.setParamValue(list); + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi(HikUri.PERSON_INFO, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (!"0".equals(resultJson.get("code"))) { + log.error("请求海康,根据人员唯一字段获取人员详细信息失败,海康response:{}", resultStr); + return ResponseData.error("获取员工照片失败"); + } + //获取照片 + JSONObject data = (JSONObject) resultJson.get("data"); + JSONArray dataArray = (JSONArray) data.get("list"); + JSONObject jsonObject = (JSONObject) dataArray.get(0); + JSONArray personPhoto = (JSONArray) jsonObject.get("personPhoto"); + JSONObject photo = (JSONObject) personPhoto.get(0); + String picUri = photo.getString("picUri"); + String serverIndexCode = photo.getString("serverIndexCode"); + PersonInfoRequest picRequest = new PersonInfoRequest(); + picRequest.setPicUri(picUri); + picRequest.setServerIndexCode(serverIndexCode); + String reBody = JSONObject.toJSONString(picRequest); + //重定向地址获取 + String url = HikUtil.hikApiFor302(HikUri.PERSON_PICTURE, reBody); + return ResponseData.success(url); + } } 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 4a07dd9..7b1dcf6 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 @@ -16,6 +16,7 @@ import com.casic.missiles.modular.redis.key.CacheKeys; import com.casic.missiles.modular.service.CockpitService; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.util.CollectionUtils; import org.springframework.web.bind.annotation.*; @@ -24,10 +25,7 @@ import java.text.NumberFormat; import java.time.LocalDateTime; import java.time.temporal.ChronoUnit; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.util.*; import java.util.stream.Collectors; /** @@ -73,6 +71,9 @@ private StatisticNumberMapper numberMapper; @Autowired + private HazardLevelMapper hazardLevelMapper; + + @Autowired private AccessGroupConfig accessGroupConfig; /** @@ -104,8 +105,24 @@ public Object buildingNumberPerHour(){ //当天按小时分组的人数 List list = numberMapper.selectListByTime(); - Map> collect = list.stream().collect(Collectors.groupingBy(BuildingNumberDTO::getStatisticPosition)); - return ResponseData.success(collect); + Map> collect = list.stream().collect(Collectors.groupingBy(BuildingNumberDTO::getStatisticTime)); + //定时任务中已将每小时三栋楼人数存到数据库 + //将一期主楼和录制楼人数合并,二期单算 + List> resultList = new ArrayList<>(); + collect.keySet().forEach(key -> { + List buildingNumberDTOS = collect.get(key); + BuildingNumberDTO mainBuildingOne = buildingNumberDTOS.get(0); + BuildingNumberDTO mainBuildingTwo = buildingNumberDTOS.get(1); + BuildingNumberDTO recordingBuilding = buildingNumberDTOS.get(2); + HashMap resultMap = new HashMap<>(); + Integer oneQuantity = Integer.valueOf(mainBuildingOne.getStatisticQuantity()); + Integer recordingQuantity = Integer.valueOf(recordingBuilding.getStatisticQuantity()); + resultMap.put("staticTime", mainBuildingOne.getStatisticTime()); + resultMap.put(mainBuildingOne.getStatisticPositionName()+"、"+recordingBuilding.getStatisticPositionName(), String.valueOf(oneQuantity+recordingQuantity)); + resultMap.put(mainBuildingTwo.getStatisticPositionName(), mainBuildingTwo.getStatisticQuantity()); + resultList.add(resultMap); + }); + return ResponseData.success(resultList); } /** @@ -151,12 +168,11 @@ public Object securityNumber() { QueryWrapper wrapper = new QueryWrapper<>(); wrapper.eq("staff_type", 2); + // TODO: 2022/9/2 后续使用产品确定的每天出勤的安保人员的数量 Integer total = staffInfoMapper.selectCount(wrapper); - //当日离岗事件个数 - QueryWrapper wrapper1 = new QueryWrapper<>(); - wrapper1.eq("hik_event_type", SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); - wrapper1.apply("date_format(now(),'%Y-%m-%d') = date_format(happen_time,'%Y-%m-%d')"); - Integer leave = caseInfoMapper.selectCount(wrapper1); + //当日离岗事件按设备去重后的个数 + // TODO: 2022/9/2 目前相当于24小时内的计算,之后看需要可改成自定义小时数计算离岗率,即离岗+6小时内仅一次离岗则恢复为100%,多次则累加离岗次数计算离岗率 + Integer leave = caseInfoMapper.selectDemobilizedCount(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); NumberFormat numberFormat = NumberFormat.getInstance(); // 设置精确到小数点后2位 numberFormat.setMaximumFractionDigits(2); @@ -179,7 +195,6 @@ @ResponseBody public Object visitorApplyDetail() { List reasonGroup = applyMapper.selectByVisitReason(); - HashMap resultMap = new HashMap<>(); NumberFormat numberFormat = NumberFormat.getInstance(); // 设置精确到小数点后2位 numberFormat.setMaximumFractionDigits(2); @@ -187,12 +202,17 @@ if(0 == sum){ return ResponseData.success(); } + List resultList = new ArrayList<>(); reasonGroup.forEach(group -> { String reasonName = dictService.getDictNameByCode(SecurityEventDict.VISIT_REASON, group.getVisitReason()); String result = numberFormat.format((float) group.getQuantity() / (float) sum * 100); - resultMap.put(reasonName, result+"%"); + ApplyReasonGroupDTO applyReasonGroupDTO = new ApplyReasonGroupDTO(); + applyReasonGroupDTO.setQuantity(group.getQuantity()); + applyReasonGroupDTO.setVisitReason(reasonName); + applyReasonGroupDTO.setRatio(result+"%"); + resultList.add(applyReasonGroupDTO); }); - return ResponseData.success(resultMap); + return ResponseData.success(resultList); } /** @@ -247,6 +267,32 @@ } /** + * 机动力量实时在岗率,在岗人数除以总应在岗人数,用离岗+6小时内恢复为100%,6小时外再计算 + */ + @GetMapping("/staff/beOnDutyRatio") + @ResponseBody + public Object beOnDutyRatio() { + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("staff_type", 2); + // TODO: 2022/9/2 后续使用产品确定的每天出勤的安保人员的数量 + Integer total = staffInfoMapper.selectCount(wrapper); + if(0 == total){ + return ResponseData.success(null); + } + //当日离岗事件按设备去重后的个数 + // TODO: 2022/9/2 目前相当于24小时内的计算,之后看需要可改成自定义小时数计算离岗率,即离岗+6小时内仅一次离岗则恢复为100%,多次则累加离岗次数计算离岗率 + List onDutyRatioDTOS = caseInfoMapper.selectDemobilizedCountByHour(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); + onDutyRatioDTOS.forEach(dto -> { + NumberFormat numberFormat = NumberFormat.getInstance(); + // 设置精确到小数点后2位 + numberFormat.setMaximumFractionDigits(2); + String result = numberFormat.format(100 - Float.valueOf(dto.getQuantity()) / (float) total * 100); + dto.setRatio(result+"%"); + }); + return ResponseData.success(onDutyRatioDTOS); + } + + /** * 闸机速通门统计-设备状态分组计算数量,devType传闸机字典key * 视频频监控摄像机统计-设备状态分组计算数量,devType传摄像头字典key */ @@ -262,12 +308,17 @@ if(sum <= 0){ return ResponseData.error("无该类设备信息"); } + List resultList = new ArrayList<>(); gateStatusGroup.forEach(group -> { String devStatus = dictService.getDictNameByCode(SecurityEventDict.DEVICE_STATUS, group.getStatus()); String result = numberFormat.format((float) group.getQuantity() / (float) sum * 100); - resultMap.put(devStatus, result+"%"); + GateStatusGroupResponse gateStatusGroupResponse = new GateStatusGroupResponse(); + gateStatusGroupResponse.setStatus(devStatus); + gateStatusGroupResponse.setRatio(result+"%"); + resultList.add(gateStatusGroupResponse); }); - resultMap.put("总", sum); + resultMap.put("total", sum); + resultMap.put("list", resultList); return ResponseData.success(resultMap); } @@ -282,17 +333,38 @@ String position = securityScoreDTO.getPosition(); List caseInfos = caseInfoMapper.selectByPosition(position); //查询各危险级别权重、各类别权重,放入map,避免循环中多次查数据库 - + HashMap hazardScoreMap = new HashMap<>(); + List caseHazardLevelList = hazardLevelMapper.getCaseHazardLevelList(null); + caseHazardLevelList.forEach(hazardLevel -> { + hazardScoreMap.put(hazardLevel.getCode(), hazardLevel.getWeight()); + }); + HashMap categoryScoreMap = new HashMap<>(); + List categoryLevelList = categoryLevelMapper.getCaseCategoryLevelList(null); + categoryLevelList.forEach(categoryLevel -> { + categoryScoreMap.put(categoryLevel.getCode(), categoryLevel.getWeight()); + }); + //事件按楼层分组,计算 List securityScoreDTOs = new ArrayList<>(); caseInfos.forEach(caseInfo -> { SecurityScoreDTO securityScoreDTO1 = new SecurityScoreDTO(); + securityScoreDTO1.setPosition(caseInfo.getPosition()); securityScoreDTO1.setArea(caseInfo.getArea()); - // TODO: 2022/8/4 楼层评分计算根据产品定义调整 -// caseInfo.get -// securityScoreDTO1.setScore(); + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); + Double score = 100 - Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + securityScoreDTO1.setScore(score); + securityScoreDTOs.add(securityScoreDTO1); }); - - return null; + 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); + }); + return ResponseData.success(securityScoreDTOs); } /** @@ -303,9 +375,13 @@ public Object SecurityFrequency(@RequestBody SecurityFrequencyDTO securityFrequencyDTO) { String year = securityFrequencyDTO.getYear(); String month = securityFrequencyDTO.getMonth(); - Integer quantity = caseInfoMapper.selectCountByMonth(year, month); - securityFrequencyDTO.setQuantity(quantity); - return ResponseData.success(securityFrequencyDTO); + if(!StringUtils.isEmpty(year) && StringUtils.isEmpty(month)){ + Integer quantity = caseInfoMapper.selectCountByMonth(year, month); + securityFrequencyDTO.setQuantity(quantity); + return ResponseData.success(securityFrequencyDTO); + } + List list = caseInfoMapper.selectPreMonthCount(); + return ResponseData.success(list); } } 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 ae4d770..f4f075c 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 @@ -1,20 +1,25 @@ package com.casic.missiles.modular.controller.cockpit; +import cn.hutool.core.date.DateUnit; import cn.hutool.core.date.DateUtil; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.casic.missiles.model.response.ResponseData; -import com.casic.missiles.modular.dao.AttendanceInfoMapper; -import com.casic.missiles.modular.dao.CaseInfoMapper; -import com.casic.missiles.modular.dao.HazardLevelMapper; -import com.casic.missiles.modular.dao.StaffInfoMapper; +import com.casic.missiles.modular.dao.*; +import com.casic.missiles.modular.dto.DeviceRepairLogDTO; +import com.casic.missiles.modular.dto.DeviceRepairRequest; import com.casic.missiles.modular.dto.statistics.*; +import com.casic.missiles.modular.enums.SecurityEventType; +import com.casic.missiles.modular.model.CaseCategoryLevel; import com.casic.missiles.modular.model.CaseHazardLevel; +import com.casic.missiles.modular.model.CaseInfo; import com.casic.missiles.modular.model.StaffInfo; +import com.casic.missiles.modular.service.DeviceInfoService; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.util.CollectionUtils; import org.springframework.web.bind.annotation.*; +import java.math.BigDecimal; import java.text.NumberFormat; import java.util.*; import java.util.stream.Collectors; @@ -40,6 +45,12 @@ @Autowired private HazardLevelMapper hazardLevelMapper; + @Autowired + private CategoryLevelMapper categoryLevelMapper; + + @Autowired + private DeviceInfoService deviceInfoService; + /** * 安防事件时域频次统计,每月的每天安防事件个数(原方案) * 月维度:展示每个月的每天的数据 @@ -89,15 +100,17 @@ List monthList = caseInfoMapper.selectPreMonthCountByYear(year); Map> collect = monthList.stream().collect(Collectors.groupingBy(PreMonthOrWeekCaseDTO::getHazardLevelCode)); HashMap strAvgMap = new HashMap<>(); + List resultList = new ArrayList<>(); for (String key : collect.keySet()) { List preMonthOrWeekCaseDTOS = collect.get(key); int sum = preMonthOrWeekCaseDTOS.stream().mapToInt(PreMonthOrWeekCaseDTO::getQuantity).sum(); //若年份是本年,则使用个安防级别数量/当前月份数 //若不是本年,除数为12 MonthAndWeekDTO monthAndWeekDTO = new MonthAndWeekDTO(); + String hazardName = hazardLevelMapper.selectHazardNameByCode(key); + monthAndWeekDTO.setLevelName(hazardName); if(year.equals(String.valueOf(DateUtil.thisYear()))){ monthAndWeekDTO.setMonthQuantity(sum / DateUtil.thisMonth()); -// monthAndWeekDTO.setLevelName(); strAvgMap.put(key, monthAndWeekDTO); }else{ monthAndWeekDTO.setMonthQuantity(sum / 12); @@ -113,27 +126,37 @@ if(year.equals(String.valueOf(DateUtil.thisYear()))){ if(!Objects.isNull(strAvgMap.get(key))){ MonthAndWeekDTO monthAndWeekDTO = strAvgMap.get(key); + String hazardName = hazardLevelMapper.selectHazardNameByCode(key); + monthAndWeekDTO.setLevelName(hazardName); monthAndWeekDTO.setWeekQuantity(sum / DateUtil.thisWeekOfYear()); strAvgMap.put(key, monthAndWeekDTO); }else{ MonthAndWeekDTO monthAndWeekDTO = new MonthAndWeekDTO(); + String hazardName = hazardLevelMapper.selectHazardNameByCode(key); + monthAndWeekDTO.setLevelName(hazardName); monthAndWeekDTO.setWeekQuantity(sum / DateUtil.thisWeekOfYear()); strAvgMap.put(key, monthAndWeekDTO); } }else{ if(!Objects.isNull(strAvgMap.get(key))){ MonthAndWeekDTO monthAndWeekDTO = strAvgMap.get(key); + String hazardName = hazardLevelMapper.selectHazardNameByCode(key); + monthAndWeekDTO.setLevelName(hazardName); monthAndWeekDTO.setWeekQuantity(sum / 52); strAvgMap.put(key, monthAndWeekDTO); }else{ MonthAndWeekDTO monthAndWeekDTO = new MonthAndWeekDTO(); + String hazardName = hazardLevelMapper.selectHazardNameByCode(key); + monthAndWeekDTO.setLevelName(hazardName); monthAndWeekDTO.setWeekQuantity(sum / 52); strAvgMap.put(key, monthAndWeekDTO); } } } - avgMonthAndWeekGroupDTO.setMap(strAvgMap); - return ResponseData.success(avgMonthAndWeekGroupDTO); + strAvgMap.keySet().forEach(key -> { + resultList.add(strAvgMap.get(key)); + }); + return ResponseData.success(resultList); } /** @@ -181,12 +204,178 @@ } /** - * 员工考勤人数变化,功能待定 + * 员工考勤人数变化,统计当天(横坐标为时)及近7天(横坐标为天)的考勤人数变化,只要发生一次考勤识别,次数的基数就正常增加(没有上班下班区分) */ + @PostMapping("/staff/attendanceNumber/{dimension}") + @ResponseBody + public Object attendanceNumber(@PathVariable("dimension") String dimension) { + List attendanceNumberDTOs = null; + List> resultList = new ArrayList<>(); + if("week".equals(dimension)){ + //近7天数据按天分组统计 + attendanceNumberDTOs = attendanceInfoMapper.getCountForWeek(); + }else if("day".equals(dimension)) { + //今天数据按小时分组统计 + attendanceNumberDTOs = attendanceInfoMapper.getCountForDay(); + } + if(CollectionUtils.isEmpty(attendanceNumberDTOs)){ + return ResponseData.error("该查询条件下,无员工出勤数据!"); + } + Map> collect = attendanceNumberDTOs.stream().collect(Collectors.groupingBy(AttendanceNumberDTO::getDate)); + collect.keySet().forEach(key -> { + List attendanceNumberDTOS = collect.get(key); + AttendanceNumberDTO attendanceNumberDTO = attendanceNumberDTOS.get(0); + AttendanceNumberDTO attendanceNumberDTO2 = attendanceNumberDTOS.get(1); + Map resultMap = new HashMap<>(); + resultMap.put(attendanceNumberDTO.getStaffType(), attendanceNumberDTO.getQuantity()); + resultMap.put(attendanceNumberDTO2.getStaffType(), attendanceNumberDTO2.getQuantity()); + resultMap.put("staticTime", attendanceNumberDTO.getDate()); + resultList.add(resultMap); + }); + return ResponseData.success(resultList); + } /** - * 近30天/近一周安保人员到岗排行 + * 早晚高峰区域安防评估 */ + @PostMapping("/security/assessment/{dimension}") + @ResponseBody + public Object securityAssessment(@PathVariable("dimension") String dimension) { + //查询各危险级别权重、各类别权重,放入map,避免循环中多次查数据库 + HashMap hazardScoreMap = new HashMap<>(); + List caseHazardLevelList = hazardLevelMapper.getCaseHazardLevelList(null); + caseHazardLevelList.forEach(hazardLevel -> { + hazardScoreMap.put(hazardLevel.getCode(), hazardLevel.getWeight()); + }); + HashMap categoryScoreMap = new HashMap<>(); + List categoryLevelList = categoryLevelMapper.getCaseCategoryLevelList(null); + categoryLevelList.forEach(categoryLevel -> { + categoryScoreMap.put(categoryLevel.getCode(), categoryLevel.getWeight()); + }); + HashMap hashMap = new HashMap<>(); + if("week".equals(dimension)){ + //近7天早晚高峰数据 + List caseInfos = caseInfoMapper.selectListBySevenDay(); + //按时间(天)进行分组 + caseInfos.forEach(caseInfo -> { + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); + Double score = Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + String[] array = caseInfo.getHappenTime().split(" "); + String dayTime = array[0]; + BigDecimal preScore; + if(hashMap.containsKey(dayTime)){ + Double aDouble = hashMap.get(dayTime); + preScore = new BigDecimal(aDouble.toString()); + + }else{ + preScore = new BigDecimal("100.0"); + } + BigDecimal nowScore = new BigDecimal(score.toString()); + hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); + }); + return ResponseData.success(hashMap); + }else if("day".equals(dimension)) { + //今天数据按小时分组统计 + List caseInfos = caseInfoMapper.selectListByToday(); + caseInfos.forEach(caseInfo -> { + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); + Double score = Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + String[] array = caseInfo.getHappenTime().split(":"); + String dayTime = array[0]; + BigDecimal preScore; + if(hashMap.containsKey(dayTime)){ + Double aDouble = hashMap.get(dayTime); + preScore = new BigDecimal(aDouble.toString()); + + }else{ + preScore = new BigDecimal("100.0"); + } + BigDecimal nowScore = new BigDecimal(score.toString()); + hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); + }); + return ResponseData.success(hashMap); + } + return null; + } + + /** + * 重点区域安防事态评估,统计重点区域6:00-23:00按小时分组数据 + */ + @GetMapping("/security/keyAreaStatistic") + @ResponseBody + public Object keyAreaStatistic() { + //查询各危险级别权重、各类别权重,放入map,避免循环中多次查数据库 + HashMap hazardScoreMap = new HashMap<>(); + List caseHazardLevelList = hazardLevelMapper.getCaseHazardLevelList(null); + caseHazardLevelList.forEach(hazardLevel -> { + hazardScoreMap.put(hazardLevel.getCode(), hazardLevel.getWeight()); + }); + HashMap categoryScoreMap = new HashMap<>(); + List categoryLevelList = categoryLevelMapper.getCaseCategoryLevelList(null); + categoryLevelList.forEach(categoryLevel -> { + categoryScoreMap.put(categoryLevel.getCode(), categoryLevel.getWeight()); + }); + HashMap hashMap = new HashMap<>(); + //今天数据按小时分组统计 + List caseInfos = caseInfoMapper.selectListByToday2(); + caseInfos.forEach(caseInfo -> { + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); + Double score = Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + String[] array = caseInfo.getHappenTime().split(":"); + String dayTime = array[0]; + BigDecimal preScore; + if(hashMap.containsKey(dayTime)){ + Double aDouble = hashMap.get(dayTime); + preScore = new BigDecimal(aDouble.toString()); + + }else{ + preScore = new BigDecimal("100.0"); + } + BigDecimal nowScore = new BigDecimal(score.toString()); + hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); + }); + return ResponseData.success(hashMap); + } + + /** + * 安防机动支援力量调配响应评估,根据事件已解决状态及已解决时间-发送时间,按时间(小时)分组统计 + */ + @GetMapping("/security/responseAssess") + @ResponseBody + public Object responseAssess() { + //查询各危险级别权重、各类别权重,放入map,避免循环中多次查数据库 + HashMap hazardScoreMap = new HashMap<>(); + List caseHazardLevelList = hazardLevelMapper.getCaseHazardLevelList(null); + caseHazardLevelList.forEach(hazardLevel -> { + hazardScoreMap.put(hazardLevel.getCode(), hazardLevel.getWeight()); + }); + HashMap hashMap = new HashMap<>(); + //今天数据按小时分组统计 + List caseInfos = caseInfoMapper.selectListByToday3(); + caseInfos.forEach(caseInfo -> { + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + //扣分=事件级别权重*未解决小时数 + Date updateTime = DateUtil.parse(caseInfo.getUpdateTime()); + Date happenTime = DateUtil.parse(caseInfo.getHappenTime()); + long between = DateUtil.between(updateTime, happenTime, DateUnit.HOUR); + Double score = Double.valueOf(hazardWeight)*between; + String[] array = caseInfo.getHappenTime().split(":"); + String dayTime = array[0]; + BigDecimal preScore; + if(hashMap.containsKey(dayTime)){ + Double aDouble = hashMap.get(dayTime); + preScore = new BigDecimal(aDouble.toString()); + }else{ + preScore = new BigDecimal("100.0"); + } + BigDecimal nowScore = new BigDecimal(score.toString()); + hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); + }); + return ResponseData.success(hashMap); + } /** * 重点区域威胁事件类型统计,优先级2,统计近7天和近30天 @@ -224,7 +413,34 @@ } /** - * 设备状态计算系数和评判,优先级3,需确认设备恢复时间是否可以获取 + * 近30天/近一周安保人员到岗排行 */ + + /** + * 安保等级评估,发生离岗事件减1分 + */ + @GetMapping("/security/levelAssess") + @ResponseBody + public Object securityLevelAssess() { + //今天数据按小时分组统计 + List resultList = caseInfoMapper.selectListByType(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); + resultList.forEach(result -> { + BigDecimal deScore = new BigDecimal(result.getQuantity()); + BigDecimal preScore = new BigDecimal("100.0"); + result.setScore(preScore.subtract(deScore).doubleValue()); + }); + return ResponseData.success(resultList); + } + + /** + * 设备状态计算系数和评判,即设备维修管理查询(不分页) + */ + @PostMapping("/device/repairList") + @ResponseBody + public Object repairList(@RequestBody DeviceRepairRequest deviceRepairRequest) { + List deviceRepairLogDTOS = deviceInfoService.deviceRepairListPage(deviceRepairRequest); + return ResponseData.success(deviceRepairLogDTOS); + } + } 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 fbf8ab6..c71a15a 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 @@ -1,13 +1,12 @@ package com.casic.missiles.modular.controller.hik; +import cn.hutool.core.date.DateTime; +import cn.hutool.core.date.DateUtil; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.casic.missiles.model.response.ResponseData; import com.casic.missiles.modular.dao.HikFaceGroupInfoMapper; -import com.casic.missiles.modular.dto.hik.EventSubscribeRequest; -import com.casic.missiles.modular.dto.hik.FaceGroupAdditionRequest; -import com.casic.missiles.modular.dto.hik.HikRecvEvent; -import com.casic.missiles.modular.dto.hik.OrgBatchAdd; +import com.casic.missiles.modular.dto.hik.*; import com.casic.missiles.modular.enums.HikUri; import com.casic.missiles.modular.enums.SecurityEventType; import com.casic.missiles.modular.model.CaseInfo; @@ -18,16 +17,20 @@ import com.casic.missiles.modular.util.CaseInfoFactoryUtil; import com.casic.missiles.modular.util.HikUtil; import com.casic.missiles.modular.util.ThreadPoolUtil; +import com.casic.missiles.modular.util.WebSocket; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; -import org.springframework.web.bind.annotation.*; +import org.springframework.util.CollectionUtils; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.RestController; -import java.net.InetAddress; -import java.net.UnknownHostException; import java.util.ArrayList; +import java.util.Iterator; import java.util.List; import java.util.Objects; @@ -38,7 +41,6 @@ */ @Slf4j @RestController -@RequestMapping("/hik") public class HikController { @Autowired @@ -53,28 +55,37 @@ @Autowired private HikService hikService; + @Autowired + private HikFaceGroupInfoMapper hikFaceGroupInfoMapper; + + @Autowired + private WebSocket webSocket; + @Value("${server.port}") private int serverPort; - @Autowired - private HikFaceGroupInfoMapper hikFaceGroupInfoMapper; /** * 海康事件订阅 */ - @PostMapping("/event/subscribe") + @PostMapping("/hik/event/subscribe") @ResponseBody - public Object eventSubscribe() throws UnknownHostException { + public Object eventSubscribe() { EventSubscribeRequest eventSubscribeRequest = new EventSubscribeRequest(); ArrayList list = new ArrayList<>(); list.add(SecurityEventType.DEVICE_OFFLINE); + list.add(SecurityEventType.DEVICE_ONLINE); list.add(SecurityEventType.KEY_PERSONNEL_IDENTIFY_EVENT); list.add(SecurityEventType.MONITORING_POINT_OFFLINE); + list.add(SecurityEventType.MONITORING_POINT_ONLINE); list.add(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); list.add(SecurityEventType.PERSONNEL_GATHER_EVENT); - InetAddress localHost = InetAddress.getLocalHost(); + list.add(SecurityEventType.VISITOR_REGISTER); + list.add(SecurityEventType.VISITOR_CHECKOUT); + list.add(SecurityEventType.HIGH_ALTITUDE_PARABOLIC); +// InetAddress localHost = InetAddress.getLocalHost(); eventSubscribeRequest.setEventTypes(list); - eventSubscribeRequest.setEventDest("https://" + localHost + ":" + serverPort + "/eventRcv"); + eventSubscribeRequest.setEventDest("http://" + "192.168.10.6" + ":" + serverPort + "/eventRcv"); //订阅类型,0-订阅原始事件,1-联动事件,2-原始事件和联动事件,不填使用默认值0 eventSubscribeRequest.setSubType(0); /** @@ -92,19 +103,25 @@ } /** + * 查询事件订阅信息 + */ + @PostMapping("/hik/event/query") + @ResponseBody + public Object eventQuery() { + String result = HikUtil.hikApi(HikUri.EVENT_INFO, ""); + return result; + } + + /** * 海康事件接收 */ @PostMapping("/eventRcv") @ResponseBody public Object eventRcv(@RequestBody HikRecvEvent hikRecvEvent) { //1、接收所需事件类型 - Long eventType = hikRecvEvent.getEventType(); + Number eventType = hikRecvEvent.getEventType(); log.info("接收到安防事件类型为:{}", eventType); CaseInfo caseInfo = caseInfoFactoryUtil.getCaseInfo(eventType); - //接收到不关心事件直接返回 - if(Objects.isNull(caseInfo)){ - return ResponseData.success(); - } //2、不同事件不同处理,caseInfoFactoryUtil已设置好事件基础定义信息 // 再为事件添加状态、设备编码、设备名称、位置、区域、时间 // 异步处理事件 @@ -114,19 +131,23 @@ caseHandle(hikRecvEvent, eventType, caseInfo); } })); +// caseHandle(hikRecvEvent, eventType, caseInfo); - return null; + return ResponseData.success(); } - private void caseHandle(HikRecvEvent hikRecvEvent, Long eventType, CaseInfo caseInfo) { + private void caseHandle(HikRecvEvent hikRecvEvent, Number eventType, CaseInfo caseInfo) { JSONArray eventArray = hikRecvEvent.getEventArray(); List caseInfos = new ArrayList<>(); - while (eventArray.stream().iterator().hasNext()) { + Iterator iterator = eventArray.iterator(); + while (iterator.hasNext()) { CaseInfo caseInfo1 = new CaseInfo(); - BeanUtils.copyProperties(caseInfo, caseInfo1); - JSONObject event = (JSONObject) eventArray.stream().iterator().next(); + if(!Objects.isNull(caseInfo)){ + BeanUtils.copyProperties(caseInfo, caseInfo1); + } + JSONObject event = (JSONObject) iterator.next(); //5种事件进行不同处理 - if(SecurityEventType.KEY_PERSONNEL_IDENTIFY_EVENT == eventType){ + if (SecurityEventType.KEY_PERSONNEL_IDENTIFY_EVENT.equals(eventType)) { //判断所属人脸分组 JSONObject data = (JSONObject) event.get("data"); JSONObject faceRecognitionResult = (JSONObject) data.get("faceRecognitionResult"); @@ -142,52 +163,101 @@ if (faceGroupCode.equals(blackListGroup.getFaceGroupCode())) { //黑名单分组处理 caseInfo1 = hikService.blackListHandle(event, caseInfo1); - }else if(faceGroupCode.equals(propertyPersonnelGroup.getFaceGroupCode())){ + } else if (faceGroupCode.equals(propertyPersonnelGroup.getFaceGroupCode())) { //考勤分组处理-物业人员,添加到考勤表 hikService.propertyAttendanceHandle(event); - }else if(faceGroupCode.equals(securityPersonnelGroup.getFaceGroupCode())){ + } else if (faceGroupCode.equals(securityPersonnelGroup.getFaceGroupCode())) { //考勤分组处理-安保人员,添加到考勤表 hikService.securityPersonnelHandle(event); - }else { + } else { return; } - }else if(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT == eventType){ + } else if (SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT.equals(eventType)) { //离岗事件处理 caseInfo1 = hikService.demobilizedHandle(event, caseInfo1); - }else if(SecurityEventType.PERSONNEL_GATHER_EVENT == eventType){ + } else if (SecurityEventType.PERSONNEL_GATHER_EVENT.equals(eventType)) { //人员聚集事件处理 caseInfo1 = hikService.personGatherHandle(event, caseInfo1); - }else if(SecurityEventType.MONITORING_POINT_OFFLINE == eventType){ + } else if (SecurityEventType.MONITORING_POINT_OFFLINE.equals(eventType)) { //监控点离线事件处理 caseInfo1 = hikService.monitorPointOfflineHandle(event, caseInfo1); - }else if(SecurityEventType.DEVICE_OFFLINE == eventType){ + } else if (SecurityEventType.MONITORING_POINT_ONLINE.equals(eventType)) { + //监控点上线事件处理 + hikService.monitorPointOnlineHandle(event); + } else if (SecurityEventType.DEVICE_OFFLINE.equals(eventType)) { //装置离线事件处理 caseInfo1 = hikService.deviceOfflineHandle(event, caseInfo1); - }else if(SecurityEventType.VISITOR_REGISTER == eventType){ + } else if (SecurityEventType.DEVICE_ONLINE.equals(eventType)) { + //装置上线处理 + hikService.deviceOnlineHandle(event); + } else if (SecurityEventType.VISITOR_REGISTER.equals(eventType)) { //记录访客登记记录,添加到访客记录表 hikService.visitorRegisterHandler(event); - }else if(SecurityEventType.VISITOR_CHECKOUT == eventType){ + } else if (SecurityEventType.VISITOR_CHECKOUT.equals(eventType)) { //记录访客签离记录 hikService.visitorCheckOutHandler(event); } - if(!Objects.isNull(caseInfo1) && !StringUtils.isEmpty(caseInfo1.getHappenTime())){ + if (!Objects.isNull(caseInfo1) && !StringUtils.isEmpty(caseInfo1.getHappenTime())) { caseInfos.add(caseInfo1); } } //3、安防事件入库 - if(!caseInfoService.insertCaseInfoBatch(caseInfos)){ - log.error("安防事件批量入库异常"); + if (!CollectionUtils.isEmpty(caseInfos) && !caseInfoService.insertCaseInfoBatch(caseInfos)) { + log.error("安防事件批量入库异常!"); } // TODO: 2022/8/15 webSocket推送 + if (CollectionUtils.isEmpty(caseInfos)) { + log.info("webSocket事件推送"); + webSocket.sendAllMessage(JSONObject.toJSONString(caseInfos)); + } return; } /** + * 以图搜图,前端用于轨迹追踪 + */ + @PostMapping("/hik/search/picture") + @ResponseBody + public Object searchPictures(@RequestBody SearchPicturesRequest searchPicturesRequest) { + DateTime startDateTime = DateUtil.parse(searchPicturesRequest.getStartTime()); + DateTime endDateTime = DateUtil.parse(searchPicturesRequest.getEndTime()); + String startTime = DateUtil.format(startDateTime, "yyyy-MM-dd'T'HH:mm:ss.SSSXXX"); + String endTime = DateUtil.format(endDateTime, "yyyy-MM-dd'T'HH:mm:ss.SSSXXX"); + searchPicturesRequest.setStartTime(startTime); + searchPicturesRequest.setEndTime(endTime); + String body = JSONObject.toJSONString(searchPicturesRequest); + String resultStr = HikUtil.hikApi(HikUri.SEARCH_PICTURES, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (!"0".equals(resultJson.get("code"))) { + log.error("请求海康,以图搜图失败,海康response:{}", resultStr); + return ResponseData.error("以图搜图失败"); + } + return ResponseData.success(resultJson); + } + + + /** + * 海康事件取消订阅 + */ + @PostMapping("/hik/event/cancel") + @ResponseBody + public Object eventCancelSubscribe(@RequestBody CancelSubscribeRequest cancelSubscribeRequest) { + String body = JSONObject.toJSONString(cancelSubscribeRequest); + String resultStr = HikUtil.hikApi(HikUri.EVENT_CANCEL, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (!"0".equals(resultJson.get("code"))) { + log.error("请求海康,取消订阅失败,海康response:{}", resultStr); + return ResponseData.error("取消订阅失败"); + } + return ResponseData.success(resultJson); + } + + /** * 单个添加海康人脸分组 * api->hik单个添加人脸分组api->response->mysql */ - @PostMapping("/faceGroup/single/add") + @PostMapping("/hik/faceGroup/single/add") @ResponseBody public Object faceGroupAddition(@RequestBody FaceGroupAdditionRequest faceGroupAdditionRequest) { String body = JSONObject.toJSONString(faceGroupAdditionRequest); @@ -212,7 +282,7 @@ * 批量添加海康组织 * api->hik批量添加组织api->response */ - @PostMapping("/org/batch/add") + @PostMapping("/hik/org/batch/add") @ResponseBody public Object orgBatchAdd(@RequestBody List orgBatchAddRequest) { String body = JSONObject.toJSONString(orgBatchAddRequest); @@ -232,4 +302,62 @@ return ResponseData.error("批量添加组织失败"); } + /** + * 获取人员列表 + */ + @PostMapping("/hik/person/personList") + @ResponseBody + public Object personList() { + PersonListRequest request = new PersonListRequest(); + request.setPageNo(1); + request.setPageSize(100); + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi("/api/resource/v2/person/personList", body); + return resultStr; + } + + /** + * 获取组织列表 + */ + @PostMapping("/hik/org/orgList") + @ResponseBody + public Object orgList() { + PersonListRequest request = new PersonListRequest(); + request.setPageNo(1); + request.setPageSize(100); + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi("/api/resource/v1/org/orgList", body); + return resultStr; + } + + /** + * 查询访客权限下载记录 + */ + @PostMapping("/hik/auth/result") + @ResponseBody + public Object authResult() { + PersonListRequest request = new PersonListRequest(); + request.setPageNo(1); + request.setPageSize(100); + request.setOrderId("ba101db6246711edaea66f7939a13638"); + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi("/api/visitor/v1/auth/result", body); + return resultStr; + } + + /** + * 人脸图片获取 + */ + @PostMapping("/hik/face/picture") + @ResponseBody + public Object facePicture() { + FaceRequest request = new FaceRequest(); +// List list = new ArrayList<>(); +// list.add(""); + request.setCertificateNum("wanggong"); + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi("/api/frs/v1/face", body); + return resultStr; + } + } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/AssetInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/AssetInfoMapper.java index 4f64e83..c0684ee 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/AssetInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/AssetInfoMapper.java @@ -17,6 +17,6 @@ @Mapper public interface AssetInfoMapper extends BaseMapper { - List getAssetInfoListPage(@Param("page") Page page, AssetInfoRequest assetInfoRequest); + List getAssetInfoListPage(@Param("page") Page page, @Param("assetInfoRequest") AssetInfoRequest assetInfoRequest); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/AttendanceInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/AttendanceInfoMapper.java index f9e793e..ec87e46 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/AttendanceInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/AttendanceInfoMapper.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.statistics.AttendanceNumberDTO; import com.casic.missiles.modular.dto.statistics.AttendanceRatioDTO; import com.casic.missiles.modular.model.AttendanceInfo; import org.apache.ibatis.annotations.Mapper; @@ -17,7 +18,7 @@ */ @Mapper public interface AttendanceInfoMapper extends BaseMapper { - List getAttendanceInfoListPage(@Param("page") Page page, StaffInfoRequest attendanceInfoRequest); + List getAttendanceInfoListPage(@Param("page") Page page, @Param("attendanceInfoRequest") StaffInfoRequest attendanceInfoRequest); AttendanceInfo selectByCodeAndDate(@Param("staffCode") String staffCode); @@ -26,4 +27,8 @@ List getCountByTypeAndDateForMonth(@Param("staffType")String staffType); List getCountByTypeAndDateForYear(@Param("staffType")String staffType); + + List getCountForWeek(); + + List getCountForDay(); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java index ce94b8f..6137a7d 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java @@ -17,5 +17,5 @@ @Mapper public interface BlackInfoMapper extends BaseMapper { - List getBlackInfoListPage(@Param("page") Page page, BlackInfoRequest blackInfoRequest); + List getBlackInfoListPage(@Param("page") Page page, @Param("blackInfoRequest") BlackInfoRequest blackInfoRequest); } 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 efda6b3..50aaa6f 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 @@ -20,7 +20,7 @@ List getCaseInfoListPage(@Param("page") Page page, @Param("caseInfoRequest") CaseInfoRequest caseInfoRequest); - int updateStatusById(CaseInfoRequest caseInfoRequest); + int updateStatusById(@Param("caseInfoRequest") CaseInfoRequest caseInfoRequest); List selectByLevelAndMonth(@Param("year") String year); @@ -47,4 +47,20 @@ List selectPreWeekCountByThirtyDay(); List selectPreDayCountBySevenDay(); + + Integer selectDemobilizedCount(@Param("eventType") Number personnelDemobilizedEvent); + + List selectPreMonthCount(); + + List selectListBySevenDay(); + + List selectListByToday(); + + List selectListByToday2(); + + List selectListByToday3(); + + List selectListByType(@Param("eventType") Number eventType); + + List selectDemobilizedCountByHour(@Param("eventType") Number eventType); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/CategoryLevelMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/CategoryLevelMapper.java index 52fc714..afe1650 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/CategoryLevelMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/CategoryLevelMapper.java @@ -17,9 +17,9 @@ @Mapper public interface CategoryLevelMapper extends BaseMapper { - List getCaseCategoryLevelListPage(@Param("page") Page page, CategoryLevelRequest categoryLevelRequest); + List getCaseCategoryLevelListPage(@Param("page") Page page, @Param("categoryLevelRequest") CategoryLevelRequest categoryLevelRequest); - List getCaseCategoryLevelList(CategoryLevelRequest categoryLevelRequest); + List getCaseCategoryLevelList(@Param("categoryLevelRequest") CategoryLevelRequest categoryLevelRequest); CaseCategoryLevel getCaseCategoryLevel(@Param("categoryLevelCode") String categoryLevelCode); 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 66353b1..2555a09 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 @@ -19,7 +19,7 @@ @Mapper public interface DeviceInfoMapper extends BaseMapper { - List getDeviceInfoListPage(@Param("page") Page page, DeviceInfoRequest deviceInfoRequest); + List getDeviceInfoListPage(@Param("page") Page page, @Param("deviceInfoRequest") DeviceInfoRequest deviceInfoRequest); List getDeviceInfoList(@Param("deviceInfoRequest") DeviceInfoRequest deviceInfoRequest); @@ -27,6 +27,8 @@ DeviceInfo getByIndexCode(@Param("srcIndex") String srcIndex); + DeviceInfo getByIp(@Param("ip") String ip); + List selectIndexCodesByCodes(@Param("deviceCodes") List deviceCodes); List selectByType(@Param("devType") String devType); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java index 41dd0af..5bfaf63 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java @@ -5,6 +5,7 @@ import com.casic.missiles.modular.dto.DeviceRepairRequest; import com.casic.missiles.modular.model.DeviceRepairLog; import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; import java.util.List; @@ -16,7 +17,7 @@ @Mapper public interface DeviceRepairLogMapper extends BaseMapper { - List getDeviceRepairListPage(Page page, DeviceRepairRequest deviceRepairRequest); + List getDeviceRepairListPage(@Param("page") Page page, @Param("deviceRepairRequest")DeviceRepairRequest deviceRepairRequest); - List getDeviceRepairList(DeviceRepairRequest deviceRepairRequest); + List getDeviceRepairList(@Param("deviceRepairRequest") DeviceRepairRequest deviceRepairRequest); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java index 9035c47..4823ac1 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java @@ -18,7 +18,7 @@ @Mapper public interface FireEquipInfoMapper extends BaseMapper { - List getFireEquipInfoListPage(@Param("page") Page page, FireEquipRequest fireEquipRequest); + List getFireEquipInfoListPage(@Param("page") Page page, @Param("fireEquipRequest") FireEquipRequest fireEquipRequest); FireEquipInfo getFireEquipInfo(@Param("equipCode") String equipCode); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/GateGroupMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/GateGroupMapper.java index d8c330d..977a427 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/GateGroupMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/GateGroupMapper.java @@ -17,7 +17,7 @@ */ @Mapper public interface GateGroupMapper extends BaseMapper { - List getGateGroupListPage(@Param("page") Page page, GateGroupRequest gateGroupRequest); + List getGateGroupListPage(@Param("page") Page page, @Param("gateGroupRequest") GateGroupRequest gateGroupRequest); GateGroup getGateGroupByName(@Param("groupName") String groupName); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/HazardLevelMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/HazardLevelMapper.java index 8957780..dcf47bb 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/HazardLevelMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/HazardLevelMapper.java @@ -17,11 +17,13 @@ @Mapper public interface HazardLevelMapper extends BaseMapper { - List getCaseHazardLevelListPage(@Param("page") Page page, HazardLevelRequest hazardLevelRequest); + List getCaseHazardLevelListPage(@Param("page") Page page, @Param("hazardLevelRequest") HazardLevelRequest hazardLevelRequest); - List getCaseHazardLevelList(HazardLevelRequest hazardLevelRequest); + List getCaseHazardLevelList(@Param("hazardLevelRequest") HazardLevelRequest hazardLevelRequest); CaseHazardLevel getCaseHazardLevel(@Param("hazardLevelCode") String hazardLevelCode); List selectHazardName(); + + String selectHazardNameByCode(@Param("hazardLevelCode") String hazardLevelCode); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/HikCaseDefineMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/HikCaseDefineMapper.java index 0dc47d1..f162fef 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/HikCaseDefineMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/HikCaseDefineMapper.java @@ -12,5 +12,5 @@ */ @Mapper public interface HikCaseDefineMapper extends BaseMapper { - HikCaseDefine getHikCaseDefine(@Param("caseTypeCode") Long caseTypeCode); + HikCaseDefine getHikCaseDefine(@Param("caseTypeCode") Number caseTypeCode); } 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 f8a674c..fe5afc2 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 @@ -17,11 +17,13 @@ @Mapper public interface StaffInfoMapper extends BaseMapper { - List getStaffInfoListPage(@Param("page") Page page, StaffInfoRequest staffInfoRequest); + List getStaffInfoListPage(@Param("page") Page page, @Param("staffInfoRequest") StaffInfoRequest staffInfoRequest); StaffInfo selectByCode(@Param("staffCode") String staffCode); - List getStaffInfoList(StaffInfoRequest staffInfoRequest); + List getStaffInfoList(@Param("staffInfoRequest") StaffInfoRequest staffInfoRequest); - List selectBatchCodes(List list); + List selectBatchCodes(@Param("list") List list); + + int updateByCodeForCard(@Param("staffCode") String staffCode, @Param("cardNo") String cardNo); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitInfoMapper.java index b1217c5..6c52542 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitInfoMapper.java @@ -16,7 +16,7 @@ */ @Mapper public interface VisitInfoMapper extends BaseMapper { - List getVisitInfoListPage(@Param("page") Page page, VisitorRequest visitorRequest); + List getVisitInfoListPage(@Param("page") Page page, @Param("visitorRequest") VisitorRequest visitorRequest); VisitInfo selectByOrderId(@Param("orderId") String orderId); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitorApplyMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitorApplyMapper.java index c09f3c0..6ea55bd 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitorApplyMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitorApplyMapper.java @@ -18,7 +18,7 @@ @Mapper public interface VisitorApplyMapper extends BaseMapper { - List getVisitorApplyListPage(@Param("page") Page page, VisitorApplyRequest visitorApplyRequest); + List getVisitorApplyListPage(@Param("page") Page page, @Param("visitorApplyRequest") VisitorApplyRequest visitorApplyRequest); List selectByVisitReason(); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/AttendanceInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/AttendanceInfoMapper.xml index b2ece71..f8bdd6e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/AttendanceInfoMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/AttendanceInfoMapper.xml @@ -43,7 +43,8 @@ and staff_type = #{staffType} - and YEARWEEK(date_format(atte_date, '%Y-%m-%d'), 1) = YEARWEEK(now(),1); + AND DATE_SUB(CURDATE(), INTERVAL 7 DAY) <= DATE(atte_date) + GROUP BY DATE_FORMAT(atte_date, '%Y-%m-%d') @@ -69,4 +70,20 @@ GROUP BY DATE_FORMAT(atte_date, '%Y-%m') + + + \ No newline at end of file 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 2b6953f..06ec0a8 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 @@ -28,7 +28,9 @@ @@ -87,7 +89,8 @@ SELECT hazard_level_code as levelCode, count(id) as quantity FROM bus_case_info WHERE hazard_level_code is not null - AND DATE_SUB(CURDATE(), INTERVAL 7 DAY) <= date(happen_time); + AND is_key_area = 1 + AND DATE_SUB(CURDATE(), INTERVAL 7 DAY) <= date(happen_time) GROUP BY hazard_level_code @@ -95,7 +98,8 @@ SELECT hazard_level_code as levelCode, count(id) as quantity FROM bus_case_info WHERE hazard_level_code is not null - AND DATE_SUB(CURDATE(), INTERVAL 30 DAY) <= date(happen_time); + AND is_key_area = 1 + AND DATE_SUB(CURDATE(), INTERVAL 30 DAY) <= date(happen_time) GROUP BY hazard_level_code @@ -122,4 +126,71 @@ AND hazard_level_code is not null GROUP BY DATE_FORMAT(happen_time,'%Y-%m-%d') + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/CategoryLevelMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/CategoryLevelMapper.xml index 4670b1f..1d25cbd 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/CategoryLevelMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/CategoryLevelMapper.xml @@ -20,11 +20,11 @@ SELECT * FROM bus_case_category_level WHERE 1=1 - - and code = #{code} + + and code = #{categoryLevelRequest.code} - - and name = #{name} + + and name = #{categoryLevelRequest.name} ORDER by create_time DESC 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 9b66fd8..bfd84b7 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 @@ -98,4 +98,10 @@ #{item} + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceRepairLogMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceRepairLogMapper.xml index 078ed3c..cf1a481 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceRepairLogMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceRepairLogMapper.xml @@ -22,14 +22,14 @@ SELECT * FROM bus_device_repair_log WHERE 1=1 - - and device_code = #{devCode} + + and device_code = #{deviceRepairRequest.devCode} - - and device_name = #{devName} + + and device_name = #{deviceRepairRequest.devName} - - and DATE_FORMAT(create_time,"%y%m%d") = DATE_FORMAT(#{createTime},"%y%m%d") + + and DATE_FORMAT(create_time,"%y%m%d") = DATE_FORMAT(#{deviceRepairRequest.createTime},"%y%m%d") ORDER by create_time DESC diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/HazardLevelMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/HazardLevelMapper.xml index f16f2b9..458322b 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/HazardLevelMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/HazardLevelMapper.xml @@ -20,11 +20,11 @@ SELECT * FROM bus_case_hazard_level WHERE 1=1 - - and code = #{code} + + and code = #{hazardLevelRequest.code} - - and name = #{name} + + and name = #{hazardLevelRequest.name} ORDER by create_time DESC @@ -42,4 +42,10 @@ SELECT name FROM bus_case_hazard_level + + \ 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 557237e..b6a183a 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 @@ -50,4 +50,10 @@ + + + UPDATE bus_staff_info + SET card_no = #{cardNo} + WHERE staff_code = #{staffCode} + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitInfoMapper.xml index 84aa84f..230529a 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitInfoMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitInfoMapper.xml @@ -27,5 +27,6 @@ SELECT * FROM bus_visit_info WHERE order_id = #{orderId} and DATE_FORMAT(in_time,'%Y-%m-%d') = CURRENT_DATE + limit 1 \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/BlackPictureRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/BlackPictureRequest.java new file mode 100644 index 0000000..fc92701 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/BlackPictureRequest.java @@ -0,0 +1,14 @@ +package com.casic.missiles.modular.dto; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/29 19:26 + */ +@Data +public class BlackPictureRequest { + private String picUri; + private String serverIndexCode; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/CancelSubscribeRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/CancelSubscribeRequest.java new file mode 100644 index 0000000..e2d390a --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/CancelSubscribeRequest.java @@ -0,0 +1,15 @@ +package com.casic.missiles.modular.dto.hik; + +import lombok.Data; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/24 15:14 + */ +@Data +public class CancelSubscribeRequest { + private List eventTypes; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/CardInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/CardInfo.java new file mode 100644 index 0000000..341457d --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/CardInfo.java @@ -0,0 +1,24 @@ +package com.casic.missiles.modular.dto.hik; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/26 16:08 + */ +@Data +public class CardInfo { + //卡号,8~20个字符,支持数字和大写字母 + private String cardNo; + //人员ID,员工工号 + private String personId; + //人员所属组织IndexCode + private String orgIndexCode; + //卡片类型,默认是1:IC卡 + //1:IC卡 + //2:CPU卡 + //3:远距离卡 + //4:MIFARE卡 + private Number cardType; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/FaceRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/FaceRequest.java new file mode 100644 index 0000000..edc04bf --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/FaceRequest.java @@ -0,0 +1,16 @@ +package com.casic.missiles.modular.dto.hik; + +import lombok.Data; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/25 16:53 + */ +@Data +public class FaceRequest { + private String certificateNum; + private List indexCodes; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/HikRecvEvent.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/HikRecvEvent.java index a3e9845..1b2b2b1 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/HikRecvEvent.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/HikRecvEvent.java @@ -28,12 +28,12 @@ /** * 事件类型,用于判断所需接收到的事件类型 */ - public Long getEventType(){ + public Number getEventType(){ JSONObject jsonObject = (JSONObject)JSONObject.toJSON(params); //事件类别对应SecurityEventTypeEnum JSONArray eventTypeArray = (JSONArray)jsonObject.get("events"); JSONObject eventJsonObject = (JSONObject)JSONObject.toJSON(eventTypeArray.get(0)); - Long eventType = (Long) eventJsonObject.get("eventType"); + Number eventType = (Number) eventJsonObject.get("eventType"); return eventType; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonBatchDeleteRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonBatchDeleteRequest.java index 027d31d..9751929 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonBatchDeleteRequest.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonBatchDeleteRequest.java @@ -12,4 +12,6 @@ @Data public class PersonBatchDeleteRequest { private List personIds; + //删除人脸接口使用 + private String faceId; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonInfoRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonInfoRequest.java new file mode 100644 index 0000000..05dc9e1 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonInfoRequest.java @@ -0,0 +1,20 @@ +package com.casic.missiles.modular.dto.hik; + +import lombok.Data; + +import java.util.List; + +/** + * @Description: 获取员工照片请求实体 + * @Author: wangpeng + * @Date: 2022/8/25 16:53 + */ +@Data +public class PersonInfoRequest { + //获取员工详细信息使用 + private String paramName; + private List paramValue; + //获取照片使用 + private String picUri; + private String serverIndexCode; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonListRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonListRequest.java new file mode 100644 index 0000000..3f7149b --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonListRequest.java @@ -0,0 +1,16 @@ +package com.casic.missiles.modular.dto.hik; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/25 16:53 + */ +@Data +public class PersonListRequest { + private Number pageNo; + private Number pageSize; + + private String orderId; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/SearchPicturesRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/SearchPicturesRequest.java new file mode 100644 index 0000000..0a95966 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/SearchPicturesRequest.java @@ -0,0 +1,24 @@ +package com.casic.missiles.modular.dto.hik; + +import lombok.Data; + +import java.util.List; + +/** + * @Description: 以图搜图请求 + * @Author: wangpeng + * @Date: 2022/8/29 10:46 + */ +@Data +public class SearchPicturesRequest { + private String facePicBinaryData; + private String facePicUrl; + private List cameraIndexCodes; + private String startTime; + private String endTime; + //指定搜图的最小相似度,最小为1,最大为100 + private String minSimilarity; + private Number age; + //male-男性,female-女性 + private String sex; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/StaffCardRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/StaffCardRequest.java new file mode 100644 index 0000000..4052e6d --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/StaffCardRequest.java @@ -0,0 +1,20 @@ +package com.casic.missiles.modular.dto.hik; + +import lombok.Data; + +import java.util.List; + +/** + * @Description: 人员开卡请求实体 + * @Author: wangpeng + * @Date: 2022/8/26 16:05 + */ +@Data +public class StaffCardRequest { + //卡片开始有效时间,时间格式:yyyy-MM-dd + private String startDate; + //卡片截止有效时间,时间格式:yyyy-MM-dd,不能大于2037年12月31日 + private String endDate; + //cardList,待开卡列表,最大支持50张卡 + private List cardList; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/VisitorInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/VisitorInfo.java index 73aa316..b99f301 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/VisitorInfo.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/VisitorInfo.java @@ -14,7 +14,7 @@ //访客性别 //1: 男 //2: 女 - private String gender; + private Integer gender; //联系电话建议填写手机号码 private String phoneNo; //证件类型 diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/ApplyReasonGroupDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/ApplyReasonGroupDTO.java index 514f382..786143e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/ApplyReasonGroupDTO.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/ApplyReasonGroupDTO.java @@ -13,4 +13,6 @@ private String visitReason; //访问人数 private Integer quantity; + //占比 + private String ratio; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/AttendanceNumberDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/AttendanceNumberDTO.java new file mode 100644 index 0000000..a494321 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/AttendanceNumberDTO.java @@ -0,0 +1,24 @@ +package com.casic.missiles.modular.dto.statistics; + +import com.fasterxml.jackson.annotation.JsonIgnore; +import lombok.Data; + +/** + * @Description: 出勤人数统计实体 + * @Author: wangpeng + * @Date: 2022/8/31 19:24 + */ +@Data +public class AttendanceNumberDTO { + //日期维度,周、今日,入参 + @JsonIgnore + private String dateDimension; + + //日期,具体天/小时,出参 + private String date; + //出勤人数 + private String quantity; + //员工类型 + private String staffType; + +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/AvgMonthAndWeekGroupDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/AvgMonthAndWeekGroupDTO.java index 4366916..331a9a9 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/AvgMonthAndWeekGroupDTO.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/AvgMonthAndWeekGroupDTO.java @@ -2,8 +2,6 @@ import lombok.Data; -import java.util.Map; - /** * @Description: 平均每月和每周的数据实体 * @Author: wangpeng @@ -13,6 +11,4 @@ public class AvgMonthAndWeekGroupDTO { //入参 private String year; - //出参,key:事件类型,value:周和月数据平均值 - private Map map; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/GateStatusGroupResponse.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/GateStatusGroupResponse.java new file mode 100644 index 0000000..d16f4e5 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/GateStatusGroupResponse.java @@ -0,0 +1,16 @@ +package com.casic.missiles.modular.dto.statistics; + +import lombok.Data; + +/** + * @Description: 闸机/摄像机统计响应实体 + * @Author: wangpeng + * @Date: 2022/8/30 14:22 + */ +@Data +public class GateStatusGroupResponse { + //设备状态 + private String status; + //占比 + private String ratio; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/MonthAndWeekDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/MonthAndWeekDTO.java index 7482b2a..284115a 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/MonthAndWeekDTO.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/MonthAndWeekDTO.java @@ -9,7 +9,7 @@ */ @Data public class MonthAndWeekDTO { -// private String levelName; + private String levelName; private Integer monthQuantity; private Integer weekQuantity; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/OnDutyRatioDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/OnDutyRatioDTO.java new file mode 100644 index 0000000..4f6a65d --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/OnDutyRatioDTO.java @@ -0,0 +1,15 @@ +package com.casic.missiles.modular.dto.statistics; + +import lombok.Data; + +/** + * @Description: 在岗率统计实体 + * @Author: wangpeng + * @Date: 2022/9/2 21:24 + */ +@Data +public class OnDutyRatioDTO { + private String date; + private String quantity; + private String ratio; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/BlackListController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/BlackListController.java index a27f9f8..0c06661 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/BlackListController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/BlackListController.java @@ -1,13 +1,18 @@ package com.casic.missiles.modular.controller; +import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.base.controller.ExportController; import com.casic.missiles.core.page.PageFactory; import com.casic.missiles.model.response.ResponseData; import com.casic.missiles.modular.dto.BlackInfoRequest; +import com.casic.missiles.modular.dto.BlackPictureRequest; +import com.casic.missiles.modular.dto.hik.PersonInfoRequest; +import com.casic.missiles.modular.enums.HikUri; import com.casic.missiles.modular.enums.OperateTypeEnum; import com.casic.missiles.modular.model.BlackInfo; import com.casic.missiles.modular.service.BlackInfoService; +import com.casic.missiles.modular.util.HikUtil; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; @@ -56,4 +61,22 @@ return null; } + /** + * 黑名单人员照片 + */ + @PostMapping("/personPicture") + @ResponseBody + public Object personPicture(@RequestBody BlackPictureRequest blackPictureRequest){ + //获取照片 + String picUri = blackPictureRequest.getPicUri(); + String serverIndexCode = blackPictureRequest.getServerIndexCode(); + PersonInfoRequest picRequest = new PersonInfoRequest(); + picRequest.setPicUri(picUri); + picRequest.setServerIndexCode(serverIndexCode); + String reBody = JSONObject.toJSONString(picRequest); + //重定向地址获取 + String url = HikUtil.hikApiFor302(HikUri.PERSON_PICTURE, reBody); + return ResponseData.success(url); + } + } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/DeviceController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/DeviceController.java index e1c4eba..666bbee 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/DeviceController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/DeviceController.java @@ -107,7 +107,7 @@ } /** - * 设备维修管理查询(分页),需计算MTTR=总维修时间/故障次数 + * 设备状态计算与评判/设备维修管理查询(分页),需计算MTTR=总维修时间/故障次数 */ @PostMapping("/repair/listPage") @ResponseBody @@ -211,7 +211,7 @@ //需根据设备编号获取到对应的门禁点唯一标识 doorControlRequest.setDoorIndexCodes(indexCodes); doorControlRequest.setControlType(Integer.valueOf(gateGroupDTO.getStatus())); - String body = JSONObject.toJSONString(deviceCodes); + String body = JSONObject.toJSONString(doorControlRequest); String resultStr = HikUtil.hikApi(HikUri.DOOR_CONTROL, body); JSONObject resultJson = (JSONObject)JSONObject.parse(resultStr); if (!"0".equals(resultJson.get("code"))) { diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/StaffController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/StaffController.java index b58ccab..704093c 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/StaffController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/StaffController.java @@ -2,15 +2,21 @@ import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.util.StrUtil; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.base.controller.ExportController; import com.casic.missiles.core.page.PageFactory; import com.casic.missiles.model.response.ErrorResponseData; import com.casic.missiles.model.response.ResponseData; import com.casic.missiles.modular.dto.StaffInfoRequest; +import com.casic.missiles.modular.dto.hik.PersonInfoRequest; +import com.casic.missiles.modular.dto.hik.StaffCardRequest; +import com.casic.missiles.modular.enums.HikUri; import com.casic.missiles.modular.enums.OperateTypeEnum; import com.casic.missiles.modular.model.StaffInfo; import com.casic.missiles.modular.service.StaffInfoService; +import com.casic.missiles.modular.util.HikUtil; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; @@ -110,4 +116,60 @@ } return ResponseData.success(); } + + /** + * 批量开卡,添加人员之后调用,若在一个接口中添加人员成功开卡失败则第二次添加时会有问题 + */ + @PostMapping("/cardBinding") + @ResponseBody + public Object cardBinding(@RequestBody StaffCardRequest staffCardRequest) { + String body = JSONObject.toJSONString(staffCardRequest); + String resultStr = HikUtil.hikApi(HikUri.CARD_BINDING, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (!"0".equals(resultJson.get("code"))) { + log.error("请求海康,批量开卡失败,海康response:{}", resultStr); + return ResponseData.error("批量开卡失败"); + } + //保存卡号 + if(staffInfoService.saveCardInfo(staffCardRequest) > 0){ + return ResponseData.success(); + } + return ResponseData.error("批量开卡失败"); + } + + /** + * 获取员工照片,海康存储 + */ + @PostMapping("/personPicture/{staffCode}") + @ResponseBody + public Object personPicture(@PathVariable("staffCode") String staffCode){ + //获取员工详细信息,含图片服务器、uri + PersonInfoRequest request = new PersonInfoRequest(); + List list = new ArrayList<>(); + list.add(staffCode); + request.setParamName("personId"); + request.setParamValue(list); + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi(HikUri.PERSON_INFO, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (!"0".equals(resultJson.get("code"))) { + log.error("请求海康,根据人员唯一字段获取人员详细信息失败,海康response:{}", resultStr); + return ResponseData.error("获取员工照片失败"); + } + //获取照片 + JSONObject data = (JSONObject) resultJson.get("data"); + JSONArray dataArray = (JSONArray) data.get("list"); + JSONObject jsonObject = (JSONObject) dataArray.get(0); + JSONArray personPhoto = (JSONArray) jsonObject.get("personPhoto"); + JSONObject photo = (JSONObject) personPhoto.get(0); + String picUri = photo.getString("picUri"); + String serverIndexCode = photo.getString("serverIndexCode"); + PersonInfoRequest picRequest = new PersonInfoRequest(); + picRequest.setPicUri(picUri); + picRequest.setServerIndexCode(serverIndexCode); + String reBody = JSONObject.toJSONString(picRequest); + //重定向地址获取 + String url = HikUtil.hikApiFor302(HikUri.PERSON_PICTURE, reBody); + return ResponseData.success(url); + } } 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 4a07dd9..7b1dcf6 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 @@ -16,6 +16,7 @@ import com.casic.missiles.modular.redis.key.CacheKeys; import com.casic.missiles.modular.service.CockpitService; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.util.CollectionUtils; import org.springframework.web.bind.annotation.*; @@ -24,10 +25,7 @@ import java.text.NumberFormat; import java.time.LocalDateTime; import java.time.temporal.ChronoUnit; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.util.*; import java.util.stream.Collectors; /** @@ -73,6 +71,9 @@ private StatisticNumberMapper numberMapper; @Autowired + private HazardLevelMapper hazardLevelMapper; + + @Autowired private AccessGroupConfig accessGroupConfig; /** @@ -104,8 +105,24 @@ public Object buildingNumberPerHour(){ //当天按小时分组的人数 List list = numberMapper.selectListByTime(); - Map> collect = list.stream().collect(Collectors.groupingBy(BuildingNumberDTO::getStatisticPosition)); - return ResponseData.success(collect); + Map> collect = list.stream().collect(Collectors.groupingBy(BuildingNumberDTO::getStatisticTime)); + //定时任务中已将每小时三栋楼人数存到数据库 + //将一期主楼和录制楼人数合并,二期单算 + List> resultList = new ArrayList<>(); + collect.keySet().forEach(key -> { + List buildingNumberDTOS = collect.get(key); + BuildingNumberDTO mainBuildingOne = buildingNumberDTOS.get(0); + BuildingNumberDTO mainBuildingTwo = buildingNumberDTOS.get(1); + BuildingNumberDTO recordingBuilding = buildingNumberDTOS.get(2); + HashMap resultMap = new HashMap<>(); + Integer oneQuantity = Integer.valueOf(mainBuildingOne.getStatisticQuantity()); + Integer recordingQuantity = Integer.valueOf(recordingBuilding.getStatisticQuantity()); + resultMap.put("staticTime", mainBuildingOne.getStatisticTime()); + resultMap.put(mainBuildingOne.getStatisticPositionName()+"、"+recordingBuilding.getStatisticPositionName(), String.valueOf(oneQuantity+recordingQuantity)); + resultMap.put(mainBuildingTwo.getStatisticPositionName(), mainBuildingTwo.getStatisticQuantity()); + resultList.add(resultMap); + }); + return ResponseData.success(resultList); } /** @@ -151,12 +168,11 @@ public Object securityNumber() { QueryWrapper wrapper = new QueryWrapper<>(); wrapper.eq("staff_type", 2); + // TODO: 2022/9/2 后续使用产品确定的每天出勤的安保人员的数量 Integer total = staffInfoMapper.selectCount(wrapper); - //当日离岗事件个数 - QueryWrapper wrapper1 = new QueryWrapper<>(); - wrapper1.eq("hik_event_type", SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); - wrapper1.apply("date_format(now(),'%Y-%m-%d') = date_format(happen_time,'%Y-%m-%d')"); - Integer leave = caseInfoMapper.selectCount(wrapper1); + //当日离岗事件按设备去重后的个数 + // TODO: 2022/9/2 目前相当于24小时内的计算,之后看需要可改成自定义小时数计算离岗率,即离岗+6小时内仅一次离岗则恢复为100%,多次则累加离岗次数计算离岗率 + Integer leave = caseInfoMapper.selectDemobilizedCount(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); NumberFormat numberFormat = NumberFormat.getInstance(); // 设置精确到小数点后2位 numberFormat.setMaximumFractionDigits(2); @@ -179,7 +195,6 @@ @ResponseBody public Object visitorApplyDetail() { List reasonGroup = applyMapper.selectByVisitReason(); - HashMap resultMap = new HashMap<>(); NumberFormat numberFormat = NumberFormat.getInstance(); // 设置精确到小数点后2位 numberFormat.setMaximumFractionDigits(2); @@ -187,12 +202,17 @@ if(0 == sum){ return ResponseData.success(); } + List resultList = new ArrayList<>(); reasonGroup.forEach(group -> { String reasonName = dictService.getDictNameByCode(SecurityEventDict.VISIT_REASON, group.getVisitReason()); String result = numberFormat.format((float) group.getQuantity() / (float) sum * 100); - resultMap.put(reasonName, result+"%"); + ApplyReasonGroupDTO applyReasonGroupDTO = new ApplyReasonGroupDTO(); + applyReasonGroupDTO.setQuantity(group.getQuantity()); + applyReasonGroupDTO.setVisitReason(reasonName); + applyReasonGroupDTO.setRatio(result+"%"); + resultList.add(applyReasonGroupDTO); }); - return ResponseData.success(resultMap); + return ResponseData.success(resultList); } /** @@ -247,6 +267,32 @@ } /** + * 机动力量实时在岗率,在岗人数除以总应在岗人数,用离岗+6小时内恢复为100%,6小时外再计算 + */ + @GetMapping("/staff/beOnDutyRatio") + @ResponseBody + public Object beOnDutyRatio() { + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("staff_type", 2); + // TODO: 2022/9/2 后续使用产品确定的每天出勤的安保人员的数量 + Integer total = staffInfoMapper.selectCount(wrapper); + if(0 == total){ + return ResponseData.success(null); + } + //当日离岗事件按设备去重后的个数 + // TODO: 2022/9/2 目前相当于24小时内的计算,之后看需要可改成自定义小时数计算离岗率,即离岗+6小时内仅一次离岗则恢复为100%,多次则累加离岗次数计算离岗率 + List onDutyRatioDTOS = caseInfoMapper.selectDemobilizedCountByHour(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); + onDutyRatioDTOS.forEach(dto -> { + NumberFormat numberFormat = NumberFormat.getInstance(); + // 设置精确到小数点后2位 + numberFormat.setMaximumFractionDigits(2); + String result = numberFormat.format(100 - Float.valueOf(dto.getQuantity()) / (float) total * 100); + dto.setRatio(result+"%"); + }); + return ResponseData.success(onDutyRatioDTOS); + } + + /** * 闸机速通门统计-设备状态分组计算数量,devType传闸机字典key * 视频频监控摄像机统计-设备状态分组计算数量,devType传摄像头字典key */ @@ -262,12 +308,17 @@ if(sum <= 0){ return ResponseData.error("无该类设备信息"); } + List resultList = new ArrayList<>(); gateStatusGroup.forEach(group -> { String devStatus = dictService.getDictNameByCode(SecurityEventDict.DEVICE_STATUS, group.getStatus()); String result = numberFormat.format((float) group.getQuantity() / (float) sum * 100); - resultMap.put(devStatus, result+"%"); + GateStatusGroupResponse gateStatusGroupResponse = new GateStatusGroupResponse(); + gateStatusGroupResponse.setStatus(devStatus); + gateStatusGroupResponse.setRatio(result+"%"); + resultList.add(gateStatusGroupResponse); }); - resultMap.put("总", sum); + resultMap.put("total", sum); + resultMap.put("list", resultList); return ResponseData.success(resultMap); } @@ -282,17 +333,38 @@ String position = securityScoreDTO.getPosition(); List caseInfos = caseInfoMapper.selectByPosition(position); //查询各危险级别权重、各类别权重,放入map,避免循环中多次查数据库 - + HashMap hazardScoreMap = new HashMap<>(); + List caseHazardLevelList = hazardLevelMapper.getCaseHazardLevelList(null); + caseHazardLevelList.forEach(hazardLevel -> { + hazardScoreMap.put(hazardLevel.getCode(), hazardLevel.getWeight()); + }); + HashMap categoryScoreMap = new HashMap<>(); + List categoryLevelList = categoryLevelMapper.getCaseCategoryLevelList(null); + categoryLevelList.forEach(categoryLevel -> { + categoryScoreMap.put(categoryLevel.getCode(), categoryLevel.getWeight()); + }); + //事件按楼层分组,计算 List securityScoreDTOs = new ArrayList<>(); caseInfos.forEach(caseInfo -> { SecurityScoreDTO securityScoreDTO1 = new SecurityScoreDTO(); + securityScoreDTO1.setPosition(caseInfo.getPosition()); securityScoreDTO1.setArea(caseInfo.getArea()); - // TODO: 2022/8/4 楼层评分计算根据产品定义调整 -// caseInfo.get -// securityScoreDTO1.setScore(); + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); + Double score = 100 - Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + securityScoreDTO1.setScore(score); + securityScoreDTOs.add(securityScoreDTO1); }); - - return null; + 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); + }); + return ResponseData.success(securityScoreDTOs); } /** @@ -303,9 +375,13 @@ public Object SecurityFrequency(@RequestBody SecurityFrequencyDTO securityFrequencyDTO) { String year = securityFrequencyDTO.getYear(); String month = securityFrequencyDTO.getMonth(); - Integer quantity = caseInfoMapper.selectCountByMonth(year, month); - securityFrequencyDTO.setQuantity(quantity); - return ResponseData.success(securityFrequencyDTO); + if(!StringUtils.isEmpty(year) && StringUtils.isEmpty(month)){ + Integer quantity = caseInfoMapper.selectCountByMonth(year, month); + securityFrequencyDTO.setQuantity(quantity); + return ResponseData.success(securityFrequencyDTO); + } + List list = caseInfoMapper.selectPreMonthCount(); + return ResponseData.success(list); } } 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 ae4d770..f4f075c 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 @@ -1,20 +1,25 @@ package com.casic.missiles.modular.controller.cockpit; +import cn.hutool.core.date.DateUnit; import cn.hutool.core.date.DateUtil; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.casic.missiles.model.response.ResponseData; -import com.casic.missiles.modular.dao.AttendanceInfoMapper; -import com.casic.missiles.modular.dao.CaseInfoMapper; -import com.casic.missiles.modular.dao.HazardLevelMapper; -import com.casic.missiles.modular.dao.StaffInfoMapper; +import com.casic.missiles.modular.dao.*; +import com.casic.missiles.modular.dto.DeviceRepairLogDTO; +import com.casic.missiles.modular.dto.DeviceRepairRequest; import com.casic.missiles.modular.dto.statistics.*; +import com.casic.missiles.modular.enums.SecurityEventType; +import com.casic.missiles.modular.model.CaseCategoryLevel; import com.casic.missiles.modular.model.CaseHazardLevel; +import com.casic.missiles.modular.model.CaseInfo; import com.casic.missiles.modular.model.StaffInfo; +import com.casic.missiles.modular.service.DeviceInfoService; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.util.CollectionUtils; import org.springframework.web.bind.annotation.*; +import java.math.BigDecimal; import java.text.NumberFormat; import java.util.*; import java.util.stream.Collectors; @@ -40,6 +45,12 @@ @Autowired private HazardLevelMapper hazardLevelMapper; + @Autowired + private CategoryLevelMapper categoryLevelMapper; + + @Autowired + private DeviceInfoService deviceInfoService; + /** * 安防事件时域频次统计,每月的每天安防事件个数(原方案) * 月维度:展示每个月的每天的数据 @@ -89,15 +100,17 @@ List monthList = caseInfoMapper.selectPreMonthCountByYear(year); Map> collect = monthList.stream().collect(Collectors.groupingBy(PreMonthOrWeekCaseDTO::getHazardLevelCode)); HashMap strAvgMap = new HashMap<>(); + List resultList = new ArrayList<>(); for (String key : collect.keySet()) { List preMonthOrWeekCaseDTOS = collect.get(key); int sum = preMonthOrWeekCaseDTOS.stream().mapToInt(PreMonthOrWeekCaseDTO::getQuantity).sum(); //若年份是本年,则使用个安防级别数量/当前月份数 //若不是本年,除数为12 MonthAndWeekDTO monthAndWeekDTO = new MonthAndWeekDTO(); + String hazardName = hazardLevelMapper.selectHazardNameByCode(key); + monthAndWeekDTO.setLevelName(hazardName); if(year.equals(String.valueOf(DateUtil.thisYear()))){ monthAndWeekDTO.setMonthQuantity(sum / DateUtil.thisMonth()); -// monthAndWeekDTO.setLevelName(); strAvgMap.put(key, monthAndWeekDTO); }else{ monthAndWeekDTO.setMonthQuantity(sum / 12); @@ -113,27 +126,37 @@ if(year.equals(String.valueOf(DateUtil.thisYear()))){ if(!Objects.isNull(strAvgMap.get(key))){ MonthAndWeekDTO monthAndWeekDTO = strAvgMap.get(key); + String hazardName = hazardLevelMapper.selectHazardNameByCode(key); + monthAndWeekDTO.setLevelName(hazardName); monthAndWeekDTO.setWeekQuantity(sum / DateUtil.thisWeekOfYear()); strAvgMap.put(key, monthAndWeekDTO); }else{ MonthAndWeekDTO monthAndWeekDTO = new MonthAndWeekDTO(); + String hazardName = hazardLevelMapper.selectHazardNameByCode(key); + monthAndWeekDTO.setLevelName(hazardName); monthAndWeekDTO.setWeekQuantity(sum / DateUtil.thisWeekOfYear()); strAvgMap.put(key, monthAndWeekDTO); } }else{ if(!Objects.isNull(strAvgMap.get(key))){ MonthAndWeekDTO monthAndWeekDTO = strAvgMap.get(key); + String hazardName = hazardLevelMapper.selectHazardNameByCode(key); + monthAndWeekDTO.setLevelName(hazardName); monthAndWeekDTO.setWeekQuantity(sum / 52); strAvgMap.put(key, monthAndWeekDTO); }else{ MonthAndWeekDTO monthAndWeekDTO = new MonthAndWeekDTO(); + String hazardName = hazardLevelMapper.selectHazardNameByCode(key); + monthAndWeekDTO.setLevelName(hazardName); monthAndWeekDTO.setWeekQuantity(sum / 52); strAvgMap.put(key, monthAndWeekDTO); } } } - avgMonthAndWeekGroupDTO.setMap(strAvgMap); - return ResponseData.success(avgMonthAndWeekGroupDTO); + strAvgMap.keySet().forEach(key -> { + resultList.add(strAvgMap.get(key)); + }); + return ResponseData.success(resultList); } /** @@ -181,12 +204,178 @@ } /** - * 员工考勤人数变化,功能待定 + * 员工考勤人数变化,统计当天(横坐标为时)及近7天(横坐标为天)的考勤人数变化,只要发生一次考勤识别,次数的基数就正常增加(没有上班下班区分) */ + @PostMapping("/staff/attendanceNumber/{dimension}") + @ResponseBody + public Object attendanceNumber(@PathVariable("dimension") String dimension) { + List attendanceNumberDTOs = null; + List> resultList = new ArrayList<>(); + if("week".equals(dimension)){ + //近7天数据按天分组统计 + attendanceNumberDTOs = attendanceInfoMapper.getCountForWeek(); + }else if("day".equals(dimension)) { + //今天数据按小时分组统计 + attendanceNumberDTOs = attendanceInfoMapper.getCountForDay(); + } + if(CollectionUtils.isEmpty(attendanceNumberDTOs)){ + return ResponseData.error("该查询条件下,无员工出勤数据!"); + } + Map> collect = attendanceNumberDTOs.stream().collect(Collectors.groupingBy(AttendanceNumberDTO::getDate)); + collect.keySet().forEach(key -> { + List attendanceNumberDTOS = collect.get(key); + AttendanceNumberDTO attendanceNumberDTO = attendanceNumberDTOS.get(0); + AttendanceNumberDTO attendanceNumberDTO2 = attendanceNumberDTOS.get(1); + Map resultMap = new HashMap<>(); + resultMap.put(attendanceNumberDTO.getStaffType(), attendanceNumberDTO.getQuantity()); + resultMap.put(attendanceNumberDTO2.getStaffType(), attendanceNumberDTO2.getQuantity()); + resultMap.put("staticTime", attendanceNumberDTO.getDate()); + resultList.add(resultMap); + }); + return ResponseData.success(resultList); + } /** - * 近30天/近一周安保人员到岗排行 + * 早晚高峰区域安防评估 */ + @PostMapping("/security/assessment/{dimension}") + @ResponseBody + public Object securityAssessment(@PathVariable("dimension") String dimension) { + //查询各危险级别权重、各类别权重,放入map,避免循环中多次查数据库 + HashMap hazardScoreMap = new HashMap<>(); + List caseHazardLevelList = hazardLevelMapper.getCaseHazardLevelList(null); + caseHazardLevelList.forEach(hazardLevel -> { + hazardScoreMap.put(hazardLevel.getCode(), hazardLevel.getWeight()); + }); + HashMap categoryScoreMap = new HashMap<>(); + List categoryLevelList = categoryLevelMapper.getCaseCategoryLevelList(null); + categoryLevelList.forEach(categoryLevel -> { + categoryScoreMap.put(categoryLevel.getCode(), categoryLevel.getWeight()); + }); + HashMap hashMap = new HashMap<>(); + if("week".equals(dimension)){ + //近7天早晚高峰数据 + List caseInfos = caseInfoMapper.selectListBySevenDay(); + //按时间(天)进行分组 + caseInfos.forEach(caseInfo -> { + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); + Double score = Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + String[] array = caseInfo.getHappenTime().split(" "); + String dayTime = array[0]; + BigDecimal preScore; + if(hashMap.containsKey(dayTime)){ + Double aDouble = hashMap.get(dayTime); + preScore = new BigDecimal(aDouble.toString()); + + }else{ + preScore = new BigDecimal("100.0"); + } + BigDecimal nowScore = new BigDecimal(score.toString()); + hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); + }); + return ResponseData.success(hashMap); + }else if("day".equals(dimension)) { + //今天数据按小时分组统计 + List caseInfos = caseInfoMapper.selectListByToday(); + caseInfos.forEach(caseInfo -> { + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); + Double score = Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + String[] array = caseInfo.getHappenTime().split(":"); + String dayTime = array[0]; + BigDecimal preScore; + if(hashMap.containsKey(dayTime)){ + Double aDouble = hashMap.get(dayTime); + preScore = new BigDecimal(aDouble.toString()); + + }else{ + preScore = new BigDecimal("100.0"); + } + BigDecimal nowScore = new BigDecimal(score.toString()); + hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); + }); + return ResponseData.success(hashMap); + } + return null; + } + + /** + * 重点区域安防事态评估,统计重点区域6:00-23:00按小时分组数据 + */ + @GetMapping("/security/keyAreaStatistic") + @ResponseBody + public Object keyAreaStatistic() { + //查询各危险级别权重、各类别权重,放入map,避免循环中多次查数据库 + HashMap hazardScoreMap = new HashMap<>(); + List caseHazardLevelList = hazardLevelMapper.getCaseHazardLevelList(null); + caseHazardLevelList.forEach(hazardLevel -> { + hazardScoreMap.put(hazardLevel.getCode(), hazardLevel.getWeight()); + }); + HashMap categoryScoreMap = new HashMap<>(); + List categoryLevelList = categoryLevelMapper.getCaseCategoryLevelList(null); + categoryLevelList.forEach(categoryLevel -> { + categoryScoreMap.put(categoryLevel.getCode(), categoryLevel.getWeight()); + }); + HashMap hashMap = new HashMap<>(); + //今天数据按小时分组统计 + List caseInfos = caseInfoMapper.selectListByToday2(); + caseInfos.forEach(caseInfo -> { + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); + Double score = Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + String[] array = caseInfo.getHappenTime().split(":"); + String dayTime = array[0]; + BigDecimal preScore; + if(hashMap.containsKey(dayTime)){ + Double aDouble = hashMap.get(dayTime); + preScore = new BigDecimal(aDouble.toString()); + + }else{ + preScore = new BigDecimal("100.0"); + } + BigDecimal nowScore = new BigDecimal(score.toString()); + hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); + }); + return ResponseData.success(hashMap); + } + + /** + * 安防机动支援力量调配响应评估,根据事件已解决状态及已解决时间-发送时间,按时间(小时)分组统计 + */ + @GetMapping("/security/responseAssess") + @ResponseBody + public Object responseAssess() { + //查询各危险级别权重、各类别权重,放入map,避免循环中多次查数据库 + HashMap hazardScoreMap = new HashMap<>(); + List caseHazardLevelList = hazardLevelMapper.getCaseHazardLevelList(null); + caseHazardLevelList.forEach(hazardLevel -> { + hazardScoreMap.put(hazardLevel.getCode(), hazardLevel.getWeight()); + }); + HashMap hashMap = new HashMap<>(); + //今天数据按小时分组统计 + List caseInfos = caseInfoMapper.selectListByToday3(); + caseInfos.forEach(caseInfo -> { + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + //扣分=事件级别权重*未解决小时数 + Date updateTime = DateUtil.parse(caseInfo.getUpdateTime()); + Date happenTime = DateUtil.parse(caseInfo.getHappenTime()); + long between = DateUtil.between(updateTime, happenTime, DateUnit.HOUR); + Double score = Double.valueOf(hazardWeight)*between; + String[] array = caseInfo.getHappenTime().split(":"); + String dayTime = array[0]; + BigDecimal preScore; + if(hashMap.containsKey(dayTime)){ + Double aDouble = hashMap.get(dayTime); + preScore = new BigDecimal(aDouble.toString()); + }else{ + preScore = new BigDecimal("100.0"); + } + BigDecimal nowScore = new BigDecimal(score.toString()); + hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); + }); + return ResponseData.success(hashMap); + } /** * 重点区域威胁事件类型统计,优先级2,统计近7天和近30天 @@ -224,7 +413,34 @@ } /** - * 设备状态计算系数和评判,优先级3,需确认设备恢复时间是否可以获取 + * 近30天/近一周安保人员到岗排行 */ + + /** + * 安保等级评估,发生离岗事件减1分 + */ + @GetMapping("/security/levelAssess") + @ResponseBody + public Object securityLevelAssess() { + //今天数据按小时分组统计 + List resultList = caseInfoMapper.selectListByType(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); + resultList.forEach(result -> { + BigDecimal deScore = new BigDecimal(result.getQuantity()); + BigDecimal preScore = new BigDecimal("100.0"); + result.setScore(preScore.subtract(deScore).doubleValue()); + }); + return ResponseData.success(resultList); + } + + /** + * 设备状态计算系数和评判,即设备维修管理查询(不分页) + */ + @PostMapping("/device/repairList") + @ResponseBody + public Object repairList(@RequestBody DeviceRepairRequest deviceRepairRequest) { + List deviceRepairLogDTOS = deviceInfoService.deviceRepairListPage(deviceRepairRequest); + return ResponseData.success(deviceRepairLogDTOS); + } + } 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 fbf8ab6..c71a15a 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 @@ -1,13 +1,12 @@ package com.casic.missiles.modular.controller.hik; +import cn.hutool.core.date.DateTime; +import cn.hutool.core.date.DateUtil; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.casic.missiles.model.response.ResponseData; import com.casic.missiles.modular.dao.HikFaceGroupInfoMapper; -import com.casic.missiles.modular.dto.hik.EventSubscribeRequest; -import com.casic.missiles.modular.dto.hik.FaceGroupAdditionRequest; -import com.casic.missiles.modular.dto.hik.HikRecvEvent; -import com.casic.missiles.modular.dto.hik.OrgBatchAdd; +import com.casic.missiles.modular.dto.hik.*; import com.casic.missiles.modular.enums.HikUri; import com.casic.missiles.modular.enums.SecurityEventType; import com.casic.missiles.modular.model.CaseInfo; @@ -18,16 +17,20 @@ import com.casic.missiles.modular.util.CaseInfoFactoryUtil; import com.casic.missiles.modular.util.HikUtil; import com.casic.missiles.modular.util.ThreadPoolUtil; +import com.casic.missiles.modular.util.WebSocket; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; -import org.springframework.web.bind.annotation.*; +import org.springframework.util.CollectionUtils; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.RestController; -import java.net.InetAddress; -import java.net.UnknownHostException; import java.util.ArrayList; +import java.util.Iterator; import java.util.List; import java.util.Objects; @@ -38,7 +41,6 @@ */ @Slf4j @RestController -@RequestMapping("/hik") public class HikController { @Autowired @@ -53,28 +55,37 @@ @Autowired private HikService hikService; + @Autowired + private HikFaceGroupInfoMapper hikFaceGroupInfoMapper; + + @Autowired + private WebSocket webSocket; + @Value("${server.port}") private int serverPort; - @Autowired - private HikFaceGroupInfoMapper hikFaceGroupInfoMapper; /** * 海康事件订阅 */ - @PostMapping("/event/subscribe") + @PostMapping("/hik/event/subscribe") @ResponseBody - public Object eventSubscribe() throws UnknownHostException { + public Object eventSubscribe() { EventSubscribeRequest eventSubscribeRequest = new EventSubscribeRequest(); ArrayList list = new ArrayList<>(); list.add(SecurityEventType.DEVICE_OFFLINE); + list.add(SecurityEventType.DEVICE_ONLINE); list.add(SecurityEventType.KEY_PERSONNEL_IDENTIFY_EVENT); list.add(SecurityEventType.MONITORING_POINT_OFFLINE); + list.add(SecurityEventType.MONITORING_POINT_ONLINE); list.add(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); list.add(SecurityEventType.PERSONNEL_GATHER_EVENT); - InetAddress localHost = InetAddress.getLocalHost(); + list.add(SecurityEventType.VISITOR_REGISTER); + list.add(SecurityEventType.VISITOR_CHECKOUT); + list.add(SecurityEventType.HIGH_ALTITUDE_PARABOLIC); +// InetAddress localHost = InetAddress.getLocalHost(); eventSubscribeRequest.setEventTypes(list); - eventSubscribeRequest.setEventDest("https://" + localHost + ":" + serverPort + "/eventRcv"); + eventSubscribeRequest.setEventDest("http://" + "192.168.10.6" + ":" + serverPort + "/eventRcv"); //订阅类型,0-订阅原始事件,1-联动事件,2-原始事件和联动事件,不填使用默认值0 eventSubscribeRequest.setSubType(0); /** @@ -92,19 +103,25 @@ } /** + * 查询事件订阅信息 + */ + @PostMapping("/hik/event/query") + @ResponseBody + public Object eventQuery() { + String result = HikUtil.hikApi(HikUri.EVENT_INFO, ""); + return result; + } + + /** * 海康事件接收 */ @PostMapping("/eventRcv") @ResponseBody public Object eventRcv(@RequestBody HikRecvEvent hikRecvEvent) { //1、接收所需事件类型 - Long eventType = hikRecvEvent.getEventType(); + Number eventType = hikRecvEvent.getEventType(); log.info("接收到安防事件类型为:{}", eventType); CaseInfo caseInfo = caseInfoFactoryUtil.getCaseInfo(eventType); - //接收到不关心事件直接返回 - if(Objects.isNull(caseInfo)){ - return ResponseData.success(); - } //2、不同事件不同处理,caseInfoFactoryUtil已设置好事件基础定义信息 // 再为事件添加状态、设备编码、设备名称、位置、区域、时间 // 异步处理事件 @@ -114,19 +131,23 @@ caseHandle(hikRecvEvent, eventType, caseInfo); } })); +// caseHandle(hikRecvEvent, eventType, caseInfo); - return null; + return ResponseData.success(); } - private void caseHandle(HikRecvEvent hikRecvEvent, Long eventType, CaseInfo caseInfo) { + private void caseHandle(HikRecvEvent hikRecvEvent, Number eventType, CaseInfo caseInfo) { JSONArray eventArray = hikRecvEvent.getEventArray(); List caseInfos = new ArrayList<>(); - while (eventArray.stream().iterator().hasNext()) { + Iterator iterator = eventArray.iterator(); + while (iterator.hasNext()) { CaseInfo caseInfo1 = new CaseInfo(); - BeanUtils.copyProperties(caseInfo, caseInfo1); - JSONObject event = (JSONObject) eventArray.stream().iterator().next(); + if(!Objects.isNull(caseInfo)){ + BeanUtils.copyProperties(caseInfo, caseInfo1); + } + JSONObject event = (JSONObject) iterator.next(); //5种事件进行不同处理 - if(SecurityEventType.KEY_PERSONNEL_IDENTIFY_EVENT == eventType){ + if (SecurityEventType.KEY_PERSONNEL_IDENTIFY_EVENT.equals(eventType)) { //判断所属人脸分组 JSONObject data = (JSONObject) event.get("data"); JSONObject faceRecognitionResult = (JSONObject) data.get("faceRecognitionResult"); @@ -142,52 +163,101 @@ if (faceGroupCode.equals(blackListGroup.getFaceGroupCode())) { //黑名单分组处理 caseInfo1 = hikService.blackListHandle(event, caseInfo1); - }else if(faceGroupCode.equals(propertyPersonnelGroup.getFaceGroupCode())){ + } else if (faceGroupCode.equals(propertyPersonnelGroup.getFaceGroupCode())) { //考勤分组处理-物业人员,添加到考勤表 hikService.propertyAttendanceHandle(event); - }else if(faceGroupCode.equals(securityPersonnelGroup.getFaceGroupCode())){ + } else if (faceGroupCode.equals(securityPersonnelGroup.getFaceGroupCode())) { //考勤分组处理-安保人员,添加到考勤表 hikService.securityPersonnelHandle(event); - }else { + } else { return; } - }else if(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT == eventType){ + } else if (SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT.equals(eventType)) { //离岗事件处理 caseInfo1 = hikService.demobilizedHandle(event, caseInfo1); - }else if(SecurityEventType.PERSONNEL_GATHER_EVENT == eventType){ + } else if (SecurityEventType.PERSONNEL_GATHER_EVENT.equals(eventType)) { //人员聚集事件处理 caseInfo1 = hikService.personGatherHandle(event, caseInfo1); - }else if(SecurityEventType.MONITORING_POINT_OFFLINE == eventType){ + } else if (SecurityEventType.MONITORING_POINT_OFFLINE.equals(eventType)) { //监控点离线事件处理 caseInfo1 = hikService.monitorPointOfflineHandle(event, caseInfo1); - }else if(SecurityEventType.DEVICE_OFFLINE == eventType){ + } else if (SecurityEventType.MONITORING_POINT_ONLINE.equals(eventType)) { + //监控点上线事件处理 + hikService.monitorPointOnlineHandle(event); + } else if (SecurityEventType.DEVICE_OFFLINE.equals(eventType)) { //装置离线事件处理 caseInfo1 = hikService.deviceOfflineHandle(event, caseInfo1); - }else if(SecurityEventType.VISITOR_REGISTER == eventType){ + } else if (SecurityEventType.DEVICE_ONLINE.equals(eventType)) { + //装置上线处理 + hikService.deviceOnlineHandle(event); + } else if (SecurityEventType.VISITOR_REGISTER.equals(eventType)) { //记录访客登记记录,添加到访客记录表 hikService.visitorRegisterHandler(event); - }else if(SecurityEventType.VISITOR_CHECKOUT == eventType){ + } else if (SecurityEventType.VISITOR_CHECKOUT.equals(eventType)) { //记录访客签离记录 hikService.visitorCheckOutHandler(event); } - if(!Objects.isNull(caseInfo1) && !StringUtils.isEmpty(caseInfo1.getHappenTime())){ + if (!Objects.isNull(caseInfo1) && !StringUtils.isEmpty(caseInfo1.getHappenTime())) { caseInfos.add(caseInfo1); } } //3、安防事件入库 - if(!caseInfoService.insertCaseInfoBatch(caseInfos)){ - log.error("安防事件批量入库异常"); + if (!CollectionUtils.isEmpty(caseInfos) && !caseInfoService.insertCaseInfoBatch(caseInfos)) { + log.error("安防事件批量入库异常!"); } // TODO: 2022/8/15 webSocket推送 + if (CollectionUtils.isEmpty(caseInfos)) { + log.info("webSocket事件推送"); + webSocket.sendAllMessage(JSONObject.toJSONString(caseInfos)); + } return; } /** + * 以图搜图,前端用于轨迹追踪 + */ + @PostMapping("/hik/search/picture") + @ResponseBody + public Object searchPictures(@RequestBody SearchPicturesRequest searchPicturesRequest) { + DateTime startDateTime = DateUtil.parse(searchPicturesRequest.getStartTime()); + DateTime endDateTime = DateUtil.parse(searchPicturesRequest.getEndTime()); + String startTime = DateUtil.format(startDateTime, "yyyy-MM-dd'T'HH:mm:ss.SSSXXX"); + String endTime = DateUtil.format(endDateTime, "yyyy-MM-dd'T'HH:mm:ss.SSSXXX"); + searchPicturesRequest.setStartTime(startTime); + searchPicturesRequest.setEndTime(endTime); + String body = JSONObject.toJSONString(searchPicturesRequest); + String resultStr = HikUtil.hikApi(HikUri.SEARCH_PICTURES, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (!"0".equals(resultJson.get("code"))) { + log.error("请求海康,以图搜图失败,海康response:{}", resultStr); + return ResponseData.error("以图搜图失败"); + } + return ResponseData.success(resultJson); + } + + + /** + * 海康事件取消订阅 + */ + @PostMapping("/hik/event/cancel") + @ResponseBody + public Object eventCancelSubscribe(@RequestBody CancelSubscribeRequest cancelSubscribeRequest) { + String body = JSONObject.toJSONString(cancelSubscribeRequest); + String resultStr = HikUtil.hikApi(HikUri.EVENT_CANCEL, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (!"0".equals(resultJson.get("code"))) { + log.error("请求海康,取消订阅失败,海康response:{}", resultStr); + return ResponseData.error("取消订阅失败"); + } + return ResponseData.success(resultJson); + } + + /** * 单个添加海康人脸分组 * api->hik单个添加人脸分组api->response->mysql */ - @PostMapping("/faceGroup/single/add") + @PostMapping("/hik/faceGroup/single/add") @ResponseBody public Object faceGroupAddition(@RequestBody FaceGroupAdditionRequest faceGroupAdditionRequest) { String body = JSONObject.toJSONString(faceGroupAdditionRequest); @@ -212,7 +282,7 @@ * 批量添加海康组织 * api->hik批量添加组织api->response */ - @PostMapping("/org/batch/add") + @PostMapping("/hik/org/batch/add") @ResponseBody public Object orgBatchAdd(@RequestBody List orgBatchAddRequest) { String body = JSONObject.toJSONString(orgBatchAddRequest); @@ -232,4 +302,62 @@ return ResponseData.error("批量添加组织失败"); } + /** + * 获取人员列表 + */ + @PostMapping("/hik/person/personList") + @ResponseBody + public Object personList() { + PersonListRequest request = new PersonListRequest(); + request.setPageNo(1); + request.setPageSize(100); + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi("/api/resource/v2/person/personList", body); + return resultStr; + } + + /** + * 获取组织列表 + */ + @PostMapping("/hik/org/orgList") + @ResponseBody + public Object orgList() { + PersonListRequest request = new PersonListRequest(); + request.setPageNo(1); + request.setPageSize(100); + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi("/api/resource/v1/org/orgList", body); + return resultStr; + } + + /** + * 查询访客权限下载记录 + */ + @PostMapping("/hik/auth/result") + @ResponseBody + public Object authResult() { + PersonListRequest request = new PersonListRequest(); + request.setPageNo(1); + request.setPageSize(100); + request.setOrderId("ba101db6246711edaea66f7939a13638"); + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi("/api/visitor/v1/auth/result", body); + return resultStr; + } + + /** + * 人脸图片获取 + */ + @PostMapping("/hik/face/picture") + @ResponseBody + public Object facePicture() { + FaceRequest request = new FaceRequest(); +// List list = new ArrayList<>(); +// list.add(""); + request.setCertificateNum("wanggong"); + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi("/api/frs/v1/face", body); + return resultStr; + } + } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/AssetInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/AssetInfoMapper.java index 4f64e83..c0684ee 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/AssetInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/AssetInfoMapper.java @@ -17,6 +17,6 @@ @Mapper public interface AssetInfoMapper extends BaseMapper { - List getAssetInfoListPage(@Param("page") Page page, AssetInfoRequest assetInfoRequest); + List getAssetInfoListPage(@Param("page") Page page, @Param("assetInfoRequest") AssetInfoRequest assetInfoRequest); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/AttendanceInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/AttendanceInfoMapper.java index f9e793e..ec87e46 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/AttendanceInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/AttendanceInfoMapper.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.statistics.AttendanceNumberDTO; import com.casic.missiles.modular.dto.statistics.AttendanceRatioDTO; import com.casic.missiles.modular.model.AttendanceInfo; import org.apache.ibatis.annotations.Mapper; @@ -17,7 +18,7 @@ */ @Mapper public interface AttendanceInfoMapper extends BaseMapper { - List getAttendanceInfoListPage(@Param("page") Page page, StaffInfoRequest attendanceInfoRequest); + List getAttendanceInfoListPage(@Param("page") Page page, @Param("attendanceInfoRequest") StaffInfoRequest attendanceInfoRequest); AttendanceInfo selectByCodeAndDate(@Param("staffCode") String staffCode); @@ -26,4 +27,8 @@ List getCountByTypeAndDateForMonth(@Param("staffType")String staffType); List getCountByTypeAndDateForYear(@Param("staffType")String staffType); + + List getCountForWeek(); + + List getCountForDay(); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java index ce94b8f..6137a7d 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java @@ -17,5 +17,5 @@ @Mapper public interface BlackInfoMapper extends BaseMapper { - List getBlackInfoListPage(@Param("page") Page page, BlackInfoRequest blackInfoRequest); + List getBlackInfoListPage(@Param("page") Page page, @Param("blackInfoRequest") BlackInfoRequest blackInfoRequest); } 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 efda6b3..50aaa6f 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 @@ -20,7 +20,7 @@ List getCaseInfoListPage(@Param("page") Page page, @Param("caseInfoRequest") CaseInfoRequest caseInfoRequest); - int updateStatusById(CaseInfoRequest caseInfoRequest); + int updateStatusById(@Param("caseInfoRequest") CaseInfoRequest caseInfoRequest); List selectByLevelAndMonth(@Param("year") String year); @@ -47,4 +47,20 @@ List selectPreWeekCountByThirtyDay(); List selectPreDayCountBySevenDay(); + + Integer selectDemobilizedCount(@Param("eventType") Number personnelDemobilizedEvent); + + List selectPreMonthCount(); + + List selectListBySevenDay(); + + List selectListByToday(); + + List selectListByToday2(); + + List selectListByToday3(); + + List selectListByType(@Param("eventType") Number eventType); + + List selectDemobilizedCountByHour(@Param("eventType") Number eventType); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/CategoryLevelMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/CategoryLevelMapper.java index 52fc714..afe1650 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/CategoryLevelMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/CategoryLevelMapper.java @@ -17,9 +17,9 @@ @Mapper public interface CategoryLevelMapper extends BaseMapper { - List getCaseCategoryLevelListPage(@Param("page") Page page, CategoryLevelRequest categoryLevelRequest); + List getCaseCategoryLevelListPage(@Param("page") Page page, @Param("categoryLevelRequest") CategoryLevelRequest categoryLevelRequest); - List getCaseCategoryLevelList(CategoryLevelRequest categoryLevelRequest); + List getCaseCategoryLevelList(@Param("categoryLevelRequest") CategoryLevelRequest categoryLevelRequest); CaseCategoryLevel getCaseCategoryLevel(@Param("categoryLevelCode") String categoryLevelCode); 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 66353b1..2555a09 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 @@ -19,7 +19,7 @@ @Mapper public interface DeviceInfoMapper extends BaseMapper { - List getDeviceInfoListPage(@Param("page") Page page, DeviceInfoRequest deviceInfoRequest); + List getDeviceInfoListPage(@Param("page") Page page, @Param("deviceInfoRequest") DeviceInfoRequest deviceInfoRequest); List getDeviceInfoList(@Param("deviceInfoRequest") DeviceInfoRequest deviceInfoRequest); @@ -27,6 +27,8 @@ DeviceInfo getByIndexCode(@Param("srcIndex") String srcIndex); + DeviceInfo getByIp(@Param("ip") String ip); + List selectIndexCodesByCodes(@Param("deviceCodes") List deviceCodes); List selectByType(@Param("devType") String devType); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java index 41dd0af..5bfaf63 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java @@ -5,6 +5,7 @@ import com.casic.missiles.modular.dto.DeviceRepairRequest; import com.casic.missiles.modular.model.DeviceRepairLog; import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; import java.util.List; @@ -16,7 +17,7 @@ @Mapper public interface DeviceRepairLogMapper extends BaseMapper { - List getDeviceRepairListPage(Page page, DeviceRepairRequest deviceRepairRequest); + List getDeviceRepairListPage(@Param("page") Page page, @Param("deviceRepairRequest")DeviceRepairRequest deviceRepairRequest); - List getDeviceRepairList(DeviceRepairRequest deviceRepairRequest); + List getDeviceRepairList(@Param("deviceRepairRequest") DeviceRepairRequest deviceRepairRequest); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java index 9035c47..4823ac1 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java @@ -18,7 +18,7 @@ @Mapper public interface FireEquipInfoMapper extends BaseMapper { - List getFireEquipInfoListPage(@Param("page") Page page, FireEquipRequest fireEquipRequest); + List getFireEquipInfoListPage(@Param("page") Page page, @Param("fireEquipRequest") FireEquipRequest fireEquipRequest); FireEquipInfo getFireEquipInfo(@Param("equipCode") String equipCode); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/GateGroupMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/GateGroupMapper.java index d8c330d..977a427 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/GateGroupMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/GateGroupMapper.java @@ -17,7 +17,7 @@ */ @Mapper public interface GateGroupMapper extends BaseMapper { - List getGateGroupListPage(@Param("page") Page page, GateGroupRequest gateGroupRequest); + List getGateGroupListPage(@Param("page") Page page, @Param("gateGroupRequest") GateGroupRequest gateGroupRequest); GateGroup getGateGroupByName(@Param("groupName") String groupName); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/HazardLevelMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/HazardLevelMapper.java index 8957780..dcf47bb 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/HazardLevelMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/HazardLevelMapper.java @@ -17,11 +17,13 @@ @Mapper public interface HazardLevelMapper extends BaseMapper { - List getCaseHazardLevelListPage(@Param("page") Page page, HazardLevelRequest hazardLevelRequest); + List getCaseHazardLevelListPage(@Param("page") Page page, @Param("hazardLevelRequest") HazardLevelRequest hazardLevelRequest); - List getCaseHazardLevelList(HazardLevelRequest hazardLevelRequest); + List getCaseHazardLevelList(@Param("hazardLevelRequest") HazardLevelRequest hazardLevelRequest); CaseHazardLevel getCaseHazardLevel(@Param("hazardLevelCode") String hazardLevelCode); List selectHazardName(); + + String selectHazardNameByCode(@Param("hazardLevelCode") String hazardLevelCode); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/HikCaseDefineMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/HikCaseDefineMapper.java index 0dc47d1..f162fef 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/HikCaseDefineMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/HikCaseDefineMapper.java @@ -12,5 +12,5 @@ */ @Mapper public interface HikCaseDefineMapper extends BaseMapper { - HikCaseDefine getHikCaseDefine(@Param("caseTypeCode") Long caseTypeCode); + HikCaseDefine getHikCaseDefine(@Param("caseTypeCode") Number caseTypeCode); } 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 f8a674c..fe5afc2 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 @@ -17,11 +17,13 @@ @Mapper public interface StaffInfoMapper extends BaseMapper { - List getStaffInfoListPage(@Param("page") Page page, StaffInfoRequest staffInfoRequest); + List getStaffInfoListPage(@Param("page") Page page, @Param("staffInfoRequest") StaffInfoRequest staffInfoRequest); StaffInfo selectByCode(@Param("staffCode") String staffCode); - List getStaffInfoList(StaffInfoRequest staffInfoRequest); + List getStaffInfoList(@Param("staffInfoRequest") StaffInfoRequest staffInfoRequest); - List selectBatchCodes(List list); + List selectBatchCodes(@Param("list") List list); + + int updateByCodeForCard(@Param("staffCode") String staffCode, @Param("cardNo") String cardNo); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitInfoMapper.java index b1217c5..6c52542 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitInfoMapper.java @@ -16,7 +16,7 @@ */ @Mapper public interface VisitInfoMapper extends BaseMapper { - List getVisitInfoListPage(@Param("page") Page page, VisitorRequest visitorRequest); + List getVisitInfoListPage(@Param("page") Page page, @Param("visitorRequest") VisitorRequest visitorRequest); VisitInfo selectByOrderId(@Param("orderId") String orderId); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitorApplyMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitorApplyMapper.java index c09f3c0..6ea55bd 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitorApplyMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitorApplyMapper.java @@ -18,7 +18,7 @@ @Mapper public interface VisitorApplyMapper extends BaseMapper { - List getVisitorApplyListPage(@Param("page") Page page, VisitorApplyRequest visitorApplyRequest); + List getVisitorApplyListPage(@Param("page") Page page, @Param("visitorApplyRequest") VisitorApplyRequest visitorApplyRequest); List selectByVisitReason(); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/AttendanceInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/AttendanceInfoMapper.xml index b2ece71..f8bdd6e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/AttendanceInfoMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/AttendanceInfoMapper.xml @@ -43,7 +43,8 @@ and staff_type = #{staffType} - and YEARWEEK(date_format(atte_date, '%Y-%m-%d'), 1) = YEARWEEK(now(),1); + AND DATE_SUB(CURDATE(), INTERVAL 7 DAY) <= DATE(atte_date) + GROUP BY DATE_FORMAT(atte_date, '%Y-%m-%d') @@ -69,4 +70,20 @@ GROUP BY DATE_FORMAT(atte_date, '%Y-%m') + + + \ No newline at end of file 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 2b6953f..06ec0a8 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 @@ -28,7 +28,9 @@ @@ -87,7 +89,8 @@ SELECT hazard_level_code as levelCode, count(id) as quantity FROM bus_case_info WHERE hazard_level_code is not null - AND DATE_SUB(CURDATE(), INTERVAL 7 DAY) <= date(happen_time); + AND is_key_area = 1 + AND DATE_SUB(CURDATE(), INTERVAL 7 DAY) <= date(happen_time) GROUP BY hazard_level_code @@ -95,7 +98,8 @@ SELECT hazard_level_code as levelCode, count(id) as quantity FROM bus_case_info WHERE hazard_level_code is not null - AND DATE_SUB(CURDATE(), INTERVAL 30 DAY) <= date(happen_time); + AND is_key_area = 1 + AND DATE_SUB(CURDATE(), INTERVAL 30 DAY) <= date(happen_time) GROUP BY hazard_level_code @@ -122,4 +126,71 @@ AND hazard_level_code is not null GROUP BY DATE_FORMAT(happen_time,'%Y-%m-%d') + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/CategoryLevelMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/CategoryLevelMapper.xml index 4670b1f..1d25cbd 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/CategoryLevelMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/CategoryLevelMapper.xml @@ -20,11 +20,11 @@ SELECT * FROM bus_case_category_level WHERE 1=1 - - and code = #{code} + + and code = #{categoryLevelRequest.code} - - and name = #{name} + + and name = #{categoryLevelRequest.name} ORDER by create_time DESC 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 9b66fd8..bfd84b7 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 @@ -98,4 +98,10 @@ #{item} + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceRepairLogMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceRepairLogMapper.xml index 078ed3c..cf1a481 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceRepairLogMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceRepairLogMapper.xml @@ -22,14 +22,14 @@ SELECT * FROM bus_device_repair_log WHERE 1=1 - - and device_code = #{devCode} + + and device_code = #{deviceRepairRequest.devCode} - - and device_name = #{devName} + + and device_name = #{deviceRepairRequest.devName} - - and DATE_FORMAT(create_time,"%y%m%d") = DATE_FORMAT(#{createTime},"%y%m%d") + + and DATE_FORMAT(create_time,"%y%m%d") = DATE_FORMAT(#{deviceRepairRequest.createTime},"%y%m%d") ORDER by create_time DESC diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/HazardLevelMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/HazardLevelMapper.xml index f16f2b9..458322b 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/HazardLevelMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/HazardLevelMapper.xml @@ -20,11 +20,11 @@ SELECT * FROM bus_case_hazard_level WHERE 1=1 - - and code = #{code} + + and code = #{hazardLevelRequest.code} - - and name = #{name} + + and name = #{hazardLevelRequest.name} ORDER by create_time DESC @@ -42,4 +42,10 @@ SELECT name FROM bus_case_hazard_level + + \ 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 557237e..b6a183a 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 @@ -50,4 +50,10 @@ + + + UPDATE bus_staff_info + SET card_no = #{cardNo} + WHERE staff_code = #{staffCode} + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitInfoMapper.xml index 84aa84f..230529a 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitInfoMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitInfoMapper.xml @@ -27,5 +27,6 @@ SELECT * FROM bus_visit_info WHERE order_id = #{orderId} and DATE_FORMAT(in_time,'%Y-%m-%d') = CURRENT_DATE + limit 1 \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/BlackPictureRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/BlackPictureRequest.java new file mode 100644 index 0000000..fc92701 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/BlackPictureRequest.java @@ -0,0 +1,14 @@ +package com.casic.missiles.modular.dto; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/29 19:26 + */ +@Data +public class BlackPictureRequest { + private String picUri; + private String serverIndexCode; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/CancelSubscribeRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/CancelSubscribeRequest.java new file mode 100644 index 0000000..e2d390a --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/CancelSubscribeRequest.java @@ -0,0 +1,15 @@ +package com.casic.missiles.modular.dto.hik; + +import lombok.Data; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/24 15:14 + */ +@Data +public class CancelSubscribeRequest { + private List eventTypes; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/CardInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/CardInfo.java new file mode 100644 index 0000000..341457d --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/CardInfo.java @@ -0,0 +1,24 @@ +package com.casic.missiles.modular.dto.hik; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/26 16:08 + */ +@Data +public class CardInfo { + //卡号,8~20个字符,支持数字和大写字母 + private String cardNo; + //人员ID,员工工号 + private String personId; + //人员所属组织IndexCode + private String orgIndexCode; + //卡片类型,默认是1:IC卡 + //1:IC卡 + //2:CPU卡 + //3:远距离卡 + //4:MIFARE卡 + private Number cardType; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/FaceRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/FaceRequest.java new file mode 100644 index 0000000..edc04bf --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/FaceRequest.java @@ -0,0 +1,16 @@ +package com.casic.missiles.modular.dto.hik; + +import lombok.Data; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/25 16:53 + */ +@Data +public class FaceRequest { + private String certificateNum; + private List indexCodes; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/HikRecvEvent.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/HikRecvEvent.java index a3e9845..1b2b2b1 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/HikRecvEvent.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/HikRecvEvent.java @@ -28,12 +28,12 @@ /** * 事件类型,用于判断所需接收到的事件类型 */ - public Long getEventType(){ + public Number getEventType(){ JSONObject jsonObject = (JSONObject)JSONObject.toJSON(params); //事件类别对应SecurityEventTypeEnum JSONArray eventTypeArray = (JSONArray)jsonObject.get("events"); JSONObject eventJsonObject = (JSONObject)JSONObject.toJSON(eventTypeArray.get(0)); - Long eventType = (Long) eventJsonObject.get("eventType"); + Number eventType = (Number) eventJsonObject.get("eventType"); return eventType; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonBatchDeleteRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonBatchDeleteRequest.java index 027d31d..9751929 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonBatchDeleteRequest.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonBatchDeleteRequest.java @@ -12,4 +12,6 @@ @Data public class PersonBatchDeleteRequest { private List personIds; + //删除人脸接口使用 + private String faceId; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonInfoRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonInfoRequest.java new file mode 100644 index 0000000..05dc9e1 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonInfoRequest.java @@ -0,0 +1,20 @@ +package com.casic.missiles.modular.dto.hik; + +import lombok.Data; + +import java.util.List; + +/** + * @Description: 获取员工照片请求实体 + * @Author: wangpeng + * @Date: 2022/8/25 16:53 + */ +@Data +public class PersonInfoRequest { + //获取员工详细信息使用 + private String paramName; + private List paramValue; + //获取照片使用 + private String picUri; + private String serverIndexCode; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonListRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonListRequest.java new file mode 100644 index 0000000..3f7149b --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonListRequest.java @@ -0,0 +1,16 @@ +package com.casic.missiles.modular.dto.hik; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/25 16:53 + */ +@Data +public class PersonListRequest { + private Number pageNo; + private Number pageSize; + + private String orderId; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/SearchPicturesRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/SearchPicturesRequest.java new file mode 100644 index 0000000..0a95966 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/SearchPicturesRequest.java @@ -0,0 +1,24 @@ +package com.casic.missiles.modular.dto.hik; + +import lombok.Data; + +import java.util.List; + +/** + * @Description: 以图搜图请求 + * @Author: wangpeng + * @Date: 2022/8/29 10:46 + */ +@Data +public class SearchPicturesRequest { + private String facePicBinaryData; + private String facePicUrl; + private List cameraIndexCodes; + private String startTime; + private String endTime; + //指定搜图的最小相似度,最小为1,最大为100 + private String minSimilarity; + private Number age; + //male-男性,female-女性 + private String sex; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/StaffCardRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/StaffCardRequest.java new file mode 100644 index 0000000..4052e6d --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/StaffCardRequest.java @@ -0,0 +1,20 @@ +package com.casic.missiles.modular.dto.hik; + +import lombok.Data; + +import java.util.List; + +/** + * @Description: 人员开卡请求实体 + * @Author: wangpeng + * @Date: 2022/8/26 16:05 + */ +@Data +public class StaffCardRequest { + //卡片开始有效时间,时间格式:yyyy-MM-dd + private String startDate; + //卡片截止有效时间,时间格式:yyyy-MM-dd,不能大于2037年12月31日 + private String endDate; + //cardList,待开卡列表,最大支持50张卡 + private List cardList; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/VisitorInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/VisitorInfo.java index 73aa316..b99f301 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/VisitorInfo.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/VisitorInfo.java @@ -14,7 +14,7 @@ //访客性别 //1: 男 //2: 女 - private String gender; + private Integer gender; //联系电话建议填写手机号码 private String phoneNo; //证件类型 diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/ApplyReasonGroupDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/ApplyReasonGroupDTO.java index 514f382..786143e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/ApplyReasonGroupDTO.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/ApplyReasonGroupDTO.java @@ -13,4 +13,6 @@ private String visitReason; //访问人数 private Integer quantity; + //占比 + private String ratio; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/AttendanceNumberDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/AttendanceNumberDTO.java new file mode 100644 index 0000000..a494321 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/AttendanceNumberDTO.java @@ -0,0 +1,24 @@ +package com.casic.missiles.modular.dto.statistics; + +import com.fasterxml.jackson.annotation.JsonIgnore; +import lombok.Data; + +/** + * @Description: 出勤人数统计实体 + * @Author: wangpeng + * @Date: 2022/8/31 19:24 + */ +@Data +public class AttendanceNumberDTO { + //日期维度,周、今日,入参 + @JsonIgnore + private String dateDimension; + + //日期,具体天/小时,出参 + private String date; + //出勤人数 + private String quantity; + //员工类型 + private String staffType; + +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/AvgMonthAndWeekGroupDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/AvgMonthAndWeekGroupDTO.java index 4366916..331a9a9 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/AvgMonthAndWeekGroupDTO.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/AvgMonthAndWeekGroupDTO.java @@ -2,8 +2,6 @@ import lombok.Data; -import java.util.Map; - /** * @Description: 平均每月和每周的数据实体 * @Author: wangpeng @@ -13,6 +11,4 @@ public class AvgMonthAndWeekGroupDTO { //入参 private String year; - //出参,key:事件类型,value:周和月数据平均值 - private Map map; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/GateStatusGroupResponse.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/GateStatusGroupResponse.java new file mode 100644 index 0000000..d16f4e5 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/GateStatusGroupResponse.java @@ -0,0 +1,16 @@ +package com.casic.missiles.modular.dto.statistics; + +import lombok.Data; + +/** + * @Description: 闸机/摄像机统计响应实体 + * @Author: wangpeng + * @Date: 2022/8/30 14:22 + */ +@Data +public class GateStatusGroupResponse { + //设备状态 + private String status; + //占比 + private String ratio; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/MonthAndWeekDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/MonthAndWeekDTO.java index 7482b2a..284115a 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/MonthAndWeekDTO.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/MonthAndWeekDTO.java @@ -9,7 +9,7 @@ */ @Data public class MonthAndWeekDTO { -// private String levelName; + private String levelName; private Integer monthQuantity; private Integer weekQuantity; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/OnDutyRatioDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/OnDutyRatioDTO.java new file mode 100644 index 0000000..4f6a65d --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/OnDutyRatioDTO.java @@ -0,0 +1,15 @@ +package com.casic.missiles.modular.dto.statistics; + +import lombok.Data; + +/** + * @Description: 在岗率统计实体 + * @Author: wangpeng + * @Date: 2022/9/2 21:24 + */ +@Data +public class OnDutyRatioDTO { + private String date; + private String quantity; + private String ratio; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/SecurityLevelAssessDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/SecurityLevelAssessDTO.java new file mode 100644 index 0000000..40a0738 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/SecurityLevelAssessDTO.java @@ -0,0 +1,15 @@ +package com.casic.missiles.modular.dto.statistics; + +import lombok.Data; + +/** + * @Description: 出勤人数统计实体 + * @Author: wangpeng + * @Date: 2022/8/31 19:24 + */ +@Data +public class SecurityLevelAssessDTO { + private String date; + private String quantity; + private Double score; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/BlackListController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/BlackListController.java index a27f9f8..0c06661 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/BlackListController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/BlackListController.java @@ -1,13 +1,18 @@ package com.casic.missiles.modular.controller; +import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.base.controller.ExportController; import com.casic.missiles.core.page.PageFactory; import com.casic.missiles.model.response.ResponseData; import com.casic.missiles.modular.dto.BlackInfoRequest; +import com.casic.missiles.modular.dto.BlackPictureRequest; +import com.casic.missiles.modular.dto.hik.PersonInfoRequest; +import com.casic.missiles.modular.enums.HikUri; import com.casic.missiles.modular.enums.OperateTypeEnum; import com.casic.missiles.modular.model.BlackInfo; import com.casic.missiles.modular.service.BlackInfoService; +import com.casic.missiles.modular.util.HikUtil; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; @@ -56,4 +61,22 @@ return null; } + /** + * 黑名单人员照片 + */ + @PostMapping("/personPicture") + @ResponseBody + public Object personPicture(@RequestBody BlackPictureRequest blackPictureRequest){ + //获取照片 + String picUri = blackPictureRequest.getPicUri(); + String serverIndexCode = blackPictureRequest.getServerIndexCode(); + PersonInfoRequest picRequest = new PersonInfoRequest(); + picRequest.setPicUri(picUri); + picRequest.setServerIndexCode(serverIndexCode); + String reBody = JSONObject.toJSONString(picRequest); + //重定向地址获取 + String url = HikUtil.hikApiFor302(HikUri.PERSON_PICTURE, reBody); + return ResponseData.success(url); + } + } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/DeviceController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/DeviceController.java index e1c4eba..666bbee 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/DeviceController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/DeviceController.java @@ -107,7 +107,7 @@ } /** - * 设备维修管理查询(分页),需计算MTTR=总维修时间/故障次数 + * 设备状态计算与评判/设备维修管理查询(分页),需计算MTTR=总维修时间/故障次数 */ @PostMapping("/repair/listPage") @ResponseBody @@ -211,7 +211,7 @@ //需根据设备编号获取到对应的门禁点唯一标识 doorControlRequest.setDoorIndexCodes(indexCodes); doorControlRequest.setControlType(Integer.valueOf(gateGroupDTO.getStatus())); - String body = JSONObject.toJSONString(deviceCodes); + String body = JSONObject.toJSONString(doorControlRequest); String resultStr = HikUtil.hikApi(HikUri.DOOR_CONTROL, body); JSONObject resultJson = (JSONObject)JSONObject.parse(resultStr); if (!"0".equals(resultJson.get("code"))) { diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/StaffController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/StaffController.java index b58ccab..704093c 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/StaffController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/StaffController.java @@ -2,15 +2,21 @@ import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.util.StrUtil; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.base.controller.ExportController; import com.casic.missiles.core.page.PageFactory; import com.casic.missiles.model.response.ErrorResponseData; import com.casic.missiles.model.response.ResponseData; import com.casic.missiles.modular.dto.StaffInfoRequest; +import com.casic.missiles.modular.dto.hik.PersonInfoRequest; +import com.casic.missiles.modular.dto.hik.StaffCardRequest; +import com.casic.missiles.modular.enums.HikUri; import com.casic.missiles.modular.enums.OperateTypeEnum; import com.casic.missiles.modular.model.StaffInfo; import com.casic.missiles.modular.service.StaffInfoService; +import com.casic.missiles.modular.util.HikUtil; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; @@ -110,4 +116,60 @@ } return ResponseData.success(); } + + /** + * 批量开卡,添加人员之后调用,若在一个接口中添加人员成功开卡失败则第二次添加时会有问题 + */ + @PostMapping("/cardBinding") + @ResponseBody + public Object cardBinding(@RequestBody StaffCardRequest staffCardRequest) { + String body = JSONObject.toJSONString(staffCardRequest); + String resultStr = HikUtil.hikApi(HikUri.CARD_BINDING, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (!"0".equals(resultJson.get("code"))) { + log.error("请求海康,批量开卡失败,海康response:{}", resultStr); + return ResponseData.error("批量开卡失败"); + } + //保存卡号 + if(staffInfoService.saveCardInfo(staffCardRequest) > 0){ + return ResponseData.success(); + } + return ResponseData.error("批量开卡失败"); + } + + /** + * 获取员工照片,海康存储 + */ + @PostMapping("/personPicture/{staffCode}") + @ResponseBody + public Object personPicture(@PathVariable("staffCode") String staffCode){ + //获取员工详细信息,含图片服务器、uri + PersonInfoRequest request = new PersonInfoRequest(); + List list = new ArrayList<>(); + list.add(staffCode); + request.setParamName("personId"); + request.setParamValue(list); + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi(HikUri.PERSON_INFO, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (!"0".equals(resultJson.get("code"))) { + log.error("请求海康,根据人员唯一字段获取人员详细信息失败,海康response:{}", resultStr); + return ResponseData.error("获取员工照片失败"); + } + //获取照片 + JSONObject data = (JSONObject) resultJson.get("data"); + JSONArray dataArray = (JSONArray) data.get("list"); + JSONObject jsonObject = (JSONObject) dataArray.get(0); + JSONArray personPhoto = (JSONArray) jsonObject.get("personPhoto"); + JSONObject photo = (JSONObject) personPhoto.get(0); + String picUri = photo.getString("picUri"); + String serverIndexCode = photo.getString("serverIndexCode"); + PersonInfoRequest picRequest = new PersonInfoRequest(); + picRequest.setPicUri(picUri); + picRequest.setServerIndexCode(serverIndexCode); + String reBody = JSONObject.toJSONString(picRequest); + //重定向地址获取 + String url = HikUtil.hikApiFor302(HikUri.PERSON_PICTURE, reBody); + return ResponseData.success(url); + } } 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 4a07dd9..7b1dcf6 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 @@ -16,6 +16,7 @@ import com.casic.missiles.modular.redis.key.CacheKeys; import com.casic.missiles.modular.service.CockpitService; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.util.CollectionUtils; import org.springframework.web.bind.annotation.*; @@ -24,10 +25,7 @@ import java.text.NumberFormat; import java.time.LocalDateTime; import java.time.temporal.ChronoUnit; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.util.*; import java.util.stream.Collectors; /** @@ -73,6 +71,9 @@ private StatisticNumberMapper numberMapper; @Autowired + private HazardLevelMapper hazardLevelMapper; + + @Autowired private AccessGroupConfig accessGroupConfig; /** @@ -104,8 +105,24 @@ public Object buildingNumberPerHour(){ //当天按小时分组的人数 List list = numberMapper.selectListByTime(); - Map> collect = list.stream().collect(Collectors.groupingBy(BuildingNumberDTO::getStatisticPosition)); - return ResponseData.success(collect); + Map> collect = list.stream().collect(Collectors.groupingBy(BuildingNumberDTO::getStatisticTime)); + //定时任务中已将每小时三栋楼人数存到数据库 + //将一期主楼和录制楼人数合并,二期单算 + List> resultList = new ArrayList<>(); + collect.keySet().forEach(key -> { + List buildingNumberDTOS = collect.get(key); + BuildingNumberDTO mainBuildingOne = buildingNumberDTOS.get(0); + BuildingNumberDTO mainBuildingTwo = buildingNumberDTOS.get(1); + BuildingNumberDTO recordingBuilding = buildingNumberDTOS.get(2); + HashMap resultMap = new HashMap<>(); + Integer oneQuantity = Integer.valueOf(mainBuildingOne.getStatisticQuantity()); + Integer recordingQuantity = Integer.valueOf(recordingBuilding.getStatisticQuantity()); + resultMap.put("staticTime", mainBuildingOne.getStatisticTime()); + resultMap.put(mainBuildingOne.getStatisticPositionName()+"、"+recordingBuilding.getStatisticPositionName(), String.valueOf(oneQuantity+recordingQuantity)); + resultMap.put(mainBuildingTwo.getStatisticPositionName(), mainBuildingTwo.getStatisticQuantity()); + resultList.add(resultMap); + }); + return ResponseData.success(resultList); } /** @@ -151,12 +168,11 @@ public Object securityNumber() { QueryWrapper wrapper = new QueryWrapper<>(); wrapper.eq("staff_type", 2); + // TODO: 2022/9/2 后续使用产品确定的每天出勤的安保人员的数量 Integer total = staffInfoMapper.selectCount(wrapper); - //当日离岗事件个数 - QueryWrapper wrapper1 = new QueryWrapper<>(); - wrapper1.eq("hik_event_type", SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); - wrapper1.apply("date_format(now(),'%Y-%m-%d') = date_format(happen_time,'%Y-%m-%d')"); - Integer leave = caseInfoMapper.selectCount(wrapper1); + //当日离岗事件按设备去重后的个数 + // TODO: 2022/9/2 目前相当于24小时内的计算,之后看需要可改成自定义小时数计算离岗率,即离岗+6小时内仅一次离岗则恢复为100%,多次则累加离岗次数计算离岗率 + Integer leave = caseInfoMapper.selectDemobilizedCount(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); NumberFormat numberFormat = NumberFormat.getInstance(); // 设置精确到小数点后2位 numberFormat.setMaximumFractionDigits(2); @@ -179,7 +195,6 @@ @ResponseBody public Object visitorApplyDetail() { List reasonGroup = applyMapper.selectByVisitReason(); - HashMap resultMap = new HashMap<>(); NumberFormat numberFormat = NumberFormat.getInstance(); // 设置精确到小数点后2位 numberFormat.setMaximumFractionDigits(2); @@ -187,12 +202,17 @@ if(0 == sum){ return ResponseData.success(); } + List resultList = new ArrayList<>(); reasonGroup.forEach(group -> { String reasonName = dictService.getDictNameByCode(SecurityEventDict.VISIT_REASON, group.getVisitReason()); String result = numberFormat.format((float) group.getQuantity() / (float) sum * 100); - resultMap.put(reasonName, result+"%"); + ApplyReasonGroupDTO applyReasonGroupDTO = new ApplyReasonGroupDTO(); + applyReasonGroupDTO.setQuantity(group.getQuantity()); + applyReasonGroupDTO.setVisitReason(reasonName); + applyReasonGroupDTO.setRatio(result+"%"); + resultList.add(applyReasonGroupDTO); }); - return ResponseData.success(resultMap); + return ResponseData.success(resultList); } /** @@ -247,6 +267,32 @@ } /** + * 机动力量实时在岗率,在岗人数除以总应在岗人数,用离岗+6小时内恢复为100%,6小时外再计算 + */ + @GetMapping("/staff/beOnDutyRatio") + @ResponseBody + public Object beOnDutyRatio() { + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("staff_type", 2); + // TODO: 2022/9/2 后续使用产品确定的每天出勤的安保人员的数量 + Integer total = staffInfoMapper.selectCount(wrapper); + if(0 == total){ + return ResponseData.success(null); + } + //当日离岗事件按设备去重后的个数 + // TODO: 2022/9/2 目前相当于24小时内的计算,之后看需要可改成自定义小时数计算离岗率,即离岗+6小时内仅一次离岗则恢复为100%,多次则累加离岗次数计算离岗率 + List onDutyRatioDTOS = caseInfoMapper.selectDemobilizedCountByHour(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); + onDutyRatioDTOS.forEach(dto -> { + NumberFormat numberFormat = NumberFormat.getInstance(); + // 设置精确到小数点后2位 + numberFormat.setMaximumFractionDigits(2); + String result = numberFormat.format(100 - Float.valueOf(dto.getQuantity()) / (float) total * 100); + dto.setRatio(result+"%"); + }); + return ResponseData.success(onDutyRatioDTOS); + } + + /** * 闸机速通门统计-设备状态分组计算数量,devType传闸机字典key * 视频频监控摄像机统计-设备状态分组计算数量,devType传摄像头字典key */ @@ -262,12 +308,17 @@ if(sum <= 0){ return ResponseData.error("无该类设备信息"); } + List resultList = new ArrayList<>(); gateStatusGroup.forEach(group -> { String devStatus = dictService.getDictNameByCode(SecurityEventDict.DEVICE_STATUS, group.getStatus()); String result = numberFormat.format((float) group.getQuantity() / (float) sum * 100); - resultMap.put(devStatus, result+"%"); + GateStatusGroupResponse gateStatusGroupResponse = new GateStatusGroupResponse(); + gateStatusGroupResponse.setStatus(devStatus); + gateStatusGroupResponse.setRatio(result+"%"); + resultList.add(gateStatusGroupResponse); }); - resultMap.put("总", sum); + resultMap.put("total", sum); + resultMap.put("list", resultList); return ResponseData.success(resultMap); } @@ -282,17 +333,38 @@ String position = securityScoreDTO.getPosition(); List caseInfos = caseInfoMapper.selectByPosition(position); //查询各危险级别权重、各类别权重,放入map,避免循环中多次查数据库 - + HashMap hazardScoreMap = new HashMap<>(); + List caseHazardLevelList = hazardLevelMapper.getCaseHazardLevelList(null); + caseHazardLevelList.forEach(hazardLevel -> { + hazardScoreMap.put(hazardLevel.getCode(), hazardLevel.getWeight()); + }); + HashMap categoryScoreMap = new HashMap<>(); + List categoryLevelList = categoryLevelMapper.getCaseCategoryLevelList(null); + categoryLevelList.forEach(categoryLevel -> { + categoryScoreMap.put(categoryLevel.getCode(), categoryLevel.getWeight()); + }); + //事件按楼层分组,计算 List securityScoreDTOs = new ArrayList<>(); caseInfos.forEach(caseInfo -> { SecurityScoreDTO securityScoreDTO1 = new SecurityScoreDTO(); + securityScoreDTO1.setPosition(caseInfo.getPosition()); securityScoreDTO1.setArea(caseInfo.getArea()); - // TODO: 2022/8/4 楼层评分计算根据产品定义调整 -// caseInfo.get -// securityScoreDTO1.setScore(); + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); + Double score = 100 - Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + securityScoreDTO1.setScore(score); + securityScoreDTOs.add(securityScoreDTO1); }); - - return null; + 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); + }); + return ResponseData.success(securityScoreDTOs); } /** @@ -303,9 +375,13 @@ public Object SecurityFrequency(@RequestBody SecurityFrequencyDTO securityFrequencyDTO) { String year = securityFrequencyDTO.getYear(); String month = securityFrequencyDTO.getMonth(); - Integer quantity = caseInfoMapper.selectCountByMonth(year, month); - securityFrequencyDTO.setQuantity(quantity); - return ResponseData.success(securityFrequencyDTO); + if(!StringUtils.isEmpty(year) && StringUtils.isEmpty(month)){ + Integer quantity = caseInfoMapper.selectCountByMonth(year, month); + securityFrequencyDTO.setQuantity(quantity); + return ResponseData.success(securityFrequencyDTO); + } + List list = caseInfoMapper.selectPreMonthCount(); + return ResponseData.success(list); } } 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 ae4d770..f4f075c 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 @@ -1,20 +1,25 @@ package com.casic.missiles.modular.controller.cockpit; +import cn.hutool.core.date.DateUnit; import cn.hutool.core.date.DateUtil; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.casic.missiles.model.response.ResponseData; -import com.casic.missiles.modular.dao.AttendanceInfoMapper; -import com.casic.missiles.modular.dao.CaseInfoMapper; -import com.casic.missiles.modular.dao.HazardLevelMapper; -import com.casic.missiles.modular.dao.StaffInfoMapper; +import com.casic.missiles.modular.dao.*; +import com.casic.missiles.modular.dto.DeviceRepairLogDTO; +import com.casic.missiles.modular.dto.DeviceRepairRequest; import com.casic.missiles.modular.dto.statistics.*; +import com.casic.missiles.modular.enums.SecurityEventType; +import com.casic.missiles.modular.model.CaseCategoryLevel; import com.casic.missiles.modular.model.CaseHazardLevel; +import com.casic.missiles.modular.model.CaseInfo; import com.casic.missiles.modular.model.StaffInfo; +import com.casic.missiles.modular.service.DeviceInfoService; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.util.CollectionUtils; import org.springframework.web.bind.annotation.*; +import java.math.BigDecimal; import java.text.NumberFormat; import java.util.*; import java.util.stream.Collectors; @@ -40,6 +45,12 @@ @Autowired private HazardLevelMapper hazardLevelMapper; + @Autowired + private CategoryLevelMapper categoryLevelMapper; + + @Autowired + private DeviceInfoService deviceInfoService; + /** * 安防事件时域频次统计,每月的每天安防事件个数(原方案) * 月维度:展示每个月的每天的数据 @@ -89,15 +100,17 @@ List monthList = caseInfoMapper.selectPreMonthCountByYear(year); Map> collect = monthList.stream().collect(Collectors.groupingBy(PreMonthOrWeekCaseDTO::getHazardLevelCode)); HashMap strAvgMap = new HashMap<>(); + List resultList = new ArrayList<>(); for (String key : collect.keySet()) { List preMonthOrWeekCaseDTOS = collect.get(key); int sum = preMonthOrWeekCaseDTOS.stream().mapToInt(PreMonthOrWeekCaseDTO::getQuantity).sum(); //若年份是本年,则使用个安防级别数量/当前月份数 //若不是本年,除数为12 MonthAndWeekDTO monthAndWeekDTO = new MonthAndWeekDTO(); + String hazardName = hazardLevelMapper.selectHazardNameByCode(key); + monthAndWeekDTO.setLevelName(hazardName); if(year.equals(String.valueOf(DateUtil.thisYear()))){ monthAndWeekDTO.setMonthQuantity(sum / DateUtil.thisMonth()); -// monthAndWeekDTO.setLevelName(); strAvgMap.put(key, monthAndWeekDTO); }else{ monthAndWeekDTO.setMonthQuantity(sum / 12); @@ -113,27 +126,37 @@ if(year.equals(String.valueOf(DateUtil.thisYear()))){ if(!Objects.isNull(strAvgMap.get(key))){ MonthAndWeekDTO monthAndWeekDTO = strAvgMap.get(key); + String hazardName = hazardLevelMapper.selectHazardNameByCode(key); + monthAndWeekDTO.setLevelName(hazardName); monthAndWeekDTO.setWeekQuantity(sum / DateUtil.thisWeekOfYear()); strAvgMap.put(key, monthAndWeekDTO); }else{ MonthAndWeekDTO monthAndWeekDTO = new MonthAndWeekDTO(); + String hazardName = hazardLevelMapper.selectHazardNameByCode(key); + monthAndWeekDTO.setLevelName(hazardName); monthAndWeekDTO.setWeekQuantity(sum / DateUtil.thisWeekOfYear()); strAvgMap.put(key, monthAndWeekDTO); } }else{ if(!Objects.isNull(strAvgMap.get(key))){ MonthAndWeekDTO monthAndWeekDTO = strAvgMap.get(key); + String hazardName = hazardLevelMapper.selectHazardNameByCode(key); + monthAndWeekDTO.setLevelName(hazardName); monthAndWeekDTO.setWeekQuantity(sum / 52); strAvgMap.put(key, monthAndWeekDTO); }else{ MonthAndWeekDTO monthAndWeekDTO = new MonthAndWeekDTO(); + String hazardName = hazardLevelMapper.selectHazardNameByCode(key); + monthAndWeekDTO.setLevelName(hazardName); monthAndWeekDTO.setWeekQuantity(sum / 52); strAvgMap.put(key, monthAndWeekDTO); } } } - avgMonthAndWeekGroupDTO.setMap(strAvgMap); - return ResponseData.success(avgMonthAndWeekGroupDTO); + strAvgMap.keySet().forEach(key -> { + resultList.add(strAvgMap.get(key)); + }); + return ResponseData.success(resultList); } /** @@ -181,12 +204,178 @@ } /** - * 员工考勤人数变化,功能待定 + * 员工考勤人数变化,统计当天(横坐标为时)及近7天(横坐标为天)的考勤人数变化,只要发生一次考勤识别,次数的基数就正常增加(没有上班下班区分) */ + @PostMapping("/staff/attendanceNumber/{dimension}") + @ResponseBody + public Object attendanceNumber(@PathVariable("dimension") String dimension) { + List attendanceNumberDTOs = null; + List> resultList = new ArrayList<>(); + if("week".equals(dimension)){ + //近7天数据按天分组统计 + attendanceNumberDTOs = attendanceInfoMapper.getCountForWeek(); + }else if("day".equals(dimension)) { + //今天数据按小时分组统计 + attendanceNumberDTOs = attendanceInfoMapper.getCountForDay(); + } + if(CollectionUtils.isEmpty(attendanceNumberDTOs)){ + return ResponseData.error("该查询条件下,无员工出勤数据!"); + } + Map> collect = attendanceNumberDTOs.stream().collect(Collectors.groupingBy(AttendanceNumberDTO::getDate)); + collect.keySet().forEach(key -> { + List attendanceNumberDTOS = collect.get(key); + AttendanceNumberDTO attendanceNumberDTO = attendanceNumberDTOS.get(0); + AttendanceNumberDTO attendanceNumberDTO2 = attendanceNumberDTOS.get(1); + Map resultMap = new HashMap<>(); + resultMap.put(attendanceNumberDTO.getStaffType(), attendanceNumberDTO.getQuantity()); + resultMap.put(attendanceNumberDTO2.getStaffType(), attendanceNumberDTO2.getQuantity()); + resultMap.put("staticTime", attendanceNumberDTO.getDate()); + resultList.add(resultMap); + }); + return ResponseData.success(resultList); + } /** - * 近30天/近一周安保人员到岗排行 + * 早晚高峰区域安防评估 */ + @PostMapping("/security/assessment/{dimension}") + @ResponseBody + public Object securityAssessment(@PathVariable("dimension") String dimension) { + //查询各危险级别权重、各类别权重,放入map,避免循环中多次查数据库 + HashMap hazardScoreMap = new HashMap<>(); + List caseHazardLevelList = hazardLevelMapper.getCaseHazardLevelList(null); + caseHazardLevelList.forEach(hazardLevel -> { + hazardScoreMap.put(hazardLevel.getCode(), hazardLevel.getWeight()); + }); + HashMap categoryScoreMap = new HashMap<>(); + List categoryLevelList = categoryLevelMapper.getCaseCategoryLevelList(null); + categoryLevelList.forEach(categoryLevel -> { + categoryScoreMap.put(categoryLevel.getCode(), categoryLevel.getWeight()); + }); + HashMap hashMap = new HashMap<>(); + if("week".equals(dimension)){ + //近7天早晚高峰数据 + List caseInfos = caseInfoMapper.selectListBySevenDay(); + //按时间(天)进行分组 + caseInfos.forEach(caseInfo -> { + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); + Double score = Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + String[] array = caseInfo.getHappenTime().split(" "); + String dayTime = array[0]; + BigDecimal preScore; + if(hashMap.containsKey(dayTime)){ + Double aDouble = hashMap.get(dayTime); + preScore = new BigDecimal(aDouble.toString()); + + }else{ + preScore = new BigDecimal("100.0"); + } + BigDecimal nowScore = new BigDecimal(score.toString()); + hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); + }); + return ResponseData.success(hashMap); + }else if("day".equals(dimension)) { + //今天数据按小时分组统计 + List caseInfos = caseInfoMapper.selectListByToday(); + caseInfos.forEach(caseInfo -> { + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); + Double score = Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + String[] array = caseInfo.getHappenTime().split(":"); + String dayTime = array[0]; + BigDecimal preScore; + if(hashMap.containsKey(dayTime)){ + Double aDouble = hashMap.get(dayTime); + preScore = new BigDecimal(aDouble.toString()); + + }else{ + preScore = new BigDecimal("100.0"); + } + BigDecimal nowScore = new BigDecimal(score.toString()); + hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); + }); + return ResponseData.success(hashMap); + } + return null; + } + + /** + * 重点区域安防事态评估,统计重点区域6:00-23:00按小时分组数据 + */ + @GetMapping("/security/keyAreaStatistic") + @ResponseBody + public Object keyAreaStatistic() { + //查询各危险级别权重、各类别权重,放入map,避免循环中多次查数据库 + HashMap hazardScoreMap = new HashMap<>(); + List caseHazardLevelList = hazardLevelMapper.getCaseHazardLevelList(null); + caseHazardLevelList.forEach(hazardLevel -> { + hazardScoreMap.put(hazardLevel.getCode(), hazardLevel.getWeight()); + }); + HashMap categoryScoreMap = new HashMap<>(); + List categoryLevelList = categoryLevelMapper.getCaseCategoryLevelList(null); + categoryLevelList.forEach(categoryLevel -> { + categoryScoreMap.put(categoryLevel.getCode(), categoryLevel.getWeight()); + }); + HashMap hashMap = new HashMap<>(); + //今天数据按小时分组统计 + List caseInfos = caseInfoMapper.selectListByToday2(); + caseInfos.forEach(caseInfo -> { + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); + Double score = Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + String[] array = caseInfo.getHappenTime().split(":"); + String dayTime = array[0]; + BigDecimal preScore; + if(hashMap.containsKey(dayTime)){ + Double aDouble = hashMap.get(dayTime); + preScore = new BigDecimal(aDouble.toString()); + + }else{ + preScore = new BigDecimal("100.0"); + } + BigDecimal nowScore = new BigDecimal(score.toString()); + hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); + }); + return ResponseData.success(hashMap); + } + + /** + * 安防机动支援力量调配响应评估,根据事件已解决状态及已解决时间-发送时间,按时间(小时)分组统计 + */ + @GetMapping("/security/responseAssess") + @ResponseBody + public Object responseAssess() { + //查询各危险级别权重、各类别权重,放入map,避免循环中多次查数据库 + HashMap hazardScoreMap = new HashMap<>(); + List caseHazardLevelList = hazardLevelMapper.getCaseHazardLevelList(null); + caseHazardLevelList.forEach(hazardLevel -> { + hazardScoreMap.put(hazardLevel.getCode(), hazardLevel.getWeight()); + }); + HashMap hashMap = new HashMap<>(); + //今天数据按小时分组统计 + List caseInfos = caseInfoMapper.selectListByToday3(); + caseInfos.forEach(caseInfo -> { + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + //扣分=事件级别权重*未解决小时数 + Date updateTime = DateUtil.parse(caseInfo.getUpdateTime()); + Date happenTime = DateUtil.parse(caseInfo.getHappenTime()); + long between = DateUtil.between(updateTime, happenTime, DateUnit.HOUR); + Double score = Double.valueOf(hazardWeight)*between; + String[] array = caseInfo.getHappenTime().split(":"); + String dayTime = array[0]; + BigDecimal preScore; + if(hashMap.containsKey(dayTime)){ + Double aDouble = hashMap.get(dayTime); + preScore = new BigDecimal(aDouble.toString()); + }else{ + preScore = new BigDecimal("100.0"); + } + BigDecimal nowScore = new BigDecimal(score.toString()); + hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); + }); + return ResponseData.success(hashMap); + } /** * 重点区域威胁事件类型统计,优先级2,统计近7天和近30天 @@ -224,7 +413,34 @@ } /** - * 设备状态计算系数和评判,优先级3,需确认设备恢复时间是否可以获取 + * 近30天/近一周安保人员到岗排行 */ + + /** + * 安保等级评估,发生离岗事件减1分 + */ + @GetMapping("/security/levelAssess") + @ResponseBody + public Object securityLevelAssess() { + //今天数据按小时分组统计 + List resultList = caseInfoMapper.selectListByType(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); + resultList.forEach(result -> { + BigDecimal deScore = new BigDecimal(result.getQuantity()); + BigDecimal preScore = new BigDecimal("100.0"); + result.setScore(preScore.subtract(deScore).doubleValue()); + }); + return ResponseData.success(resultList); + } + + /** + * 设备状态计算系数和评判,即设备维修管理查询(不分页) + */ + @PostMapping("/device/repairList") + @ResponseBody + public Object repairList(@RequestBody DeviceRepairRequest deviceRepairRequest) { + List deviceRepairLogDTOS = deviceInfoService.deviceRepairListPage(deviceRepairRequest); + return ResponseData.success(deviceRepairLogDTOS); + } + } 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 fbf8ab6..c71a15a 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 @@ -1,13 +1,12 @@ package com.casic.missiles.modular.controller.hik; +import cn.hutool.core.date.DateTime; +import cn.hutool.core.date.DateUtil; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.casic.missiles.model.response.ResponseData; import com.casic.missiles.modular.dao.HikFaceGroupInfoMapper; -import com.casic.missiles.modular.dto.hik.EventSubscribeRequest; -import com.casic.missiles.modular.dto.hik.FaceGroupAdditionRequest; -import com.casic.missiles.modular.dto.hik.HikRecvEvent; -import com.casic.missiles.modular.dto.hik.OrgBatchAdd; +import com.casic.missiles.modular.dto.hik.*; import com.casic.missiles.modular.enums.HikUri; import com.casic.missiles.modular.enums.SecurityEventType; import com.casic.missiles.modular.model.CaseInfo; @@ -18,16 +17,20 @@ import com.casic.missiles.modular.util.CaseInfoFactoryUtil; import com.casic.missiles.modular.util.HikUtil; import com.casic.missiles.modular.util.ThreadPoolUtil; +import com.casic.missiles.modular.util.WebSocket; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; -import org.springframework.web.bind.annotation.*; +import org.springframework.util.CollectionUtils; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.RestController; -import java.net.InetAddress; -import java.net.UnknownHostException; import java.util.ArrayList; +import java.util.Iterator; import java.util.List; import java.util.Objects; @@ -38,7 +41,6 @@ */ @Slf4j @RestController -@RequestMapping("/hik") public class HikController { @Autowired @@ -53,28 +55,37 @@ @Autowired private HikService hikService; + @Autowired + private HikFaceGroupInfoMapper hikFaceGroupInfoMapper; + + @Autowired + private WebSocket webSocket; + @Value("${server.port}") private int serverPort; - @Autowired - private HikFaceGroupInfoMapper hikFaceGroupInfoMapper; /** * 海康事件订阅 */ - @PostMapping("/event/subscribe") + @PostMapping("/hik/event/subscribe") @ResponseBody - public Object eventSubscribe() throws UnknownHostException { + public Object eventSubscribe() { EventSubscribeRequest eventSubscribeRequest = new EventSubscribeRequest(); ArrayList list = new ArrayList<>(); list.add(SecurityEventType.DEVICE_OFFLINE); + list.add(SecurityEventType.DEVICE_ONLINE); list.add(SecurityEventType.KEY_PERSONNEL_IDENTIFY_EVENT); list.add(SecurityEventType.MONITORING_POINT_OFFLINE); + list.add(SecurityEventType.MONITORING_POINT_ONLINE); list.add(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); list.add(SecurityEventType.PERSONNEL_GATHER_EVENT); - InetAddress localHost = InetAddress.getLocalHost(); + list.add(SecurityEventType.VISITOR_REGISTER); + list.add(SecurityEventType.VISITOR_CHECKOUT); + list.add(SecurityEventType.HIGH_ALTITUDE_PARABOLIC); +// InetAddress localHost = InetAddress.getLocalHost(); eventSubscribeRequest.setEventTypes(list); - eventSubscribeRequest.setEventDest("https://" + localHost + ":" + serverPort + "/eventRcv"); + eventSubscribeRequest.setEventDest("http://" + "192.168.10.6" + ":" + serverPort + "/eventRcv"); //订阅类型,0-订阅原始事件,1-联动事件,2-原始事件和联动事件,不填使用默认值0 eventSubscribeRequest.setSubType(0); /** @@ -92,19 +103,25 @@ } /** + * 查询事件订阅信息 + */ + @PostMapping("/hik/event/query") + @ResponseBody + public Object eventQuery() { + String result = HikUtil.hikApi(HikUri.EVENT_INFO, ""); + return result; + } + + /** * 海康事件接收 */ @PostMapping("/eventRcv") @ResponseBody public Object eventRcv(@RequestBody HikRecvEvent hikRecvEvent) { //1、接收所需事件类型 - Long eventType = hikRecvEvent.getEventType(); + Number eventType = hikRecvEvent.getEventType(); log.info("接收到安防事件类型为:{}", eventType); CaseInfo caseInfo = caseInfoFactoryUtil.getCaseInfo(eventType); - //接收到不关心事件直接返回 - if(Objects.isNull(caseInfo)){ - return ResponseData.success(); - } //2、不同事件不同处理,caseInfoFactoryUtil已设置好事件基础定义信息 // 再为事件添加状态、设备编码、设备名称、位置、区域、时间 // 异步处理事件 @@ -114,19 +131,23 @@ caseHandle(hikRecvEvent, eventType, caseInfo); } })); +// caseHandle(hikRecvEvent, eventType, caseInfo); - return null; + return ResponseData.success(); } - private void caseHandle(HikRecvEvent hikRecvEvent, Long eventType, CaseInfo caseInfo) { + private void caseHandle(HikRecvEvent hikRecvEvent, Number eventType, CaseInfo caseInfo) { JSONArray eventArray = hikRecvEvent.getEventArray(); List caseInfos = new ArrayList<>(); - while (eventArray.stream().iterator().hasNext()) { + Iterator iterator = eventArray.iterator(); + while (iterator.hasNext()) { CaseInfo caseInfo1 = new CaseInfo(); - BeanUtils.copyProperties(caseInfo, caseInfo1); - JSONObject event = (JSONObject) eventArray.stream().iterator().next(); + if(!Objects.isNull(caseInfo)){ + BeanUtils.copyProperties(caseInfo, caseInfo1); + } + JSONObject event = (JSONObject) iterator.next(); //5种事件进行不同处理 - if(SecurityEventType.KEY_PERSONNEL_IDENTIFY_EVENT == eventType){ + if (SecurityEventType.KEY_PERSONNEL_IDENTIFY_EVENT.equals(eventType)) { //判断所属人脸分组 JSONObject data = (JSONObject) event.get("data"); JSONObject faceRecognitionResult = (JSONObject) data.get("faceRecognitionResult"); @@ -142,52 +163,101 @@ if (faceGroupCode.equals(blackListGroup.getFaceGroupCode())) { //黑名单分组处理 caseInfo1 = hikService.blackListHandle(event, caseInfo1); - }else if(faceGroupCode.equals(propertyPersonnelGroup.getFaceGroupCode())){ + } else if (faceGroupCode.equals(propertyPersonnelGroup.getFaceGroupCode())) { //考勤分组处理-物业人员,添加到考勤表 hikService.propertyAttendanceHandle(event); - }else if(faceGroupCode.equals(securityPersonnelGroup.getFaceGroupCode())){ + } else if (faceGroupCode.equals(securityPersonnelGroup.getFaceGroupCode())) { //考勤分组处理-安保人员,添加到考勤表 hikService.securityPersonnelHandle(event); - }else { + } else { return; } - }else if(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT == eventType){ + } else if (SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT.equals(eventType)) { //离岗事件处理 caseInfo1 = hikService.demobilizedHandle(event, caseInfo1); - }else if(SecurityEventType.PERSONNEL_GATHER_EVENT == eventType){ + } else if (SecurityEventType.PERSONNEL_GATHER_EVENT.equals(eventType)) { //人员聚集事件处理 caseInfo1 = hikService.personGatherHandle(event, caseInfo1); - }else if(SecurityEventType.MONITORING_POINT_OFFLINE == eventType){ + } else if (SecurityEventType.MONITORING_POINT_OFFLINE.equals(eventType)) { //监控点离线事件处理 caseInfo1 = hikService.monitorPointOfflineHandle(event, caseInfo1); - }else if(SecurityEventType.DEVICE_OFFLINE == eventType){ + } else if (SecurityEventType.MONITORING_POINT_ONLINE.equals(eventType)) { + //监控点上线事件处理 + hikService.monitorPointOnlineHandle(event); + } else if (SecurityEventType.DEVICE_OFFLINE.equals(eventType)) { //装置离线事件处理 caseInfo1 = hikService.deviceOfflineHandle(event, caseInfo1); - }else if(SecurityEventType.VISITOR_REGISTER == eventType){ + } else if (SecurityEventType.DEVICE_ONLINE.equals(eventType)) { + //装置上线处理 + hikService.deviceOnlineHandle(event); + } else if (SecurityEventType.VISITOR_REGISTER.equals(eventType)) { //记录访客登记记录,添加到访客记录表 hikService.visitorRegisterHandler(event); - }else if(SecurityEventType.VISITOR_CHECKOUT == eventType){ + } else if (SecurityEventType.VISITOR_CHECKOUT.equals(eventType)) { //记录访客签离记录 hikService.visitorCheckOutHandler(event); } - if(!Objects.isNull(caseInfo1) && !StringUtils.isEmpty(caseInfo1.getHappenTime())){ + if (!Objects.isNull(caseInfo1) && !StringUtils.isEmpty(caseInfo1.getHappenTime())) { caseInfos.add(caseInfo1); } } //3、安防事件入库 - if(!caseInfoService.insertCaseInfoBatch(caseInfos)){ - log.error("安防事件批量入库异常"); + if (!CollectionUtils.isEmpty(caseInfos) && !caseInfoService.insertCaseInfoBatch(caseInfos)) { + log.error("安防事件批量入库异常!"); } // TODO: 2022/8/15 webSocket推送 + if (CollectionUtils.isEmpty(caseInfos)) { + log.info("webSocket事件推送"); + webSocket.sendAllMessage(JSONObject.toJSONString(caseInfos)); + } return; } /** + * 以图搜图,前端用于轨迹追踪 + */ + @PostMapping("/hik/search/picture") + @ResponseBody + public Object searchPictures(@RequestBody SearchPicturesRequest searchPicturesRequest) { + DateTime startDateTime = DateUtil.parse(searchPicturesRequest.getStartTime()); + DateTime endDateTime = DateUtil.parse(searchPicturesRequest.getEndTime()); + String startTime = DateUtil.format(startDateTime, "yyyy-MM-dd'T'HH:mm:ss.SSSXXX"); + String endTime = DateUtil.format(endDateTime, "yyyy-MM-dd'T'HH:mm:ss.SSSXXX"); + searchPicturesRequest.setStartTime(startTime); + searchPicturesRequest.setEndTime(endTime); + String body = JSONObject.toJSONString(searchPicturesRequest); + String resultStr = HikUtil.hikApi(HikUri.SEARCH_PICTURES, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (!"0".equals(resultJson.get("code"))) { + log.error("请求海康,以图搜图失败,海康response:{}", resultStr); + return ResponseData.error("以图搜图失败"); + } + return ResponseData.success(resultJson); + } + + + /** + * 海康事件取消订阅 + */ + @PostMapping("/hik/event/cancel") + @ResponseBody + public Object eventCancelSubscribe(@RequestBody CancelSubscribeRequest cancelSubscribeRequest) { + String body = JSONObject.toJSONString(cancelSubscribeRequest); + String resultStr = HikUtil.hikApi(HikUri.EVENT_CANCEL, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (!"0".equals(resultJson.get("code"))) { + log.error("请求海康,取消订阅失败,海康response:{}", resultStr); + return ResponseData.error("取消订阅失败"); + } + return ResponseData.success(resultJson); + } + + /** * 单个添加海康人脸分组 * api->hik单个添加人脸分组api->response->mysql */ - @PostMapping("/faceGroup/single/add") + @PostMapping("/hik/faceGroup/single/add") @ResponseBody public Object faceGroupAddition(@RequestBody FaceGroupAdditionRequest faceGroupAdditionRequest) { String body = JSONObject.toJSONString(faceGroupAdditionRequest); @@ -212,7 +282,7 @@ * 批量添加海康组织 * api->hik批量添加组织api->response */ - @PostMapping("/org/batch/add") + @PostMapping("/hik/org/batch/add") @ResponseBody public Object orgBatchAdd(@RequestBody List orgBatchAddRequest) { String body = JSONObject.toJSONString(orgBatchAddRequest); @@ -232,4 +302,62 @@ return ResponseData.error("批量添加组织失败"); } + /** + * 获取人员列表 + */ + @PostMapping("/hik/person/personList") + @ResponseBody + public Object personList() { + PersonListRequest request = new PersonListRequest(); + request.setPageNo(1); + request.setPageSize(100); + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi("/api/resource/v2/person/personList", body); + return resultStr; + } + + /** + * 获取组织列表 + */ + @PostMapping("/hik/org/orgList") + @ResponseBody + public Object orgList() { + PersonListRequest request = new PersonListRequest(); + request.setPageNo(1); + request.setPageSize(100); + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi("/api/resource/v1/org/orgList", body); + return resultStr; + } + + /** + * 查询访客权限下载记录 + */ + @PostMapping("/hik/auth/result") + @ResponseBody + public Object authResult() { + PersonListRequest request = new PersonListRequest(); + request.setPageNo(1); + request.setPageSize(100); + request.setOrderId("ba101db6246711edaea66f7939a13638"); + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi("/api/visitor/v1/auth/result", body); + return resultStr; + } + + /** + * 人脸图片获取 + */ + @PostMapping("/hik/face/picture") + @ResponseBody + public Object facePicture() { + FaceRequest request = new FaceRequest(); +// List list = new ArrayList<>(); +// list.add(""); + request.setCertificateNum("wanggong"); + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi("/api/frs/v1/face", body); + return resultStr; + } + } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/AssetInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/AssetInfoMapper.java index 4f64e83..c0684ee 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/AssetInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/AssetInfoMapper.java @@ -17,6 +17,6 @@ @Mapper public interface AssetInfoMapper extends BaseMapper { - List getAssetInfoListPage(@Param("page") Page page, AssetInfoRequest assetInfoRequest); + List getAssetInfoListPage(@Param("page") Page page, @Param("assetInfoRequest") AssetInfoRequest assetInfoRequest); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/AttendanceInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/AttendanceInfoMapper.java index f9e793e..ec87e46 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/AttendanceInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/AttendanceInfoMapper.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.statistics.AttendanceNumberDTO; import com.casic.missiles.modular.dto.statistics.AttendanceRatioDTO; import com.casic.missiles.modular.model.AttendanceInfo; import org.apache.ibatis.annotations.Mapper; @@ -17,7 +18,7 @@ */ @Mapper public interface AttendanceInfoMapper extends BaseMapper { - List getAttendanceInfoListPage(@Param("page") Page page, StaffInfoRequest attendanceInfoRequest); + List getAttendanceInfoListPage(@Param("page") Page page, @Param("attendanceInfoRequest") StaffInfoRequest attendanceInfoRequest); AttendanceInfo selectByCodeAndDate(@Param("staffCode") String staffCode); @@ -26,4 +27,8 @@ List getCountByTypeAndDateForMonth(@Param("staffType")String staffType); List getCountByTypeAndDateForYear(@Param("staffType")String staffType); + + List getCountForWeek(); + + List getCountForDay(); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java index ce94b8f..6137a7d 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java @@ -17,5 +17,5 @@ @Mapper public interface BlackInfoMapper extends BaseMapper { - List getBlackInfoListPage(@Param("page") Page page, BlackInfoRequest blackInfoRequest); + List getBlackInfoListPage(@Param("page") Page page, @Param("blackInfoRequest") BlackInfoRequest blackInfoRequest); } 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 efda6b3..50aaa6f 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 @@ -20,7 +20,7 @@ List getCaseInfoListPage(@Param("page") Page page, @Param("caseInfoRequest") CaseInfoRequest caseInfoRequest); - int updateStatusById(CaseInfoRequest caseInfoRequest); + int updateStatusById(@Param("caseInfoRequest") CaseInfoRequest caseInfoRequest); List selectByLevelAndMonth(@Param("year") String year); @@ -47,4 +47,20 @@ List selectPreWeekCountByThirtyDay(); List selectPreDayCountBySevenDay(); + + Integer selectDemobilizedCount(@Param("eventType") Number personnelDemobilizedEvent); + + List selectPreMonthCount(); + + List selectListBySevenDay(); + + List selectListByToday(); + + List selectListByToday2(); + + List selectListByToday3(); + + List selectListByType(@Param("eventType") Number eventType); + + List selectDemobilizedCountByHour(@Param("eventType") Number eventType); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/CategoryLevelMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/CategoryLevelMapper.java index 52fc714..afe1650 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/CategoryLevelMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/CategoryLevelMapper.java @@ -17,9 +17,9 @@ @Mapper public interface CategoryLevelMapper extends BaseMapper { - List getCaseCategoryLevelListPage(@Param("page") Page page, CategoryLevelRequest categoryLevelRequest); + List getCaseCategoryLevelListPage(@Param("page") Page page, @Param("categoryLevelRequest") CategoryLevelRequest categoryLevelRequest); - List getCaseCategoryLevelList(CategoryLevelRequest categoryLevelRequest); + List getCaseCategoryLevelList(@Param("categoryLevelRequest") CategoryLevelRequest categoryLevelRequest); CaseCategoryLevel getCaseCategoryLevel(@Param("categoryLevelCode") String categoryLevelCode); 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 66353b1..2555a09 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 @@ -19,7 +19,7 @@ @Mapper public interface DeviceInfoMapper extends BaseMapper { - List getDeviceInfoListPage(@Param("page") Page page, DeviceInfoRequest deviceInfoRequest); + List getDeviceInfoListPage(@Param("page") Page page, @Param("deviceInfoRequest") DeviceInfoRequest deviceInfoRequest); List getDeviceInfoList(@Param("deviceInfoRequest") DeviceInfoRequest deviceInfoRequest); @@ -27,6 +27,8 @@ DeviceInfo getByIndexCode(@Param("srcIndex") String srcIndex); + DeviceInfo getByIp(@Param("ip") String ip); + List selectIndexCodesByCodes(@Param("deviceCodes") List deviceCodes); List selectByType(@Param("devType") String devType); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java index 41dd0af..5bfaf63 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java @@ -5,6 +5,7 @@ import com.casic.missiles.modular.dto.DeviceRepairRequest; import com.casic.missiles.modular.model.DeviceRepairLog; import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; import java.util.List; @@ -16,7 +17,7 @@ @Mapper public interface DeviceRepairLogMapper extends BaseMapper { - List getDeviceRepairListPage(Page page, DeviceRepairRequest deviceRepairRequest); + List getDeviceRepairListPage(@Param("page") Page page, @Param("deviceRepairRequest")DeviceRepairRequest deviceRepairRequest); - List getDeviceRepairList(DeviceRepairRequest deviceRepairRequest); + List getDeviceRepairList(@Param("deviceRepairRequest") DeviceRepairRequest deviceRepairRequest); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java index 9035c47..4823ac1 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java @@ -18,7 +18,7 @@ @Mapper public interface FireEquipInfoMapper extends BaseMapper { - List getFireEquipInfoListPage(@Param("page") Page page, FireEquipRequest fireEquipRequest); + List getFireEquipInfoListPage(@Param("page") Page page, @Param("fireEquipRequest") FireEquipRequest fireEquipRequest); FireEquipInfo getFireEquipInfo(@Param("equipCode") String equipCode); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/GateGroupMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/GateGroupMapper.java index d8c330d..977a427 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/GateGroupMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/GateGroupMapper.java @@ -17,7 +17,7 @@ */ @Mapper public interface GateGroupMapper extends BaseMapper { - List getGateGroupListPage(@Param("page") Page page, GateGroupRequest gateGroupRequest); + List getGateGroupListPage(@Param("page") Page page, @Param("gateGroupRequest") GateGroupRequest gateGroupRequest); GateGroup getGateGroupByName(@Param("groupName") String groupName); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/HazardLevelMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/HazardLevelMapper.java index 8957780..dcf47bb 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/HazardLevelMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/HazardLevelMapper.java @@ -17,11 +17,13 @@ @Mapper public interface HazardLevelMapper extends BaseMapper { - List getCaseHazardLevelListPage(@Param("page") Page page, HazardLevelRequest hazardLevelRequest); + List getCaseHazardLevelListPage(@Param("page") Page page, @Param("hazardLevelRequest") HazardLevelRequest hazardLevelRequest); - List getCaseHazardLevelList(HazardLevelRequest hazardLevelRequest); + List getCaseHazardLevelList(@Param("hazardLevelRequest") HazardLevelRequest hazardLevelRequest); CaseHazardLevel getCaseHazardLevel(@Param("hazardLevelCode") String hazardLevelCode); List selectHazardName(); + + String selectHazardNameByCode(@Param("hazardLevelCode") String hazardLevelCode); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/HikCaseDefineMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/HikCaseDefineMapper.java index 0dc47d1..f162fef 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/HikCaseDefineMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/HikCaseDefineMapper.java @@ -12,5 +12,5 @@ */ @Mapper public interface HikCaseDefineMapper extends BaseMapper { - HikCaseDefine getHikCaseDefine(@Param("caseTypeCode") Long caseTypeCode); + HikCaseDefine getHikCaseDefine(@Param("caseTypeCode") Number caseTypeCode); } 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 f8a674c..fe5afc2 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 @@ -17,11 +17,13 @@ @Mapper public interface StaffInfoMapper extends BaseMapper { - List getStaffInfoListPage(@Param("page") Page page, StaffInfoRequest staffInfoRequest); + List getStaffInfoListPage(@Param("page") Page page, @Param("staffInfoRequest") StaffInfoRequest staffInfoRequest); StaffInfo selectByCode(@Param("staffCode") String staffCode); - List getStaffInfoList(StaffInfoRequest staffInfoRequest); + List getStaffInfoList(@Param("staffInfoRequest") StaffInfoRequest staffInfoRequest); - List selectBatchCodes(List list); + List selectBatchCodes(@Param("list") List list); + + int updateByCodeForCard(@Param("staffCode") String staffCode, @Param("cardNo") String cardNo); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitInfoMapper.java index b1217c5..6c52542 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitInfoMapper.java @@ -16,7 +16,7 @@ */ @Mapper public interface VisitInfoMapper extends BaseMapper { - List getVisitInfoListPage(@Param("page") Page page, VisitorRequest visitorRequest); + List getVisitInfoListPage(@Param("page") Page page, @Param("visitorRequest") VisitorRequest visitorRequest); VisitInfo selectByOrderId(@Param("orderId") String orderId); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitorApplyMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitorApplyMapper.java index c09f3c0..6ea55bd 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitorApplyMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitorApplyMapper.java @@ -18,7 +18,7 @@ @Mapper public interface VisitorApplyMapper extends BaseMapper { - List getVisitorApplyListPage(@Param("page") Page page, VisitorApplyRequest visitorApplyRequest); + List getVisitorApplyListPage(@Param("page") Page page, @Param("visitorApplyRequest") VisitorApplyRequest visitorApplyRequest); List selectByVisitReason(); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/AttendanceInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/AttendanceInfoMapper.xml index b2ece71..f8bdd6e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/AttendanceInfoMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/AttendanceInfoMapper.xml @@ -43,7 +43,8 @@ and staff_type = #{staffType} - and YEARWEEK(date_format(atte_date, '%Y-%m-%d'), 1) = YEARWEEK(now(),1); + AND DATE_SUB(CURDATE(), INTERVAL 7 DAY) <= DATE(atte_date) + GROUP BY DATE_FORMAT(atte_date, '%Y-%m-%d') @@ -69,4 +70,20 @@ GROUP BY DATE_FORMAT(atte_date, '%Y-%m') + + + \ No newline at end of file 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 2b6953f..06ec0a8 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 @@ -28,7 +28,9 @@ @@ -87,7 +89,8 @@ SELECT hazard_level_code as levelCode, count(id) as quantity FROM bus_case_info WHERE hazard_level_code is not null - AND DATE_SUB(CURDATE(), INTERVAL 7 DAY) <= date(happen_time); + AND is_key_area = 1 + AND DATE_SUB(CURDATE(), INTERVAL 7 DAY) <= date(happen_time) GROUP BY hazard_level_code @@ -95,7 +98,8 @@ SELECT hazard_level_code as levelCode, count(id) as quantity FROM bus_case_info WHERE hazard_level_code is not null - AND DATE_SUB(CURDATE(), INTERVAL 30 DAY) <= date(happen_time); + AND is_key_area = 1 + AND DATE_SUB(CURDATE(), INTERVAL 30 DAY) <= date(happen_time) GROUP BY hazard_level_code @@ -122,4 +126,71 @@ AND hazard_level_code is not null GROUP BY DATE_FORMAT(happen_time,'%Y-%m-%d') + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/CategoryLevelMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/CategoryLevelMapper.xml index 4670b1f..1d25cbd 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/CategoryLevelMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/CategoryLevelMapper.xml @@ -20,11 +20,11 @@ SELECT * FROM bus_case_category_level WHERE 1=1 - - and code = #{code} + + and code = #{categoryLevelRequest.code} - - and name = #{name} + + and name = #{categoryLevelRequest.name} ORDER by create_time DESC 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 9b66fd8..bfd84b7 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 @@ -98,4 +98,10 @@ #{item} + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceRepairLogMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceRepairLogMapper.xml index 078ed3c..cf1a481 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceRepairLogMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceRepairLogMapper.xml @@ -22,14 +22,14 @@ SELECT * FROM bus_device_repair_log WHERE 1=1 - - and device_code = #{devCode} + + and device_code = #{deviceRepairRequest.devCode} - - and device_name = #{devName} + + and device_name = #{deviceRepairRequest.devName} - - and DATE_FORMAT(create_time,"%y%m%d") = DATE_FORMAT(#{createTime},"%y%m%d") + + and DATE_FORMAT(create_time,"%y%m%d") = DATE_FORMAT(#{deviceRepairRequest.createTime},"%y%m%d") ORDER by create_time DESC diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/HazardLevelMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/HazardLevelMapper.xml index f16f2b9..458322b 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/HazardLevelMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/HazardLevelMapper.xml @@ -20,11 +20,11 @@ SELECT * FROM bus_case_hazard_level WHERE 1=1 - - and code = #{code} + + and code = #{hazardLevelRequest.code} - - and name = #{name} + + and name = #{hazardLevelRequest.name} ORDER by create_time DESC @@ -42,4 +42,10 @@ SELECT name FROM bus_case_hazard_level + + \ 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 557237e..b6a183a 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 @@ -50,4 +50,10 @@ + + + UPDATE bus_staff_info + SET card_no = #{cardNo} + WHERE staff_code = #{staffCode} + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitInfoMapper.xml index 84aa84f..230529a 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitInfoMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitInfoMapper.xml @@ -27,5 +27,6 @@ SELECT * FROM bus_visit_info WHERE order_id = #{orderId} and DATE_FORMAT(in_time,'%Y-%m-%d') = CURRENT_DATE + limit 1 \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/BlackPictureRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/BlackPictureRequest.java new file mode 100644 index 0000000..fc92701 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/BlackPictureRequest.java @@ -0,0 +1,14 @@ +package com.casic.missiles.modular.dto; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/29 19:26 + */ +@Data +public class BlackPictureRequest { + private String picUri; + private String serverIndexCode; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/CancelSubscribeRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/CancelSubscribeRequest.java new file mode 100644 index 0000000..e2d390a --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/CancelSubscribeRequest.java @@ -0,0 +1,15 @@ +package com.casic.missiles.modular.dto.hik; + +import lombok.Data; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/24 15:14 + */ +@Data +public class CancelSubscribeRequest { + private List eventTypes; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/CardInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/CardInfo.java new file mode 100644 index 0000000..341457d --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/CardInfo.java @@ -0,0 +1,24 @@ +package com.casic.missiles.modular.dto.hik; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/26 16:08 + */ +@Data +public class CardInfo { + //卡号,8~20个字符,支持数字和大写字母 + private String cardNo; + //人员ID,员工工号 + private String personId; + //人员所属组织IndexCode + private String orgIndexCode; + //卡片类型,默认是1:IC卡 + //1:IC卡 + //2:CPU卡 + //3:远距离卡 + //4:MIFARE卡 + private Number cardType; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/FaceRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/FaceRequest.java new file mode 100644 index 0000000..edc04bf --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/FaceRequest.java @@ -0,0 +1,16 @@ +package com.casic.missiles.modular.dto.hik; + +import lombok.Data; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/25 16:53 + */ +@Data +public class FaceRequest { + private String certificateNum; + private List indexCodes; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/HikRecvEvent.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/HikRecvEvent.java index a3e9845..1b2b2b1 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/HikRecvEvent.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/HikRecvEvent.java @@ -28,12 +28,12 @@ /** * 事件类型,用于判断所需接收到的事件类型 */ - public Long getEventType(){ + public Number getEventType(){ JSONObject jsonObject = (JSONObject)JSONObject.toJSON(params); //事件类别对应SecurityEventTypeEnum JSONArray eventTypeArray = (JSONArray)jsonObject.get("events"); JSONObject eventJsonObject = (JSONObject)JSONObject.toJSON(eventTypeArray.get(0)); - Long eventType = (Long) eventJsonObject.get("eventType"); + Number eventType = (Number) eventJsonObject.get("eventType"); return eventType; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonBatchDeleteRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonBatchDeleteRequest.java index 027d31d..9751929 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonBatchDeleteRequest.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonBatchDeleteRequest.java @@ -12,4 +12,6 @@ @Data public class PersonBatchDeleteRequest { private List personIds; + //删除人脸接口使用 + private String faceId; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonInfoRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonInfoRequest.java new file mode 100644 index 0000000..05dc9e1 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonInfoRequest.java @@ -0,0 +1,20 @@ +package com.casic.missiles.modular.dto.hik; + +import lombok.Data; + +import java.util.List; + +/** + * @Description: 获取员工照片请求实体 + * @Author: wangpeng + * @Date: 2022/8/25 16:53 + */ +@Data +public class PersonInfoRequest { + //获取员工详细信息使用 + private String paramName; + private List paramValue; + //获取照片使用 + private String picUri; + private String serverIndexCode; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonListRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonListRequest.java new file mode 100644 index 0000000..3f7149b --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonListRequest.java @@ -0,0 +1,16 @@ +package com.casic.missiles.modular.dto.hik; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/25 16:53 + */ +@Data +public class PersonListRequest { + private Number pageNo; + private Number pageSize; + + private String orderId; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/SearchPicturesRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/SearchPicturesRequest.java new file mode 100644 index 0000000..0a95966 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/SearchPicturesRequest.java @@ -0,0 +1,24 @@ +package com.casic.missiles.modular.dto.hik; + +import lombok.Data; + +import java.util.List; + +/** + * @Description: 以图搜图请求 + * @Author: wangpeng + * @Date: 2022/8/29 10:46 + */ +@Data +public class SearchPicturesRequest { + private String facePicBinaryData; + private String facePicUrl; + private List cameraIndexCodes; + private String startTime; + private String endTime; + //指定搜图的最小相似度,最小为1,最大为100 + private String minSimilarity; + private Number age; + //male-男性,female-女性 + private String sex; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/StaffCardRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/StaffCardRequest.java new file mode 100644 index 0000000..4052e6d --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/StaffCardRequest.java @@ -0,0 +1,20 @@ +package com.casic.missiles.modular.dto.hik; + +import lombok.Data; + +import java.util.List; + +/** + * @Description: 人员开卡请求实体 + * @Author: wangpeng + * @Date: 2022/8/26 16:05 + */ +@Data +public class StaffCardRequest { + //卡片开始有效时间,时间格式:yyyy-MM-dd + private String startDate; + //卡片截止有效时间,时间格式:yyyy-MM-dd,不能大于2037年12月31日 + private String endDate; + //cardList,待开卡列表,最大支持50张卡 + private List cardList; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/VisitorInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/VisitorInfo.java index 73aa316..b99f301 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/VisitorInfo.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/VisitorInfo.java @@ -14,7 +14,7 @@ //访客性别 //1: 男 //2: 女 - private String gender; + private Integer gender; //联系电话建议填写手机号码 private String phoneNo; //证件类型 diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/ApplyReasonGroupDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/ApplyReasonGroupDTO.java index 514f382..786143e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/ApplyReasonGroupDTO.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/ApplyReasonGroupDTO.java @@ -13,4 +13,6 @@ private String visitReason; //访问人数 private Integer quantity; + //占比 + private String ratio; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/AttendanceNumberDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/AttendanceNumberDTO.java new file mode 100644 index 0000000..a494321 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/AttendanceNumberDTO.java @@ -0,0 +1,24 @@ +package com.casic.missiles.modular.dto.statistics; + +import com.fasterxml.jackson.annotation.JsonIgnore; +import lombok.Data; + +/** + * @Description: 出勤人数统计实体 + * @Author: wangpeng + * @Date: 2022/8/31 19:24 + */ +@Data +public class AttendanceNumberDTO { + //日期维度,周、今日,入参 + @JsonIgnore + private String dateDimension; + + //日期,具体天/小时,出参 + private String date; + //出勤人数 + private String quantity; + //员工类型 + private String staffType; + +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/AvgMonthAndWeekGroupDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/AvgMonthAndWeekGroupDTO.java index 4366916..331a9a9 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/AvgMonthAndWeekGroupDTO.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/AvgMonthAndWeekGroupDTO.java @@ -2,8 +2,6 @@ import lombok.Data; -import java.util.Map; - /** * @Description: 平均每月和每周的数据实体 * @Author: wangpeng @@ -13,6 +11,4 @@ public class AvgMonthAndWeekGroupDTO { //入参 private String year; - //出参,key:事件类型,value:周和月数据平均值 - private Map map; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/GateStatusGroupResponse.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/GateStatusGroupResponse.java new file mode 100644 index 0000000..d16f4e5 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/GateStatusGroupResponse.java @@ -0,0 +1,16 @@ +package com.casic.missiles.modular.dto.statistics; + +import lombok.Data; + +/** + * @Description: 闸机/摄像机统计响应实体 + * @Author: wangpeng + * @Date: 2022/8/30 14:22 + */ +@Data +public class GateStatusGroupResponse { + //设备状态 + private String status; + //占比 + private String ratio; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/MonthAndWeekDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/MonthAndWeekDTO.java index 7482b2a..284115a 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/MonthAndWeekDTO.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/MonthAndWeekDTO.java @@ -9,7 +9,7 @@ */ @Data public class MonthAndWeekDTO { -// private String levelName; + private String levelName; private Integer monthQuantity; private Integer weekQuantity; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/OnDutyRatioDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/OnDutyRatioDTO.java new file mode 100644 index 0000000..4f6a65d --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/OnDutyRatioDTO.java @@ -0,0 +1,15 @@ +package com.casic.missiles.modular.dto.statistics; + +import lombok.Data; + +/** + * @Description: 在岗率统计实体 + * @Author: wangpeng + * @Date: 2022/9/2 21:24 + */ +@Data +public class OnDutyRatioDTO { + private String date; + private String quantity; + private String ratio; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/SecurityLevelAssessDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/SecurityLevelAssessDTO.java new file mode 100644 index 0000000..40a0738 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/SecurityLevelAssessDTO.java @@ -0,0 +1,15 @@ +package com.casic.missiles.modular.dto.statistics; + +import lombok.Data; + +/** + * @Description: 出勤人数统计实体 + * @Author: wangpeng + * @Date: 2022/8/31 19:24 + */ +@Data +public class SecurityLevelAssessDTO { + private String date; + private String quantity; + private Double score; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/SecurityScoreDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/SecurityScoreDTO.java index 304d169..f7bd4a2 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/SecurityScoreDTO.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/SecurityScoreDTO.java @@ -14,5 +14,5 @@ //楼层,出参 private String area; //评分,出参 - private String score; + private Double score; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/BlackListController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/BlackListController.java index a27f9f8..0c06661 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/BlackListController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/BlackListController.java @@ -1,13 +1,18 @@ package com.casic.missiles.modular.controller; +import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.base.controller.ExportController; import com.casic.missiles.core.page.PageFactory; import com.casic.missiles.model.response.ResponseData; import com.casic.missiles.modular.dto.BlackInfoRequest; +import com.casic.missiles.modular.dto.BlackPictureRequest; +import com.casic.missiles.modular.dto.hik.PersonInfoRequest; +import com.casic.missiles.modular.enums.HikUri; import com.casic.missiles.modular.enums.OperateTypeEnum; import com.casic.missiles.modular.model.BlackInfo; import com.casic.missiles.modular.service.BlackInfoService; +import com.casic.missiles.modular.util.HikUtil; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; @@ -56,4 +61,22 @@ return null; } + /** + * 黑名单人员照片 + */ + @PostMapping("/personPicture") + @ResponseBody + public Object personPicture(@RequestBody BlackPictureRequest blackPictureRequest){ + //获取照片 + String picUri = blackPictureRequest.getPicUri(); + String serverIndexCode = blackPictureRequest.getServerIndexCode(); + PersonInfoRequest picRequest = new PersonInfoRequest(); + picRequest.setPicUri(picUri); + picRequest.setServerIndexCode(serverIndexCode); + String reBody = JSONObject.toJSONString(picRequest); + //重定向地址获取 + String url = HikUtil.hikApiFor302(HikUri.PERSON_PICTURE, reBody); + return ResponseData.success(url); + } + } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/DeviceController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/DeviceController.java index e1c4eba..666bbee 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/DeviceController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/DeviceController.java @@ -107,7 +107,7 @@ } /** - * 设备维修管理查询(分页),需计算MTTR=总维修时间/故障次数 + * 设备状态计算与评判/设备维修管理查询(分页),需计算MTTR=总维修时间/故障次数 */ @PostMapping("/repair/listPage") @ResponseBody @@ -211,7 +211,7 @@ //需根据设备编号获取到对应的门禁点唯一标识 doorControlRequest.setDoorIndexCodes(indexCodes); doorControlRequest.setControlType(Integer.valueOf(gateGroupDTO.getStatus())); - String body = JSONObject.toJSONString(deviceCodes); + String body = JSONObject.toJSONString(doorControlRequest); String resultStr = HikUtil.hikApi(HikUri.DOOR_CONTROL, body); JSONObject resultJson = (JSONObject)JSONObject.parse(resultStr); if (!"0".equals(resultJson.get("code"))) { diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/StaffController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/StaffController.java index b58ccab..704093c 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/StaffController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/StaffController.java @@ -2,15 +2,21 @@ import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.util.StrUtil; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.base.controller.ExportController; import com.casic.missiles.core.page.PageFactory; import com.casic.missiles.model.response.ErrorResponseData; import com.casic.missiles.model.response.ResponseData; import com.casic.missiles.modular.dto.StaffInfoRequest; +import com.casic.missiles.modular.dto.hik.PersonInfoRequest; +import com.casic.missiles.modular.dto.hik.StaffCardRequest; +import com.casic.missiles.modular.enums.HikUri; import com.casic.missiles.modular.enums.OperateTypeEnum; import com.casic.missiles.modular.model.StaffInfo; import com.casic.missiles.modular.service.StaffInfoService; +import com.casic.missiles.modular.util.HikUtil; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; @@ -110,4 +116,60 @@ } return ResponseData.success(); } + + /** + * 批量开卡,添加人员之后调用,若在一个接口中添加人员成功开卡失败则第二次添加时会有问题 + */ + @PostMapping("/cardBinding") + @ResponseBody + public Object cardBinding(@RequestBody StaffCardRequest staffCardRequest) { + String body = JSONObject.toJSONString(staffCardRequest); + String resultStr = HikUtil.hikApi(HikUri.CARD_BINDING, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (!"0".equals(resultJson.get("code"))) { + log.error("请求海康,批量开卡失败,海康response:{}", resultStr); + return ResponseData.error("批量开卡失败"); + } + //保存卡号 + if(staffInfoService.saveCardInfo(staffCardRequest) > 0){ + return ResponseData.success(); + } + return ResponseData.error("批量开卡失败"); + } + + /** + * 获取员工照片,海康存储 + */ + @PostMapping("/personPicture/{staffCode}") + @ResponseBody + public Object personPicture(@PathVariable("staffCode") String staffCode){ + //获取员工详细信息,含图片服务器、uri + PersonInfoRequest request = new PersonInfoRequest(); + List list = new ArrayList<>(); + list.add(staffCode); + request.setParamName("personId"); + request.setParamValue(list); + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi(HikUri.PERSON_INFO, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (!"0".equals(resultJson.get("code"))) { + log.error("请求海康,根据人员唯一字段获取人员详细信息失败,海康response:{}", resultStr); + return ResponseData.error("获取员工照片失败"); + } + //获取照片 + JSONObject data = (JSONObject) resultJson.get("data"); + JSONArray dataArray = (JSONArray) data.get("list"); + JSONObject jsonObject = (JSONObject) dataArray.get(0); + JSONArray personPhoto = (JSONArray) jsonObject.get("personPhoto"); + JSONObject photo = (JSONObject) personPhoto.get(0); + String picUri = photo.getString("picUri"); + String serverIndexCode = photo.getString("serverIndexCode"); + PersonInfoRequest picRequest = new PersonInfoRequest(); + picRequest.setPicUri(picUri); + picRequest.setServerIndexCode(serverIndexCode); + String reBody = JSONObject.toJSONString(picRequest); + //重定向地址获取 + String url = HikUtil.hikApiFor302(HikUri.PERSON_PICTURE, reBody); + return ResponseData.success(url); + } } 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 4a07dd9..7b1dcf6 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 @@ -16,6 +16,7 @@ import com.casic.missiles.modular.redis.key.CacheKeys; import com.casic.missiles.modular.service.CockpitService; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.util.CollectionUtils; import org.springframework.web.bind.annotation.*; @@ -24,10 +25,7 @@ import java.text.NumberFormat; import java.time.LocalDateTime; import java.time.temporal.ChronoUnit; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.util.*; import java.util.stream.Collectors; /** @@ -73,6 +71,9 @@ private StatisticNumberMapper numberMapper; @Autowired + private HazardLevelMapper hazardLevelMapper; + + @Autowired private AccessGroupConfig accessGroupConfig; /** @@ -104,8 +105,24 @@ public Object buildingNumberPerHour(){ //当天按小时分组的人数 List list = numberMapper.selectListByTime(); - Map> collect = list.stream().collect(Collectors.groupingBy(BuildingNumberDTO::getStatisticPosition)); - return ResponseData.success(collect); + Map> collect = list.stream().collect(Collectors.groupingBy(BuildingNumberDTO::getStatisticTime)); + //定时任务中已将每小时三栋楼人数存到数据库 + //将一期主楼和录制楼人数合并,二期单算 + List> resultList = new ArrayList<>(); + collect.keySet().forEach(key -> { + List buildingNumberDTOS = collect.get(key); + BuildingNumberDTO mainBuildingOne = buildingNumberDTOS.get(0); + BuildingNumberDTO mainBuildingTwo = buildingNumberDTOS.get(1); + BuildingNumberDTO recordingBuilding = buildingNumberDTOS.get(2); + HashMap resultMap = new HashMap<>(); + Integer oneQuantity = Integer.valueOf(mainBuildingOne.getStatisticQuantity()); + Integer recordingQuantity = Integer.valueOf(recordingBuilding.getStatisticQuantity()); + resultMap.put("staticTime", mainBuildingOne.getStatisticTime()); + resultMap.put(mainBuildingOne.getStatisticPositionName()+"、"+recordingBuilding.getStatisticPositionName(), String.valueOf(oneQuantity+recordingQuantity)); + resultMap.put(mainBuildingTwo.getStatisticPositionName(), mainBuildingTwo.getStatisticQuantity()); + resultList.add(resultMap); + }); + return ResponseData.success(resultList); } /** @@ -151,12 +168,11 @@ public Object securityNumber() { QueryWrapper wrapper = new QueryWrapper<>(); wrapper.eq("staff_type", 2); + // TODO: 2022/9/2 后续使用产品确定的每天出勤的安保人员的数量 Integer total = staffInfoMapper.selectCount(wrapper); - //当日离岗事件个数 - QueryWrapper wrapper1 = new QueryWrapper<>(); - wrapper1.eq("hik_event_type", SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); - wrapper1.apply("date_format(now(),'%Y-%m-%d') = date_format(happen_time,'%Y-%m-%d')"); - Integer leave = caseInfoMapper.selectCount(wrapper1); + //当日离岗事件按设备去重后的个数 + // TODO: 2022/9/2 目前相当于24小时内的计算,之后看需要可改成自定义小时数计算离岗率,即离岗+6小时内仅一次离岗则恢复为100%,多次则累加离岗次数计算离岗率 + Integer leave = caseInfoMapper.selectDemobilizedCount(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); NumberFormat numberFormat = NumberFormat.getInstance(); // 设置精确到小数点后2位 numberFormat.setMaximumFractionDigits(2); @@ -179,7 +195,6 @@ @ResponseBody public Object visitorApplyDetail() { List reasonGroup = applyMapper.selectByVisitReason(); - HashMap resultMap = new HashMap<>(); NumberFormat numberFormat = NumberFormat.getInstance(); // 设置精确到小数点后2位 numberFormat.setMaximumFractionDigits(2); @@ -187,12 +202,17 @@ if(0 == sum){ return ResponseData.success(); } + List resultList = new ArrayList<>(); reasonGroup.forEach(group -> { String reasonName = dictService.getDictNameByCode(SecurityEventDict.VISIT_REASON, group.getVisitReason()); String result = numberFormat.format((float) group.getQuantity() / (float) sum * 100); - resultMap.put(reasonName, result+"%"); + ApplyReasonGroupDTO applyReasonGroupDTO = new ApplyReasonGroupDTO(); + applyReasonGroupDTO.setQuantity(group.getQuantity()); + applyReasonGroupDTO.setVisitReason(reasonName); + applyReasonGroupDTO.setRatio(result+"%"); + resultList.add(applyReasonGroupDTO); }); - return ResponseData.success(resultMap); + return ResponseData.success(resultList); } /** @@ -247,6 +267,32 @@ } /** + * 机动力量实时在岗率,在岗人数除以总应在岗人数,用离岗+6小时内恢复为100%,6小时外再计算 + */ + @GetMapping("/staff/beOnDutyRatio") + @ResponseBody + public Object beOnDutyRatio() { + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("staff_type", 2); + // TODO: 2022/9/2 后续使用产品确定的每天出勤的安保人员的数量 + Integer total = staffInfoMapper.selectCount(wrapper); + if(0 == total){ + return ResponseData.success(null); + } + //当日离岗事件按设备去重后的个数 + // TODO: 2022/9/2 目前相当于24小时内的计算,之后看需要可改成自定义小时数计算离岗率,即离岗+6小时内仅一次离岗则恢复为100%,多次则累加离岗次数计算离岗率 + List onDutyRatioDTOS = caseInfoMapper.selectDemobilizedCountByHour(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); + onDutyRatioDTOS.forEach(dto -> { + NumberFormat numberFormat = NumberFormat.getInstance(); + // 设置精确到小数点后2位 + numberFormat.setMaximumFractionDigits(2); + String result = numberFormat.format(100 - Float.valueOf(dto.getQuantity()) / (float) total * 100); + dto.setRatio(result+"%"); + }); + return ResponseData.success(onDutyRatioDTOS); + } + + /** * 闸机速通门统计-设备状态分组计算数量,devType传闸机字典key * 视频频监控摄像机统计-设备状态分组计算数量,devType传摄像头字典key */ @@ -262,12 +308,17 @@ if(sum <= 0){ return ResponseData.error("无该类设备信息"); } + List resultList = new ArrayList<>(); gateStatusGroup.forEach(group -> { String devStatus = dictService.getDictNameByCode(SecurityEventDict.DEVICE_STATUS, group.getStatus()); String result = numberFormat.format((float) group.getQuantity() / (float) sum * 100); - resultMap.put(devStatus, result+"%"); + GateStatusGroupResponse gateStatusGroupResponse = new GateStatusGroupResponse(); + gateStatusGroupResponse.setStatus(devStatus); + gateStatusGroupResponse.setRatio(result+"%"); + resultList.add(gateStatusGroupResponse); }); - resultMap.put("总", sum); + resultMap.put("total", sum); + resultMap.put("list", resultList); return ResponseData.success(resultMap); } @@ -282,17 +333,38 @@ String position = securityScoreDTO.getPosition(); List caseInfos = caseInfoMapper.selectByPosition(position); //查询各危险级别权重、各类别权重,放入map,避免循环中多次查数据库 - + HashMap hazardScoreMap = new HashMap<>(); + List caseHazardLevelList = hazardLevelMapper.getCaseHazardLevelList(null); + caseHazardLevelList.forEach(hazardLevel -> { + hazardScoreMap.put(hazardLevel.getCode(), hazardLevel.getWeight()); + }); + HashMap categoryScoreMap = new HashMap<>(); + List categoryLevelList = categoryLevelMapper.getCaseCategoryLevelList(null); + categoryLevelList.forEach(categoryLevel -> { + categoryScoreMap.put(categoryLevel.getCode(), categoryLevel.getWeight()); + }); + //事件按楼层分组,计算 List securityScoreDTOs = new ArrayList<>(); caseInfos.forEach(caseInfo -> { SecurityScoreDTO securityScoreDTO1 = new SecurityScoreDTO(); + securityScoreDTO1.setPosition(caseInfo.getPosition()); securityScoreDTO1.setArea(caseInfo.getArea()); - // TODO: 2022/8/4 楼层评分计算根据产品定义调整 -// caseInfo.get -// securityScoreDTO1.setScore(); + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); + Double score = 100 - Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + securityScoreDTO1.setScore(score); + securityScoreDTOs.add(securityScoreDTO1); }); - - return null; + 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); + }); + return ResponseData.success(securityScoreDTOs); } /** @@ -303,9 +375,13 @@ public Object SecurityFrequency(@RequestBody SecurityFrequencyDTO securityFrequencyDTO) { String year = securityFrequencyDTO.getYear(); String month = securityFrequencyDTO.getMonth(); - Integer quantity = caseInfoMapper.selectCountByMonth(year, month); - securityFrequencyDTO.setQuantity(quantity); - return ResponseData.success(securityFrequencyDTO); + if(!StringUtils.isEmpty(year) && StringUtils.isEmpty(month)){ + Integer quantity = caseInfoMapper.selectCountByMonth(year, month); + securityFrequencyDTO.setQuantity(quantity); + return ResponseData.success(securityFrequencyDTO); + } + List list = caseInfoMapper.selectPreMonthCount(); + return ResponseData.success(list); } } 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 ae4d770..f4f075c 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 @@ -1,20 +1,25 @@ package com.casic.missiles.modular.controller.cockpit; +import cn.hutool.core.date.DateUnit; import cn.hutool.core.date.DateUtil; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.casic.missiles.model.response.ResponseData; -import com.casic.missiles.modular.dao.AttendanceInfoMapper; -import com.casic.missiles.modular.dao.CaseInfoMapper; -import com.casic.missiles.modular.dao.HazardLevelMapper; -import com.casic.missiles.modular.dao.StaffInfoMapper; +import com.casic.missiles.modular.dao.*; +import com.casic.missiles.modular.dto.DeviceRepairLogDTO; +import com.casic.missiles.modular.dto.DeviceRepairRequest; import com.casic.missiles.modular.dto.statistics.*; +import com.casic.missiles.modular.enums.SecurityEventType; +import com.casic.missiles.modular.model.CaseCategoryLevel; import com.casic.missiles.modular.model.CaseHazardLevel; +import com.casic.missiles.modular.model.CaseInfo; import com.casic.missiles.modular.model.StaffInfo; +import com.casic.missiles.modular.service.DeviceInfoService; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.util.CollectionUtils; import org.springframework.web.bind.annotation.*; +import java.math.BigDecimal; import java.text.NumberFormat; import java.util.*; import java.util.stream.Collectors; @@ -40,6 +45,12 @@ @Autowired private HazardLevelMapper hazardLevelMapper; + @Autowired + private CategoryLevelMapper categoryLevelMapper; + + @Autowired + private DeviceInfoService deviceInfoService; + /** * 安防事件时域频次统计,每月的每天安防事件个数(原方案) * 月维度:展示每个月的每天的数据 @@ -89,15 +100,17 @@ List monthList = caseInfoMapper.selectPreMonthCountByYear(year); Map> collect = monthList.stream().collect(Collectors.groupingBy(PreMonthOrWeekCaseDTO::getHazardLevelCode)); HashMap strAvgMap = new HashMap<>(); + List resultList = new ArrayList<>(); for (String key : collect.keySet()) { List preMonthOrWeekCaseDTOS = collect.get(key); int sum = preMonthOrWeekCaseDTOS.stream().mapToInt(PreMonthOrWeekCaseDTO::getQuantity).sum(); //若年份是本年,则使用个安防级别数量/当前月份数 //若不是本年,除数为12 MonthAndWeekDTO monthAndWeekDTO = new MonthAndWeekDTO(); + String hazardName = hazardLevelMapper.selectHazardNameByCode(key); + monthAndWeekDTO.setLevelName(hazardName); if(year.equals(String.valueOf(DateUtil.thisYear()))){ monthAndWeekDTO.setMonthQuantity(sum / DateUtil.thisMonth()); -// monthAndWeekDTO.setLevelName(); strAvgMap.put(key, monthAndWeekDTO); }else{ monthAndWeekDTO.setMonthQuantity(sum / 12); @@ -113,27 +126,37 @@ if(year.equals(String.valueOf(DateUtil.thisYear()))){ if(!Objects.isNull(strAvgMap.get(key))){ MonthAndWeekDTO monthAndWeekDTO = strAvgMap.get(key); + String hazardName = hazardLevelMapper.selectHazardNameByCode(key); + monthAndWeekDTO.setLevelName(hazardName); monthAndWeekDTO.setWeekQuantity(sum / DateUtil.thisWeekOfYear()); strAvgMap.put(key, monthAndWeekDTO); }else{ MonthAndWeekDTO monthAndWeekDTO = new MonthAndWeekDTO(); + String hazardName = hazardLevelMapper.selectHazardNameByCode(key); + monthAndWeekDTO.setLevelName(hazardName); monthAndWeekDTO.setWeekQuantity(sum / DateUtil.thisWeekOfYear()); strAvgMap.put(key, monthAndWeekDTO); } }else{ if(!Objects.isNull(strAvgMap.get(key))){ MonthAndWeekDTO monthAndWeekDTO = strAvgMap.get(key); + String hazardName = hazardLevelMapper.selectHazardNameByCode(key); + monthAndWeekDTO.setLevelName(hazardName); monthAndWeekDTO.setWeekQuantity(sum / 52); strAvgMap.put(key, monthAndWeekDTO); }else{ MonthAndWeekDTO monthAndWeekDTO = new MonthAndWeekDTO(); + String hazardName = hazardLevelMapper.selectHazardNameByCode(key); + monthAndWeekDTO.setLevelName(hazardName); monthAndWeekDTO.setWeekQuantity(sum / 52); strAvgMap.put(key, monthAndWeekDTO); } } } - avgMonthAndWeekGroupDTO.setMap(strAvgMap); - return ResponseData.success(avgMonthAndWeekGroupDTO); + strAvgMap.keySet().forEach(key -> { + resultList.add(strAvgMap.get(key)); + }); + return ResponseData.success(resultList); } /** @@ -181,12 +204,178 @@ } /** - * 员工考勤人数变化,功能待定 + * 员工考勤人数变化,统计当天(横坐标为时)及近7天(横坐标为天)的考勤人数变化,只要发生一次考勤识别,次数的基数就正常增加(没有上班下班区分) */ + @PostMapping("/staff/attendanceNumber/{dimension}") + @ResponseBody + public Object attendanceNumber(@PathVariable("dimension") String dimension) { + List attendanceNumberDTOs = null; + List> resultList = new ArrayList<>(); + if("week".equals(dimension)){ + //近7天数据按天分组统计 + attendanceNumberDTOs = attendanceInfoMapper.getCountForWeek(); + }else if("day".equals(dimension)) { + //今天数据按小时分组统计 + attendanceNumberDTOs = attendanceInfoMapper.getCountForDay(); + } + if(CollectionUtils.isEmpty(attendanceNumberDTOs)){ + return ResponseData.error("该查询条件下,无员工出勤数据!"); + } + Map> collect = attendanceNumberDTOs.stream().collect(Collectors.groupingBy(AttendanceNumberDTO::getDate)); + collect.keySet().forEach(key -> { + List attendanceNumberDTOS = collect.get(key); + AttendanceNumberDTO attendanceNumberDTO = attendanceNumberDTOS.get(0); + AttendanceNumberDTO attendanceNumberDTO2 = attendanceNumberDTOS.get(1); + Map resultMap = new HashMap<>(); + resultMap.put(attendanceNumberDTO.getStaffType(), attendanceNumberDTO.getQuantity()); + resultMap.put(attendanceNumberDTO2.getStaffType(), attendanceNumberDTO2.getQuantity()); + resultMap.put("staticTime", attendanceNumberDTO.getDate()); + resultList.add(resultMap); + }); + return ResponseData.success(resultList); + } /** - * 近30天/近一周安保人员到岗排行 + * 早晚高峰区域安防评估 */ + @PostMapping("/security/assessment/{dimension}") + @ResponseBody + public Object securityAssessment(@PathVariable("dimension") String dimension) { + //查询各危险级别权重、各类别权重,放入map,避免循环中多次查数据库 + HashMap hazardScoreMap = new HashMap<>(); + List caseHazardLevelList = hazardLevelMapper.getCaseHazardLevelList(null); + caseHazardLevelList.forEach(hazardLevel -> { + hazardScoreMap.put(hazardLevel.getCode(), hazardLevel.getWeight()); + }); + HashMap categoryScoreMap = new HashMap<>(); + List categoryLevelList = categoryLevelMapper.getCaseCategoryLevelList(null); + categoryLevelList.forEach(categoryLevel -> { + categoryScoreMap.put(categoryLevel.getCode(), categoryLevel.getWeight()); + }); + HashMap hashMap = new HashMap<>(); + if("week".equals(dimension)){ + //近7天早晚高峰数据 + List caseInfos = caseInfoMapper.selectListBySevenDay(); + //按时间(天)进行分组 + caseInfos.forEach(caseInfo -> { + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); + Double score = Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + String[] array = caseInfo.getHappenTime().split(" "); + String dayTime = array[0]; + BigDecimal preScore; + if(hashMap.containsKey(dayTime)){ + Double aDouble = hashMap.get(dayTime); + preScore = new BigDecimal(aDouble.toString()); + + }else{ + preScore = new BigDecimal("100.0"); + } + BigDecimal nowScore = new BigDecimal(score.toString()); + hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); + }); + return ResponseData.success(hashMap); + }else if("day".equals(dimension)) { + //今天数据按小时分组统计 + List caseInfos = caseInfoMapper.selectListByToday(); + caseInfos.forEach(caseInfo -> { + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); + Double score = Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + String[] array = caseInfo.getHappenTime().split(":"); + String dayTime = array[0]; + BigDecimal preScore; + if(hashMap.containsKey(dayTime)){ + Double aDouble = hashMap.get(dayTime); + preScore = new BigDecimal(aDouble.toString()); + + }else{ + preScore = new BigDecimal("100.0"); + } + BigDecimal nowScore = new BigDecimal(score.toString()); + hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); + }); + return ResponseData.success(hashMap); + } + return null; + } + + /** + * 重点区域安防事态评估,统计重点区域6:00-23:00按小时分组数据 + */ + @GetMapping("/security/keyAreaStatistic") + @ResponseBody + public Object keyAreaStatistic() { + //查询各危险级别权重、各类别权重,放入map,避免循环中多次查数据库 + HashMap hazardScoreMap = new HashMap<>(); + List caseHazardLevelList = hazardLevelMapper.getCaseHazardLevelList(null); + caseHazardLevelList.forEach(hazardLevel -> { + hazardScoreMap.put(hazardLevel.getCode(), hazardLevel.getWeight()); + }); + HashMap categoryScoreMap = new HashMap<>(); + List categoryLevelList = categoryLevelMapper.getCaseCategoryLevelList(null); + categoryLevelList.forEach(categoryLevel -> { + categoryScoreMap.put(categoryLevel.getCode(), categoryLevel.getWeight()); + }); + HashMap hashMap = new HashMap<>(); + //今天数据按小时分组统计 + List caseInfos = caseInfoMapper.selectListByToday2(); + caseInfos.forEach(caseInfo -> { + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); + Double score = Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + String[] array = caseInfo.getHappenTime().split(":"); + String dayTime = array[0]; + BigDecimal preScore; + if(hashMap.containsKey(dayTime)){ + Double aDouble = hashMap.get(dayTime); + preScore = new BigDecimal(aDouble.toString()); + + }else{ + preScore = new BigDecimal("100.0"); + } + BigDecimal nowScore = new BigDecimal(score.toString()); + hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); + }); + return ResponseData.success(hashMap); + } + + /** + * 安防机动支援力量调配响应评估,根据事件已解决状态及已解决时间-发送时间,按时间(小时)分组统计 + */ + @GetMapping("/security/responseAssess") + @ResponseBody + public Object responseAssess() { + //查询各危险级别权重、各类别权重,放入map,避免循环中多次查数据库 + HashMap hazardScoreMap = new HashMap<>(); + List caseHazardLevelList = hazardLevelMapper.getCaseHazardLevelList(null); + caseHazardLevelList.forEach(hazardLevel -> { + hazardScoreMap.put(hazardLevel.getCode(), hazardLevel.getWeight()); + }); + HashMap hashMap = new HashMap<>(); + //今天数据按小时分组统计 + List caseInfos = caseInfoMapper.selectListByToday3(); + caseInfos.forEach(caseInfo -> { + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + //扣分=事件级别权重*未解决小时数 + Date updateTime = DateUtil.parse(caseInfo.getUpdateTime()); + Date happenTime = DateUtil.parse(caseInfo.getHappenTime()); + long between = DateUtil.between(updateTime, happenTime, DateUnit.HOUR); + Double score = Double.valueOf(hazardWeight)*between; + String[] array = caseInfo.getHappenTime().split(":"); + String dayTime = array[0]; + BigDecimal preScore; + if(hashMap.containsKey(dayTime)){ + Double aDouble = hashMap.get(dayTime); + preScore = new BigDecimal(aDouble.toString()); + }else{ + preScore = new BigDecimal("100.0"); + } + BigDecimal nowScore = new BigDecimal(score.toString()); + hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); + }); + return ResponseData.success(hashMap); + } /** * 重点区域威胁事件类型统计,优先级2,统计近7天和近30天 @@ -224,7 +413,34 @@ } /** - * 设备状态计算系数和评判,优先级3,需确认设备恢复时间是否可以获取 + * 近30天/近一周安保人员到岗排行 */ + + /** + * 安保等级评估,发生离岗事件减1分 + */ + @GetMapping("/security/levelAssess") + @ResponseBody + public Object securityLevelAssess() { + //今天数据按小时分组统计 + List resultList = caseInfoMapper.selectListByType(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); + resultList.forEach(result -> { + BigDecimal deScore = new BigDecimal(result.getQuantity()); + BigDecimal preScore = new BigDecimal("100.0"); + result.setScore(preScore.subtract(deScore).doubleValue()); + }); + return ResponseData.success(resultList); + } + + /** + * 设备状态计算系数和评判,即设备维修管理查询(不分页) + */ + @PostMapping("/device/repairList") + @ResponseBody + public Object repairList(@RequestBody DeviceRepairRequest deviceRepairRequest) { + List deviceRepairLogDTOS = deviceInfoService.deviceRepairListPage(deviceRepairRequest); + return ResponseData.success(deviceRepairLogDTOS); + } + } 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 fbf8ab6..c71a15a 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 @@ -1,13 +1,12 @@ package com.casic.missiles.modular.controller.hik; +import cn.hutool.core.date.DateTime; +import cn.hutool.core.date.DateUtil; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.casic.missiles.model.response.ResponseData; import com.casic.missiles.modular.dao.HikFaceGroupInfoMapper; -import com.casic.missiles.modular.dto.hik.EventSubscribeRequest; -import com.casic.missiles.modular.dto.hik.FaceGroupAdditionRequest; -import com.casic.missiles.modular.dto.hik.HikRecvEvent; -import com.casic.missiles.modular.dto.hik.OrgBatchAdd; +import com.casic.missiles.modular.dto.hik.*; import com.casic.missiles.modular.enums.HikUri; import com.casic.missiles.modular.enums.SecurityEventType; import com.casic.missiles.modular.model.CaseInfo; @@ -18,16 +17,20 @@ import com.casic.missiles.modular.util.CaseInfoFactoryUtil; import com.casic.missiles.modular.util.HikUtil; import com.casic.missiles.modular.util.ThreadPoolUtil; +import com.casic.missiles.modular.util.WebSocket; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; -import org.springframework.web.bind.annotation.*; +import org.springframework.util.CollectionUtils; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.RestController; -import java.net.InetAddress; -import java.net.UnknownHostException; import java.util.ArrayList; +import java.util.Iterator; import java.util.List; import java.util.Objects; @@ -38,7 +41,6 @@ */ @Slf4j @RestController -@RequestMapping("/hik") public class HikController { @Autowired @@ -53,28 +55,37 @@ @Autowired private HikService hikService; + @Autowired + private HikFaceGroupInfoMapper hikFaceGroupInfoMapper; + + @Autowired + private WebSocket webSocket; + @Value("${server.port}") private int serverPort; - @Autowired - private HikFaceGroupInfoMapper hikFaceGroupInfoMapper; /** * 海康事件订阅 */ - @PostMapping("/event/subscribe") + @PostMapping("/hik/event/subscribe") @ResponseBody - public Object eventSubscribe() throws UnknownHostException { + public Object eventSubscribe() { EventSubscribeRequest eventSubscribeRequest = new EventSubscribeRequest(); ArrayList list = new ArrayList<>(); list.add(SecurityEventType.DEVICE_OFFLINE); + list.add(SecurityEventType.DEVICE_ONLINE); list.add(SecurityEventType.KEY_PERSONNEL_IDENTIFY_EVENT); list.add(SecurityEventType.MONITORING_POINT_OFFLINE); + list.add(SecurityEventType.MONITORING_POINT_ONLINE); list.add(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); list.add(SecurityEventType.PERSONNEL_GATHER_EVENT); - InetAddress localHost = InetAddress.getLocalHost(); + list.add(SecurityEventType.VISITOR_REGISTER); + list.add(SecurityEventType.VISITOR_CHECKOUT); + list.add(SecurityEventType.HIGH_ALTITUDE_PARABOLIC); +// InetAddress localHost = InetAddress.getLocalHost(); eventSubscribeRequest.setEventTypes(list); - eventSubscribeRequest.setEventDest("https://" + localHost + ":" + serverPort + "/eventRcv"); + eventSubscribeRequest.setEventDest("http://" + "192.168.10.6" + ":" + serverPort + "/eventRcv"); //订阅类型,0-订阅原始事件,1-联动事件,2-原始事件和联动事件,不填使用默认值0 eventSubscribeRequest.setSubType(0); /** @@ -92,19 +103,25 @@ } /** + * 查询事件订阅信息 + */ + @PostMapping("/hik/event/query") + @ResponseBody + public Object eventQuery() { + String result = HikUtil.hikApi(HikUri.EVENT_INFO, ""); + return result; + } + + /** * 海康事件接收 */ @PostMapping("/eventRcv") @ResponseBody public Object eventRcv(@RequestBody HikRecvEvent hikRecvEvent) { //1、接收所需事件类型 - Long eventType = hikRecvEvent.getEventType(); + Number eventType = hikRecvEvent.getEventType(); log.info("接收到安防事件类型为:{}", eventType); CaseInfo caseInfo = caseInfoFactoryUtil.getCaseInfo(eventType); - //接收到不关心事件直接返回 - if(Objects.isNull(caseInfo)){ - return ResponseData.success(); - } //2、不同事件不同处理,caseInfoFactoryUtil已设置好事件基础定义信息 // 再为事件添加状态、设备编码、设备名称、位置、区域、时间 // 异步处理事件 @@ -114,19 +131,23 @@ caseHandle(hikRecvEvent, eventType, caseInfo); } })); +// caseHandle(hikRecvEvent, eventType, caseInfo); - return null; + return ResponseData.success(); } - private void caseHandle(HikRecvEvent hikRecvEvent, Long eventType, CaseInfo caseInfo) { + private void caseHandle(HikRecvEvent hikRecvEvent, Number eventType, CaseInfo caseInfo) { JSONArray eventArray = hikRecvEvent.getEventArray(); List caseInfos = new ArrayList<>(); - while (eventArray.stream().iterator().hasNext()) { + Iterator iterator = eventArray.iterator(); + while (iterator.hasNext()) { CaseInfo caseInfo1 = new CaseInfo(); - BeanUtils.copyProperties(caseInfo, caseInfo1); - JSONObject event = (JSONObject) eventArray.stream().iterator().next(); + if(!Objects.isNull(caseInfo)){ + BeanUtils.copyProperties(caseInfo, caseInfo1); + } + JSONObject event = (JSONObject) iterator.next(); //5种事件进行不同处理 - if(SecurityEventType.KEY_PERSONNEL_IDENTIFY_EVENT == eventType){ + if (SecurityEventType.KEY_PERSONNEL_IDENTIFY_EVENT.equals(eventType)) { //判断所属人脸分组 JSONObject data = (JSONObject) event.get("data"); JSONObject faceRecognitionResult = (JSONObject) data.get("faceRecognitionResult"); @@ -142,52 +163,101 @@ if (faceGroupCode.equals(blackListGroup.getFaceGroupCode())) { //黑名单分组处理 caseInfo1 = hikService.blackListHandle(event, caseInfo1); - }else if(faceGroupCode.equals(propertyPersonnelGroup.getFaceGroupCode())){ + } else if (faceGroupCode.equals(propertyPersonnelGroup.getFaceGroupCode())) { //考勤分组处理-物业人员,添加到考勤表 hikService.propertyAttendanceHandle(event); - }else if(faceGroupCode.equals(securityPersonnelGroup.getFaceGroupCode())){ + } else if (faceGroupCode.equals(securityPersonnelGroup.getFaceGroupCode())) { //考勤分组处理-安保人员,添加到考勤表 hikService.securityPersonnelHandle(event); - }else { + } else { return; } - }else if(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT == eventType){ + } else if (SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT.equals(eventType)) { //离岗事件处理 caseInfo1 = hikService.demobilizedHandle(event, caseInfo1); - }else if(SecurityEventType.PERSONNEL_GATHER_EVENT == eventType){ + } else if (SecurityEventType.PERSONNEL_GATHER_EVENT.equals(eventType)) { //人员聚集事件处理 caseInfo1 = hikService.personGatherHandle(event, caseInfo1); - }else if(SecurityEventType.MONITORING_POINT_OFFLINE == eventType){ + } else if (SecurityEventType.MONITORING_POINT_OFFLINE.equals(eventType)) { //监控点离线事件处理 caseInfo1 = hikService.monitorPointOfflineHandle(event, caseInfo1); - }else if(SecurityEventType.DEVICE_OFFLINE == eventType){ + } else if (SecurityEventType.MONITORING_POINT_ONLINE.equals(eventType)) { + //监控点上线事件处理 + hikService.monitorPointOnlineHandle(event); + } else if (SecurityEventType.DEVICE_OFFLINE.equals(eventType)) { //装置离线事件处理 caseInfo1 = hikService.deviceOfflineHandle(event, caseInfo1); - }else if(SecurityEventType.VISITOR_REGISTER == eventType){ + } else if (SecurityEventType.DEVICE_ONLINE.equals(eventType)) { + //装置上线处理 + hikService.deviceOnlineHandle(event); + } else if (SecurityEventType.VISITOR_REGISTER.equals(eventType)) { //记录访客登记记录,添加到访客记录表 hikService.visitorRegisterHandler(event); - }else if(SecurityEventType.VISITOR_CHECKOUT == eventType){ + } else if (SecurityEventType.VISITOR_CHECKOUT.equals(eventType)) { //记录访客签离记录 hikService.visitorCheckOutHandler(event); } - if(!Objects.isNull(caseInfo1) && !StringUtils.isEmpty(caseInfo1.getHappenTime())){ + if (!Objects.isNull(caseInfo1) && !StringUtils.isEmpty(caseInfo1.getHappenTime())) { caseInfos.add(caseInfo1); } } //3、安防事件入库 - if(!caseInfoService.insertCaseInfoBatch(caseInfos)){ - log.error("安防事件批量入库异常"); + if (!CollectionUtils.isEmpty(caseInfos) && !caseInfoService.insertCaseInfoBatch(caseInfos)) { + log.error("安防事件批量入库异常!"); } // TODO: 2022/8/15 webSocket推送 + if (CollectionUtils.isEmpty(caseInfos)) { + log.info("webSocket事件推送"); + webSocket.sendAllMessage(JSONObject.toJSONString(caseInfos)); + } return; } /** + * 以图搜图,前端用于轨迹追踪 + */ + @PostMapping("/hik/search/picture") + @ResponseBody + public Object searchPictures(@RequestBody SearchPicturesRequest searchPicturesRequest) { + DateTime startDateTime = DateUtil.parse(searchPicturesRequest.getStartTime()); + DateTime endDateTime = DateUtil.parse(searchPicturesRequest.getEndTime()); + String startTime = DateUtil.format(startDateTime, "yyyy-MM-dd'T'HH:mm:ss.SSSXXX"); + String endTime = DateUtil.format(endDateTime, "yyyy-MM-dd'T'HH:mm:ss.SSSXXX"); + searchPicturesRequest.setStartTime(startTime); + searchPicturesRequest.setEndTime(endTime); + String body = JSONObject.toJSONString(searchPicturesRequest); + String resultStr = HikUtil.hikApi(HikUri.SEARCH_PICTURES, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (!"0".equals(resultJson.get("code"))) { + log.error("请求海康,以图搜图失败,海康response:{}", resultStr); + return ResponseData.error("以图搜图失败"); + } + return ResponseData.success(resultJson); + } + + + /** + * 海康事件取消订阅 + */ + @PostMapping("/hik/event/cancel") + @ResponseBody + public Object eventCancelSubscribe(@RequestBody CancelSubscribeRequest cancelSubscribeRequest) { + String body = JSONObject.toJSONString(cancelSubscribeRequest); + String resultStr = HikUtil.hikApi(HikUri.EVENT_CANCEL, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (!"0".equals(resultJson.get("code"))) { + log.error("请求海康,取消订阅失败,海康response:{}", resultStr); + return ResponseData.error("取消订阅失败"); + } + return ResponseData.success(resultJson); + } + + /** * 单个添加海康人脸分组 * api->hik单个添加人脸分组api->response->mysql */ - @PostMapping("/faceGroup/single/add") + @PostMapping("/hik/faceGroup/single/add") @ResponseBody public Object faceGroupAddition(@RequestBody FaceGroupAdditionRequest faceGroupAdditionRequest) { String body = JSONObject.toJSONString(faceGroupAdditionRequest); @@ -212,7 +282,7 @@ * 批量添加海康组织 * api->hik批量添加组织api->response */ - @PostMapping("/org/batch/add") + @PostMapping("/hik/org/batch/add") @ResponseBody public Object orgBatchAdd(@RequestBody List orgBatchAddRequest) { String body = JSONObject.toJSONString(orgBatchAddRequest); @@ -232,4 +302,62 @@ return ResponseData.error("批量添加组织失败"); } + /** + * 获取人员列表 + */ + @PostMapping("/hik/person/personList") + @ResponseBody + public Object personList() { + PersonListRequest request = new PersonListRequest(); + request.setPageNo(1); + request.setPageSize(100); + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi("/api/resource/v2/person/personList", body); + return resultStr; + } + + /** + * 获取组织列表 + */ + @PostMapping("/hik/org/orgList") + @ResponseBody + public Object orgList() { + PersonListRequest request = new PersonListRequest(); + request.setPageNo(1); + request.setPageSize(100); + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi("/api/resource/v1/org/orgList", body); + return resultStr; + } + + /** + * 查询访客权限下载记录 + */ + @PostMapping("/hik/auth/result") + @ResponseBody + public Object authResult() { + PersonListRequest request = new PersonListRequest(); + request.setPageNo(1); + request.setPageSize(100); + request.setOrderId("ba101db6246711edaea66f7939a13638"); + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi("/api/visitor/v1/auth/result", body); + return resultStr; + } + + /** + * 人脸图片获取 + */ + @PostMapping("/hik/face/picture") + @ResponseBody + public Object facePicture() { + FaceRequest request = new FaceRequest(); +// List list = new ArrayList<>(); +// list.add(""); + request.setCertificateNum("wanggong"); + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi("/api/frs/v1/face", body); + return resultStr; + } + } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/AssetInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/AssetInfoMapper.java index 4f64e83..c0684ee 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/AssetInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/AssetInfoMapper.java @@ -17,6 +17,6 @@ @Mapper public interface AssetInfoMapper extends BaseMapper { - List getAssetInfoListPage(@Param("page") Page page, AssetInfoRequest assetInfoRequest); + List getAssetInfoListPage(@Param("page") Page page, @Param("assetInfoRequest") AssetInfoRequest assetInfoRequest); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/AttendanceInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/AttendanceInfoMapper.java index f9e793e..ec87e46 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/AttendanceInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/AttendanceInfoMapper.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.statistics.AttendanceNumberDTO; import com.casic.missiles.modular.dto.statistics.AttendanceRatioDTO; import com.casic.missiles.modular.model.AttendanceInfo; import org.apache.ibatis.annotations.Mapper; @@ -17,7 +18,7 @@ */ @Mapper public interface AttendanceInfoMapper extends BaseMapper { - List getAttendanceInfoListPage(@Param("page") Page page, StaffInfoRequest attendanceInfoRequest); + List getAttendanceInfoListPage(@Param("page") Page page, @Param("attendanceInfoRequest") StaffInfoRequest attendanceInfoRequest); AttendanceInfo selectByCodeAndDate(@Param("staffCode") String staffCode); @@ -26,4 +27,8 @@ List getCountByTypeAndDateForMonth(@Param("staffType")String staffType); List getCountByTypeAndDateForYear(@Param("staffType")String staffType); + + List getCountForWeek(); + + List getCountForDay(); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java index ce94b8f..6137a7d 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java @@ -17,5 +17,5 @@ @Mapper public interface BlackInfoMapper extends BaseMapper { - List getBlackInfoListPage(@Param("page") Page page, BlackInfoRequest blackInfoRequest); + List getBlackInfoListPage(@Param("page") Page page, @Param("blackInfoRequest") BlackInfoRequest blackInfoRequest); } 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 efda6b3..50aaa6f 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 @@ -20,7 +20,7 @@ List getCaseInfoListPage(@Param("page") Page page, @Param("caseInfoRequest") CaseInfoRequest caseInfoRequest); - int updateStatusById(CaseInfoRequest caseInfoRequest); + int updateStatusById(@Param("caseInfoRequest") CaseInfoRequest caseInfoRequest); List selectByLevelAndMonth(@Param("year") String year); @@ -47,4 +47,20 @@ List selectPreWeekCountByThirtyDay(); List selectPreDayCountBySevenDay(); + + Integer selectDemobilizedCount(@Param("eventType") Number personnelDemobilizedEvent); + + List selectPreMonthCount(); + + List selectListBySevenDay(); + + List selectListByToday(); + + List selectListByToday2(); + + List selectListByToday3(); + + List selectListByType(@Param("eventType") Number eventType); + + List selectDemobilizedCountByHour(@Param("eventType") Number eventType); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/CategoryLevelMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/CategoryLevelMapper.java index 52fc714..afe1650 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/CategoryLevelMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/CategoryLevelMapper.java @@ -17,9 +17,9 @@ @Mapper public interface CategoryLevelMapper extends BaseMapper { - List getCaseCategoryLevelListPage(@Param("page") Page page, CategoryLevelRequest categoryLevelRequest); + List getCaseCategoryLevelListPage(@Param("page") Page page, @Param("categoryLevelRequest") CategoryLevelRequest categoryLevelRequest); - List getCaseCategoryLevelList(CategoryLevelRequest categoryLevelRequest); + List getCaseCategoryLevelList(@Param("categoryLevelRequest") CategoryLevelRequest categoryLevelRequest); CaseCategoryLevel getCaseCategoryLevel(@Param("categoryLevelCode") String categoryLevelCode); 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 66353b1..2555a09 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 @@ -19,7 +19,7 @@ @Mapper public interface DeviceInfoMapper extends BaseMapper { - List getDeviceInfoListPage(@Param("page") Page page, DeviceInfoRequest deviceInfoRequest); + List getDeviceInfoListPage(@Param("page") Page page, @Param("deviceInfoRequest") DeviceInfoRequest deviceInfoRequest); List getDeviceInfoList(@Param("deviceInfoRequest") DeviceInfoRequest deviceInfoRequest); @@ -27,6 +27,8 @@ DeviceInfo getByIndexCode(@Param("srcIndex") String srcIndex); + DeviceInfo getByIp(@Param("ip") String ip); + List selectIndexCodesByCodes(@Param("deviceCodes") List deviceCodes); List selectByType(@Param("devType") String devType); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java index 41dd0af..5bfaf63 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java @@ -5,6 +5,7 @@ import com.casic.missiles.modular.dto.DeviceRepairRequest; import com.casic.missiles.modular.model.DeviceRepairLog; import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; import java.util.List; @@ -16,7 +17,7 @@ @Mapper public interface DeviceRepairLogMapper extends BaseMapper { - List getDeviceRepairListPage(Page page, DeviceRepairRequest deviceRepairRequest); + List getDeviceRepairListPage(@Param("page") Page page, @Param("deviceRepairRequest")DeviceRepairRequest deviceRepairRequest); - List getDeviceRepairList(DeviceRepairRequest deviceRepairRequest); + List getDeviceRepairList(@Param("deviceRepairRequest") DeviceRepairRequest deviceRepairRequest); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java index 9035c47..4823ac1 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java @@ -18,7 +18,7 @@ @Mapper public interface FireEquipInfoMapper extends BaseMapper { - List getFireEquipInfoListPage(@Param("page") Page page, FireEquipRequest fireEquipRequest); + List getFireEquipInfoListPage(@Param("page") Page page, @Param("fireEquipRequest") FireEquipRequest fireEquipRequest); FireEquipInfo getFireEquipInfo(@Param("equipCode") String equipCode); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/GateGroupMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/GateGroupMapper.java index d8c330d..977a427 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/GateGroupMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/GateGroupMapper.java @@ -17,7 +17,7 @@ */ @Mapper public interface GateGroupMapper extends BaseMapper { - List getGateGroupListPage(@Param("page") Page page, GateGroupRequest gateGroupRequest); + List getGateGroupListPage(@Param("page") Page page, @Param("gateGroupRequest") GateGroupRequest gateGroupRequest); GateGroup getGateGroupByName(@Param("groupName") String groupName); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/HazardLevelMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/HazardLevelMapper.java index 8957780..dcf47bb 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/HazardLevelMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/HazardLevelMapper.java @@ -17,11 +17,13 @@ @Mapper public interface HazardLevelMapper extends BaseMapper { - List getCaseHazardLevelListPage(@Param("page") Page page, HazardLevelRequest hazardLevelRequest); + List getCaseHazardLevelListPage(@Param("page") Page page, @Param("hazardLevelRequest") HazardLevelRequest hazardLevelRequest); - List getCaseHazardLevelList(HazardLevelRequest hazardLevelRequest); + List getCaseHazardLevelList(@Param("hazardLevelRequest") HazardLevelRequest hazardLevelRequest); CaseHazardLevel getCaseHazardLevel(@Param("hazardLevelCode") String hazardLevelCode); List selectHazardName(); + + String selectHazardNameByCode(@Param("hazardLevelCode") String hazardLevelCode); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/HikCaseDefineMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/HikCaseDefineMapper.java index 0dc47d1..f162fef 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/HikCaseDefineMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/HikCaseDefineMapper.java @@ -12,5 +12,5 @@ */ @Mapper public interface HikCaseDefineMapper extends BaseMapper { - HikCaseDefine getHikCaseDefine(@Param("caseTypeCode") Long caseTypeCode); + HikCaseDefine getHikCaseDefine(@Param("caseTypeCode") Number caseTypeCode); } 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 f8a674c..fe5afc2 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 @@ -17,11 +17,13 @@ @Mapper public interface StaffInfoMapper extends BaseMapper { - List getStaffInfoListPage(@Param("page") Page page, StaffInfoRequest staffInfoRequest); + List getStaffInfoListPage(@Param("page") Page page, @Param("staffInfoRequest") StaffInfoRequest staffInfoRequest); StaffInfo selectByCode(@Param("staffCode") String staffCode); - List getStaffInfoList(StaffInfoRequest staffInfoRequest); + List getStaffInfoList(@Param("staffInfoRequest") StaffInfoRequest staffInfoRequest); - List selectBatchCodes(List list); + List selectBatchCodes(@Param("list") List list); + + int updateByCodeForCard(@Param("staffCode") String staffCode, @Param("cardNo") String cardNo); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitInfoMapper.java index b1217c5..6c52542 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitInfoMapper.java @@ -16,7 +16,7 @@ */ @Mapper public interface VisitInfoMapper extends BaseMapper { - List getVisitInfoListPage(@Param("page") Page page, VisitorRequest visitorRequest); + List getVisitInfoListPage(@Param("page") Page page, @Param("visitorRequest") VisitorRequest visitorRequest); VisitInfo selectByOrderId(@Param("orderId") String orderId); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitorApplyMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitorApplyMapper.java index c09f3c0..6ea55bd 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitorApplyMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitorApplyMapper.java @@ -18,7 +18,7 @@ @Mapper public interface VisitorApplyMapper extends BaseMapper { - List getVisitorApplyListPage(@Param("page") Page page, VisitorApplyRequest visitorApplyRequest); + List getVisitorApplyListPage(@Param("page") Page page, @Param("visitorApplyRequest") VisitorApplyRequest visitorApplyRequest); List selectByVisitReason(); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/AttendanceInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/AttendanceInfoMapper.xml index b2ece71..f8bdd6e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/AttendanceInfoMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/AttendanceInfoMapper.xml @@ -43,7 +43,8 @@ and staff_type = #{staffType} - and YEARWEEK(date_format(atte_date, '%Y-%m-%d'), 1) = YEARWEEK(now(),1); + AND DATE_SUB(CURDATE(), INTERVAL 7 DAY) <= DATE(atte_date) + GROUP BY DATE_FORMAT(atte_date, '%Y-%m-%d') @@ -69,4 +70,20 @@ GROUP BY DATE_FORMAT(atte_date, '%Y-%m') + + + \ No newline at end of file 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 2b6953f..06ec0a8 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 @@ -28,7 +28,9 @@ @@ -87,7 +89,8 @@ SELECT hazard_level_code as levelCode, count(id) as quantity FROM bus_case_info WHERE hazard_level_code is not null - AND DATE_SUB(CURDATE(), INTERVAL 7 DAY) <= date(happen_time); + AND is_key_area = 1 + AND DATE_SUB(CURDATE(), INTERVAL 7 DAY) <= date(happen_time) GROUP BY hazard_level_code @@ -95,7 +98,8 @@ SELECT hazard_level_code as levelCode, count(id) as quantity FROM bus_case_info WHERE hazard_level_code is not null - AND DATE_SUB(CURDATE(), INTERVAL 30 DAY) <= date(happen_time); + AND is_key_area = 1 + AND DATE_SUB(CURDATE(), INTERVAL 30 DAY) <= date(happen_time) GROUP BY hazard_level_code @@ -122,4 +126,71 @@ AND hazard_level_code is not null GROUP BY DATE_FORMAT(happen_time,'%Y-%m-%d') + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/CategoryLevelMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/CategoryLevelMapper.xml index 4670b1f..1d25cbd 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/CategoryLevelMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/CategoryLevelMapper.xml @@ -20,11 +20,11 @@ SELECT * FROM bus_case_category_level WHERE 1=1 - - and code = #{code} + + and code = #{categoryLevelRequest.code} - - and name = #{name} + + and name = #{categoryLevelRequest.name} ORDER by create_time DESC 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 9b66fd8..bfd84b7 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 @@ -98,4 +98,10 @@ #{item} + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceRepairLogMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceRepairLogMapper.xml index 078ed3c..cf1a481 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceRepairLogMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceRepairLogMapper.xml @@ -22,14 +22,14 @@ SELECT * FROM bus_device_repair_log WHERE 1=1 - - and device_code = #{devCode} + + and device_code = #{deviceRepairRequest.devCode} - - and device_name = #{devName} + + and device_name = #{deviceRepairRequest.devName} - - and DATE_FORMAT(create_time,"%y%m%d") = DATE_FORMAT(#{createTime},"%y%m%d") + + and DATE_FORMAT(create_time,"%y%m%d") = DATE_FORMAT(#{deviceRepairRequest.createTime},"%y%m%d") ORDER by create_time DESC diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/HazardLevelMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/HazardLevelMapper.xml index f16f2b9..458322b 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/HazardLevelMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/HazardLevelMapper.xml @@ -20,11 +20,11 @@ SELECT * FROM bus_case_hazard_level WHERE 1=1 - - and code = #{code} + + and code = #{hazardLevelRequest.code} - - and name = #{name} + + and name = #{hazardLevelRequest.name} ORDER by create_time DESC @@ -42,4 +42,10 @@ SELECT name FROM bus_case_hazard_level + + \ 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 557237e..b6a183a 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 @@ -50,4 +50,10 @@ + + + UPDATE bus_staff_info + SET card_no = #{cardNo} + WHERE staff_code = #{staffCode} + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitInfoMapper.xml index 84aa84f..230529a 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitInfoMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitInfoMapper.xml @@ -27,5 +27,6 @@ SELECT * FROM bus_visit_info WHERE order_id = #{orderId} and DATE_FORMAT(in_time,'%Y-%m-%d') = CURRENT_DATE + limit 1 \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/BlackPictureRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/BlackPictureRequest.java new file mode 100644 index 0000000..fc92701 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/BlackPictureRequest.java @@ -0,0 +1,14 @@ +package com.casic.missiles.modular.dto; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/29 19:26 + */ +@Data +public class BlackPictureRequest { + private String picUri; + private String serverIndexCode; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/CancelSubscribeRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/CancelSubscribeRequest.java new file mode 100644 index 0000000..e2d390a --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/CancelSubscribeRequest.java @@ -0,0 +1,15 @@ +package com.casic.missiles.modular.dto.hik; + +import lombok.Data; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/24 15:14 + */ +@Data +public class CancelSubscribeRequest { + private List eventTypes; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/CardInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/CardInfo.java new file mode 100644 index 0000000..341457d --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/CardInfo.java @@ -0,0 +1,24 @@ +package com.casic.missiles.modular.dto.hik; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/26 16:08 + */ +@Data +public class CardInfo { + //卡号,8~20个字符,支持数字和大写字母 + private String cardNo; + //人员ID,员工工号 + private String personId; + //人员所属组织IndexCode + private String orgIndexCode; + //卡片类型,默认是1:IC卡 + //1:IC卡 + //2:CPU卡 + //3:远距离卡 + //4:MIFARE卡 + private Number cardType; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/FaceRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/FaceRequest.java new file mode 100644 index 0000000..edc04bf --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/FaceRequest.java @@ -0,0 +1,16 @@ +package com.casic.missiles.modular.dto.hik; + +import lombok.Data; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/25 16:53 + */ +@Data +public class FaceRequest { + private String certificateNum; + private List indexCodes; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/HikRecvEvent.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/HikRecvEvent.java index a3e9845..1b2b2b1 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/HikRecvEvent.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/HikRecvEvent.java @@ -28,12 +28,12 @@ /** * 事件类型,用于判断所需接收到的事件类型 */ - public Long getEventType(){ + public Number getEventType(){ JSONObject jsonObject = (JSONObject)JSONObject.toJSON(params); //事件类别对应SecurityEventTypeEnum JSONArray eventTypeArray = (JSONArray)jsonObject.get("events"); JSONObject eventJsonObject = (JSONObject)JSONObject.toJSON(eventTypeArray.get(0)); - Long eventType = (Long) eventJsonObject.get("eventType"); + Number eventType = (Number) eventJsonObject.get("eventType"); return eventType; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonBatchDeleteRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonBatchDeleteRequest.java index 027d31d..9751929 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonBatchDeleteRequest.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonBatchDeleteRequest.java @@ -12,4 +12,6 @@ @Data public class PersonBatchDeleteRequest { private List personIds; + //删除人脸接口使用 + private String faceId; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonInfoRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonInfoRequest.java new file mode 100644 index 0000000..05dc9e1 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonInfoRequest.java @@ -0,0 +1,20 @@ +package com.casic.missiles.modular.dto.hik; + +import lombok.Data; + +import java.util.List; + +/** + * @Description: 获取员工照片请求实体 + * @Author: wangpeng + * @Date: 2022/8/25 16:53 + */ +@Data +public class PersonInfoRequest { + //获取员工详细信息使用 + private String paramName; + private List paramValue; + //获取照片使用 + private String picUri; + private String serverIndexCode; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonListRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonListRequest.java new file mode 100644 index 0000000..3f7149b --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonListRequest.java @@ -0,0 +1,16 @@ +package com.casic.missiles.modular.dto.hik; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/25 16:53 + */ +@Data +public class PersonListRequest { + private Number pageNo; + private Number pageSize; + + private String orderId; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/SearchPicturesRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/SearchPicturesRequest.java new file mode 100644 index 0000000..0a95966 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/SearchPicturesRequest.java @@ -0,0 +1,24 @@ +package com.casic.missiles.modular.dto.hik; + +import lombok.Data; + +import java.util.List; + +/** + * @Description: 以图搜图请求 + * @Author: wangpeng + * @Date: 2022/8/29 10:46 + */ +@Data +public class SearchPicturesRequest { + private String facePicBinaryData; + private String facePicUrl; + private List cameraIndexCodes; + private String startTime; + private String endTime; + //指定搜图的最小相似度,最小为1,最大为100 + private String minSimilarity; + private Number age; + //male-男性,female-女性 + private String sex; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/StaffCardRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/StaffCardRequest.java new file mode 100644 index 0000000..4052e6d --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/StaffCardRequest.java @@ -0,0 +1,20 @@ +package com.casic.missiles.modular.dto.hik; + +import lombok.Data; + +import java.util.List; + +/** + * @Description: 人员开卡请求实体 + * @Author: wangpeng + * @Date: 2022/8/26 16:05 + */ +@Data +public class StaffCardRequest { + //卡片开始有效时间,时间格式:yyyy-MM-dd + private String startDate; + //卡片截止有效时间,时间格式:yyyy-MM-dd,不能大于2037年12月31日 + private String endDate; + //cardList,待开卡列表,最大支持50张卡 + private List cardList; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/VisitorInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/VisitorInfo.java index 73aa316..b99f301 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/VisitorInfo.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/VisitorInfo.java @@ -14,7 +14,7 @@ //访客性别 //1: 男 //2: 女 - private String gender; + private Integer gender; //联系电话建议填写手机号码 private String phoneNo; //证件类型 diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/ApplyReasonGroupDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/ApplyReasonGroupDTO.java index 514f382..786143e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/ApplyReasonGroupDTO.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/ApplyReasonGroupDTO.java @@ -13,4 +13,6 @@ private String visitReason; //访问人数 private Integer quantity; + //占比 + private String ratio; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/AttendanceNumberDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/AttendanceNumberDTO.java new file mode 100644 index 0000000..a494321 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/AttendanceNumberDTO.java @@ -0,0 +1,24 @@ +package com.casic.missiles.modular.dto.statistics; + +import com.fasterxml.jackson.annotation.JsonIgnore; +import lombok.Data; + +/** + * @Description: 出勤人数统计实体 + * @Author: wangpeng + * @Date: 2022/8/31 19:24 + */ +@Data +public class AttendanceNumberDTO { + //日期维度,周、今日,入参 + @JsonIgnore + private String dateDimension; + + //日期,具体天/小时,出参 + private String date; + //出勤人数 + private String quantity; + //员工类型 + private String staffType; + +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/AvgMonthAndWeekGroupDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/AvgMonthAndWeekGroupDTO.java index 4366916..331a9a9 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/AvgMonthAndWeekGroupDTO.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/AvgMonthAndWeekGroupDTO.java @@ -2,8 +2,6 @@ import lombok.Data; -import java.util.Map; - /** * @Description: 平均每月和每周的数据实体 * @Author: wangpeng @@ -13,6 +11,4 @@ public class AvgMonthAndWeekGroupDTO { //入参 private String year; - //出参,key:事件类型,value:周和月数据平均值 - private Map map; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/GateStatusGroupResponse.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/GateStatusGroupResponse.java new file mode 100644 index 0000000..d16f4e5 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/GateStatusGroupResponse.java @@ -0,0 +1,16 @@ +package com.casic.missiles.modular.dto.statistics; + +import lombok.Data; + +/** + * @Description: 闸机/摄像机统计响应实体 + * @Author: wangpeng + * @Date: 2022/8/30 14:22 + */ +@Data +public class GateStatusGroupResponse { + //设备状态 + private String status; + //占比 + private String ratio; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/MonthAndWeekDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/MonthAndWeekDTO.java index 7482b2a..284115a 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/MonthAndWeekDTO.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/MonthAndWeekDTO.java @@ -9,7 +9,7 @@ */ @Data public class MonthAndWeekDTO { -// private String levelName; + private String levelName; private Integer monthQuantity; private Integer weekQuantity; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/OnDutyRatioDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/OnDutyRatioDTO.java new file mode 100644 index 0000000..4f6a65d --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/OnDutyRatioDTO.java @@ -0,0 +1,15 @@ +package com.casic.missiles.modular.dto.statistics; + +import lombok.Data; + +/** + * @Description: 在岗率统计实体 + * @Author: wangpeng + * @Date: 2022/9/2 21:24 + */ +@Data +public class OnDutyRatioDTO { + private String date; + private String quantity; + private String ratio; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/SecurityLevelAssessDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/SecurityLevelAssessDTO.java new file mode 100644 index 0000000..40a0738 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/SecurityLevelAssessDTO.java @@ -0,0 +1,15 @@ +package com.casic.missiles.modular.dto.statistics; + +import lombok.Data; + +/** + * @Description: 出勤人数统计实体 + * @Author: wangpeng + * @Date: 2022/8/31 19:24 + */ +@Data +public class SecurityLevelAssessDTO { + private String date; + private String quantity; + private Double score; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/SecurityScoreDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/SecurityScoreDTO.java index 304d169..f7bd4a2 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/SecurityScoreDTO.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/SecurityScoreDTO.java @@ -14,5 +14,5 @@ //楼层,出参 private String area; //评分,出参 - private String score; + private Double score; } 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 6a30786..e5e613d 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 @@ -8,6 +8,10 @@ public interface HikUri { //事件订阅 String EVENT_SUBSCRIBE = "/api/eventService/v1/eventSubscriptionByEventTypes"; + //事件订阅信息查询 + String EVENT_INFO = "/api/eventService/v1/eventSubscriptionView"; + //事件订阅取消 + String EVENT_CANCEL = "/api/eventService/v1/eventUnSubscriptionByEventTypes"; //预约免登记 String APPOINTMENT_FREE_REGISTER = "/api/visitor/v1/appointment/registration"; //修改访客预约 @@ -32,8 +36,18 @@ String PERSON_SINGLE_UPDATE = "/api/resource/v1/person/single/update"; //批量删除人员 String PERSON_BATCH_DELETE = "/api/resource/v1/person/batch/delete"; + //根据人脸Id删除人脸 + String PERSON_SINGLE_DELETE = "/api/resource/v1/face/single/delete"; //门禁点反控 String DOOR_CONTROL = "/api/acs/v1/door/doControl"; //查询海康门禁点事件v2 String DOOR_EVENTS = "/api/acs/v2/door/events"; + //批量开卡 + String CARD_BINDING = "/api/cis/v1/card/binding"; + //提取人员照片 + String PERSON_PICTURE = "/api/resource/v1/person/picture"; + //根据人员唯一字段获取人员详细信息 + String PERSON_INFO = "/api/resource/v1/person/condition/personInfo"; + //以图搜图 + String SEARCH_PICTURES = "/api/frs/v1/application/captureSearch"; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/BlackListController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/BlackListController.java index a27f9f8..0c06661 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/BlackListController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/BlackListController.java @@ -1,13 +1,18 @@ package com.casic.missiles.modular.controller; +import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.base.controller.ExportController; import com.casic.missiles.core.page.PageFactory; import com.casic.missiles.model.response.ResponseData; import com.casic.missiles.modular.dto.BlackInfoRequest; +import com.casic.missiles.modular.dto.BlackPictureRequest; +import com.casic.missiles.modular.dto.hik.PersonInfoRequest; +import com.casic.missiles.modular.enums.HikUri; import com.casic.missiles.modular.enums.OperateTypeEnum; import com.casic.missiles.modular.model.BlackInfo; import com.casic.missiles.modular.service.BlackInfoService; +import com.casic.missiles.modular.util.HikUtil; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; @@ -56,4 +61,22 @@ return null; } + /** + * 黑名单人员照片 + */ + @PostMapping("/personPicture") + @ResponseBody + public Object personPicture(@RequestBody BlackPictureRequest blackPictureRequest){ + //获取照片 + String picUri = blackPictureRequest.getPicUri(); + String serverIndexCode = blackPictureRequest.getServerIndexCode(); + PersonInfoRequest picRequest = new PersonInfoRequest(); + picRequest.setPicUri(picUri); + picRequest.setServerIndexCode(serverIndexCode); + String reBody = JSONObject.toJSONString(picRequest); + //重定向地址获取 + String url = HikUtil.hikApiFor302(HikUri.PERSON_PICTURE, reBody); + return ResponseData.success(url); + } + } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/DeviceController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/DeviceController.java index e1c4eba..666bbee 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/DeviceController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/DeviceController.java @@ -107,7 +107,7 @@ } /** - * 设备维修管理查询(分页),需计算MTTR=总维修时间/故障次数 + * 设备状态计算与评判/设备维修管理查询(分页),需计算MTTR=总维修时间/故障次数 */ @PostMapping("/repair/listPage") @ResponseBody @@ -211,7 +211,7 @@ //需根据设备编号获取到对应的门禁点唯一标识 doorControlRequest.setDoorIndexCodes(indexCodes); doorControlRequest.setControlType(Integer.valueOf(gateGroupDTO.getStatus())); - String body = JSONObject.toJSONString(deviceCodes); + String body = JSONObject.toJSONString(doorControlRequest); String resultStr = HikUtil.hikApi(HikUri.DOOR_CONTROL, body); JSONObject resultJson = (JSONObject)JSONObject.parse(resultStr); if (!"0".equals(resultJson.get("code"))) { diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/StaffController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/StaffController.java index b58ccab..704093c 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/StaffController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/StaffController.java @@ -2,15 +2,21 @@ import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.util.StrUtil; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.base.controller.ExportController; import com.casic.missiles.core.page.PageFactory; import com.casic.missiles.model.response.ErrorResponseData; import com.casic.missiles.model.response.ResponseData; import com.casic.missiles.modular.dto.StaffInfoRequest; +import com.casic.missiles.modular.dto.hik.PersonInfoRequest; +import com.casic.missiles.modular.dto.hik.StaffCardRequest; +import com.casic.missiles.modular.enums.HikUri; import com.casic.missiles.modular.enums.OperateTypeEnum; import com.casic.missiles.modular.model.StaffInfo; import com.casic.missiles.modular.service.StaffInfoService; +import com.casic.missiles.modular.util.HikUtil; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; @@ -110,4 +116,60 @@ } return ResponseData.success(); } + + /** + * 批量开卡,添加人员之后调用,若在一个接口中添加人员成功开卡失败则第二次添加时会有问题 + */ + @PostMapping("/cardBinding") + @ResponseBody + public Object cardBinding(@RequestBody StaffCardRequest staffCardRequest) { + String body = JSONObject.toJSONString(staffCardRequest); + String resultStr = HikUtil.hikApi(HikUri.CARD_BINDING, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (!"0".equals(resultJson.get("code"))) { + log.error("请求海康,批量开卡失败,海康response:{}", resultStr); + return ResponseData.error("批量开卡失败"); + } + //保存卡号 + if(staffInfoService.saveCardInfo(staffCardRequest) > 0){ + return ResponseData.success(); + } + return ResponseData.error("批量开卡失败"); + } + + /** + * 获取员工照片,海康存储 + */ + @PostMapping("/personPicture/{staffCode}") + @ResponseBody + public Object personPicture(@PathVariable("staffCode") String staffCode){ + //获取员工详细信息,含图片服务器、uri + PersonInfoRequest request = new PersonInfoRequest(); + List list = new ArrayList<>(); + list.add(staffCode); + request.setParamName("personId"); + request.setParamValue(list); + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi(HikUri.PERSON_INFO, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (!"0".equals(resultJson.get("code"))) { + log.error("请求海康,根据人员唯一字段获取人员详细信息失败,海康response:{}", resultStr); + return ResponseData.error("获取员工照片失败"); + } + //获取照片 + JSONObject data = (JSONObject) resultJson.get("data"); + JSONArray dataArray = (JSONArray) data.get("list"); + JSONObject jsonObject = (JSONObject) dataArray.get(0); + JSONArray personPhoto = (JSONArray) jsonObject.get("personPhoto"); + JSONObject photo = (JSONObject) personPhoto.get(0); + String picUri = photo.getString("picUri"); + String serverIndexCode = photo.getString("serverIndexCode"); + PersonInfoRequest picRequest = new PersonInfoRequest(); + picRequest.setPicUri(picUri); + picRequest.setServerIndexCode(serverIndexCode); + String reBody = JSONObject.toJSONString(picRequest); + //重定向地址获取 + String url = HikUtil.hikApiFor302(HikUri.PERSON_PICTURE, reBody); + return ResponseData.success(url); + } } 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 4a07dd9..7b1dcf6 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 @@ -16,6 +16,7 @@ import com.casic.missiles.modular.redis.key.CacheKeys; import com.casic.missiles.modular.service.CockpitService; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.util.CollectionUtils; import org.springframework.web.bind.annotation.*; @@ -24,10 +25,7 @@ import java.text.NumberFormat; import java.time.LocalDateTime; import java.time.temporal.ChronoUnit; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.util.*; import java.util.stream.Collectors; /** @@ -73,6 +71,9 @@ private StatisticNumberMapper numberMapper; @Autowired + private HazardLevelMapper hazardLevelMapper; + + @Autowired private AccessGroupConfig accessGroupConfig; /** @@ -104,8 +105,24 @@ public Object buildingNumberPerHour(){ //当天按小时分组的人数 List list = numberMapper.selectListByTime(); - Map> collect = list.stream().collect(Collectors.groupingBy(BuildingNumberDTO::getStatisticPosition)); - return ResponseData.success(collect); + Map> collect = list.stream().collect(Collectors.groupingBy(BuildingNumberDTO::getStatisticTime)); + //定时任务中已将每小时三栋楼人数存到数据库 + //将一期主楼和录制楼人数合并,二期单算 + List> resultList = new ArrayList<>(); + collect.keySet().forEach(key -> { + List buildingNumberDTOS = collect.get(key); + BuildingNumberDTO mainBuildingOne = buildingNumberDTOS.get(0); + BuildingNumberDTO mainBuildingTwo = buildingNumberDTOS.get(1); + BuildingNumberDTO recordingBuilding = buildingNumberDTOS.get(2); + HashMap resultMap = new HashMap<>(); + Integer oneQuantity = Integer.valueOf(mainBuildingOne.getStatisticQuantity()); + Integer recordingQuantity = Integer.valueOf(recordingBuilding.getStatisticQuantity()); + resultMap.put("staticTime", mainBuildingOne.getStatisticTime()); + resultMap.put(mainBuildingOne.getStatisticPositionName()+"、"+recordingBuilding.getStatisticPositionName(), String.valueOf(oneQuantity+recordingQuantity)); + resultMap.put(mainBuildingTwo.getStatisticPositionName(), mainBuildingTwo.getStatisticQuantity()); + resultList.add(resultMap); + }); + return ResponseData.success(resultList); } /** @@ -151,12 +168,11 @@ public Object securityNumber() { QueryWrapper wrapper = new QueryWrapper<>(); wrapper.eq("staff_type", 2); + // TODO: 2022/9/2 后续使用产品确定的每天出勤的安保人员的数量 Integer total = staffInfoMapper.selectCount(wrapper); - //当日离岗事件个数 - QueryWrapper wrapper1 = new QueryWrapper<>(); - wrapper1.eq("hik_event_type", SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); - wrapper1.apply("date_format(now(),'%Y-%m-%d') = date_format(happen_time,'%Y-%m-%d')"); - Integer leave = caseInfoMapper.selectCount(wrapper1); + //当日离岗事件按设备去重后的个数 + // TODO: 2022/9/2 目前相当于24小时内的计算,之后看需要可改成自定义小时数计算离岗率,即离岗+6小时内仅一次离岗则恢复为100%,多次则累加离岗次数计算离岗率 + Integer leave = caseInfoMapper.selectDemobilizedCount(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); NumberFormat numberFormat = NumberFormat.getInstance(); // 设置精确到小数点后2位 numberFormat.setMaximumFractionDigits(2); @@ -179,7 +195,6 @@ @ResponseBody public Object visitorApplyDetail() { List reasonGroup = applyMapper.selectByVisitReason(); - HashMap resultMap = new HashMap<>(); NumberFormat numberFormat = NumberFormat.getInstance(); // 设置精确到小数点后2位 numberFormat.setMaximumFractionDigits(2); @@ -187,12 +202,17 @@ if(0 == sum){ return ResponseData.success(); } + List resultList = new ArrayList<>(); reasonGroup.forEach(group -> { String reasonName = dictService.getDictNameByCode(SecurityEventDict.VISIT_REASON, group.getVisitReason()); String result = numberFormat.format((float) group.getQuantity() / (float) sum * 100); - resultMap.put(reasonName, result+"%"); + ApplyReasonGroupDTO applyReasonGroupDTO = new ApplyReasonGroupDTO(); + applyReasonGroupDTO.setQuantity(group.getQuantity()); + applyReasonGroupDTO.setVisitReason(reasonName); + applyReasonGroupDTO.setRatio(result+"%"); + resultList.add(applyReasonGroupDTO); }); - return ResponseData.success(resultMap); + return ResponseData.success(resultList); } /** @@ -247,6 +267,32 @@ } /** + * 机动力量实时在岗率,在岗人数除以总应在岗人数,用离岗+6小时内恢复为100%,6小时外再计算 + */ + @GetMapping("/staff/beOnDutyRatio") + @ResponseBody + public Object beOnDutyRatio() { + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("staff_type", 2); + // TODO: 2022/9/2 后续使用产品确定的每天出勤的安保人员的数量 + Integer total = staffInfoMapper.selectCount(wrapper); + if(0 == total){ + return ResponseData.success(null); + } + //当日离岗事件按设备去重后的个数 + // TODO: 2022/9/2 目前相当于24小时内的计算,之后看需要可改成自定义小时数计算离岗率,即离岗+6小时内仅一次离岗则恢复为100%,多次则累加离岗次数计算离岗率 + List onDutyRatioDTOS = caseInfoMapper.selectDemobilizedCountByHour(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); + onDutyRatioDTOS.forEach(dto -> { + NumberFormat numberFormat = NumberFormat.getInstance(); + // 设置精确到小数点后2位 + numberFormat.setMaximumFractionDigits(2); + String result = numberFormat.format(100 - Float.valueOf(dto.getQuantity()) / (float) total * 100); + dto.setRatio(result+"%"); + }); + return ResponseData.success(onDutyRatioDTOS); + } + + /** * 闸机速通门统计-设备状态分组计算数量,devType传闸机字典key * 视频频监控摄像机统计-设备状态分组计算数量,devType传摄像头字典key */ @@ -262,12 +308,17 @@ if(sum <= 0){ return ResponseData.error("无该类设备信息"); } + List resultList = new ArrayList<>(); gateStatusGroup.forEach(group -> { String devStatus = dictService.getDictNameByCode(SecurityEventDict.DEVICE_STATUS, group.getStatus()); String result = numberFormat.format((float) group.getQuantity() / (float) sum * 100); - resultMap.put(devStatus, result+"%"); + GateStatusGroupResponse gateStatusGroupResponse = new GateStatusGroupResponse(); + gateStatusGroupResponse.setStatus(devStatus); + gateStatusGroupResponse.setRatio(result+"%"); + resultList.add(gateStatusGroupResponse); }); - resultMap.put("总", sum); + resultMap.put("total", sum); + resultMap.put("list", resultList); return ResponseData.success(resultMap); } @@ -282,17 +333,38 @@ String position = securityScoreDTO.getPosition(); List caseInfos = caseInfoMapper.selectByPosition(position); //查询各危险级别权重、各类别权重,放入map,避免循环中多次查数据库 - + HashMap hazardScoreMap = new HashMap<>(); + List caseHazardLevelList = hazardLevelMapper.getCaseHazardLevelList(null); + caseHazardLevelList.forEach(hazardLevel -> { + hazardScoreMap.put(hazardLevel.getCode(), hazardLevel.getWeight()); + }); + HashMap categoryScoreMap = new HashMap<>(); + List categoryLevelList = categoryLevelMapper.getCaseCategoryLevelList(null); + categoryLevelList.forEach(categoryLevel -> { + categoryScoreMap.put(categoryLevel.getCode(), categoryLevel.getWeight()); + }); + //事件按楼层分组,计算 List securityScoreDTOs = new ArrayList<>(); caseInfos.forEach(caseInfo -> { SecurityScoreDTO securityScoreDTO1 = new SecurityScoreDTO(); + securityScoreDTO1.setPosition(caseInfo.getPosition()); securityScoreDTO1.setArea(caseInfo.getArea()); - // TODO: 2022/8/4 楼层评分计算根据产品定义调整 -// caseInfo.get -// securityScoreDTO1.setScore(); + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); + Double score = 100 - Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + securityScoreDTO1.setScore(score); + securityScoreDTOs.add(securityScoreDTO1); }); - - return null; + 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); + }); + return ResponseData.success(securityScoreDTOs); } /** @@ -303,9 +375,13 @@ public Object SecurityFrequency(@RequestBody SecurityFrequencyDTO securityFrequencyDTO) { String year = securityFrequencyDTO.getYear(); String month = securityFrequencyDTO.getMonth(); - Integer quantity = caseInfoMapper.selectCountByMonth(year, month); - securityFrequencyDTO.setQuantity(quantity); - return ResponseData.success(securityFrequencyDTO); + if(!StringUtils.isEmpty(year) && StringUtils.isEmpty(month)){ + Integer quantity = caseInfoMapper.selectCountByMonth(year, month); + securityFrequencyDTO.setQuantity(quantity); + return ResponseData.success(securityFrequencyDTO); + } + List list = caseInfoMapper.selectPreMonthCount(); + return ResponseData.success(list); } } 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 ae4d770..f4f075c 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 @@ -1,20 +1,25 @@ package com.casic.missiles.modular.controller.cockpit; +import cn.hutool.core.date.DateUnit; import cn.hutool.core.date.DateUtil; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.casic.missiles.model.response.ResponseData; -import com.casic.missiles.modular.dao.AttendanceInfoMapper; -import com.casic.missiles.modular.dao.CaseInfoMapper; -import com.casic.missiles.modular.dao.HazardLevelMapper; -import com.casic.missiles.modular.dao.StaffInfoMapper; +import com.casic.missiles.modular.dao.*; +import com.casic.missiles.modular.dto.DeviceRepairLogDTO; +import com.casic.missiles.modular.dto.DeviceRepairRequest; import com.casic.missiles.modular.dto.statistics.*; +import com.casic.missiles.modular.enums.SecurityEventType; +import com.casic.missiles.modular.model.CaseCategoryLevel; import com.casic.missiles.modular.model.CaseHazardLevel; +import com.casic.missiles.modular.model.CaseInfo; import com.casic.missiles.modular.model.StaffInfo; +import com.casic.missiles.modular.service.DeviceInfoService; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.util.CollectionUtils; import org.springframework.web.bind.annotation.*; +import java.math.BigDecimal; import java.text.NumberFormat; import java.util.*; import java.util.stream.Collectors; @@ -40,6 +45,12 @@ @Autowired private HazardLevelMapper hazardLevelMapper; + @Autowired + private CategoryLevelMapper categoryLevelMapper; + + @Autowired + private DeviceInfoService deviceInfoService; + /** * 安防事件时域频次统计,每月的每天安防事件个数(原方案) * 月维度:展示每个月的每天的数据 @@ -89,15 +100,17 @@ List monthList = caseInfoMapper.selectPreMonthCountByYear(year); Map> collect = monthList.stream().collect(Collectors.groupingBy(PreMonthOrWeekCaseDTO::getHazardLevelCode)); HashMap strAvgMap = new HashMap<>(); + List resultList = new ArrayList<>(); for (String key : collect.keySet()) { List preMonthOrWeekCaseDTOS = collect.get(key); int sum = preMonthOrWeekCaseDTOS.stream().mapToInt(PreMonthOrWeekCaseDTO::getQuantity).sum(); //若年份是本年,则使用个安防级别数量/当前月份数 //若不是本年,除数为12 MonthAndWeekDTO monthAndWeekDTO = new MonthAndWeekDTO(); + String hazardName = hazardLevelMapper.selectHazardNameByCode(key); + monthAndWeekDTO.setLevelName(hazardName); if(year.equals(String.valueOf(DateUtil.thisYear()))){ monthAndWeekDTO.setMonthQuantity(sum / DateUtil.thisMonth()); -// monthAndWeekDTO.setLevelName(); strAvgMap.put(key, monthAndWeekDTO); }else{ monthAndWeekDTO.setMonthQuantity(sum / 12); @@ -113,27 +126,37 @@ if(year.equals(String.valueOf(DateUtil.thisYear()))){ if(!Objects.isNull(strAvgMap.get(key))){ MonthAndWeekDTO monthAndWeekDTO = strAvgMap.get(key); + String hazardName = hazardLevelMapper.selectHazardNameByCode(key); + monthAndWeekDTO.setLevelName(hazardName); monthAndWeekDTO.setWeekQuantity(sum / DateUtil.thisWeekOfYear()); strAvgMap.put(key, monthAndWeekDTO); }else{ MonthAndWeekDTO monthAndWeekDTO = new MonthAndWeekDTO(); + String hazardName = hazardLevelMapper.selectHazardNameByCode(key); + monthAndWeekDTO.setLevelName(hazardName); monthAndWeekDTO.setWeekQuantity(sum / DateUtil.thisWeekOfYear()); strAvgMap.put(key, monthAndWeekDTO); } }else{ if(!Objects.isNull(strAvgMap.get(key))){ MonthAndWeekDTO monthAndWeekDTO = strAvgMap.get(key); + String hazardName = hazardLevelMapper.selectHazardNameByCode(key); + monthAndWeekDTO.setLevelName(hazardName); monthAndWeekDTO.setWeekQuantity(sum / 52); strAvgMap.put(key, monthAndWeekDTO); }else{ MonthAndWeekDTO monthAndWeekDTO = new MonthAndWeekDTO(); + String hazardName = hazardLevelMapper.selectHazardNameByCode(key); + monthAndWeekDTO.setLevelName(hazardName); monthAndWeekDTO.setWeekQuantity(sum / 52); strAvgMap.put(key, monthAndWeekDTO); } } } - avgMonthAndWeekGroupDTO.setMap(strAvgMap); - return ResponseData.success(avgMonthAndWeekGroupDTO); + strAvgMap.keySet().forEach(key -> { + resultList.add(strAvgMap.get(key)); + }); + return ResponseData.success(resultList); } /** @@ -181,12 +204,178 @@ } /** - * 员工考勤人数变化,功能待定 + * 员工考勤人数变化,统计当天(横坐标为时)及近7天(横坐标为天)的考勤人数变化,只要发生一次考勤识别,次数的基数就正常增加(没有上班下班区分) */ + @PostMapping("/staff/attendanceNumber/{dimension}") + @ResponseBody + public Object attendanceNumber(@PathVariable("dimension") String dimension) { + List attendanceNumberDTOs = null; + List> resultList = new ArrayList<>(); + if("week".equals(dimension)){ + //近7天数据按天分组统计 + attendanceNumberDTOs = attendanceInfoMapper.getCountForWeek(); + }else if("day".equals(dimension)) { + //今天数据按小时分组统计 + attendanceNumberDTOs = attendanceInfoMapper.getCountForDay(); + } + if(CollectionUtils.isEmpty(attendanceNumberDTOs)){ + return ResponseData.error("该查询条件下,无员工出勤数据!"); + } + Map> collect = attendanceNumberDTOs.stream().collect(Collectors.groupingBy(AttendanceNumberDTO::getDate)); + collect.keySet().forEach(key -> { + List attendanceNumberDTOS = collect.get(key); + AttendanceNumberDTO attendanceNumberDTO = attendanceNumberDTOS.get(0); + AttendanceNumberDTO attendanceNumberDTO2 = attendanceNumberDTOS.get(1); + Map resultMap = new HashMap<>(); + resultMap.put(attendanceNumberDTO.getStaffType(), attendanceNumberDTO.getQuantity()); + resultMap.put(attendanceNumberDTO2.getStaffType(), attendanceNumberDTO2.getQuantity()); + resultMap.put("staticTime", attendanceNumberDTO.getDate()); + resultList.add(resultMap); + }); + return ResponseData.success(resultList); + } /** - * 近30天/近一周安保人员到岗排行 + * 早晚高峰区域安防评估 */ + @PostMapping("/security/assessment/{dimension}") + @ResponseBody + public Object securityAssessment(@PathVariable("dimension") String dimension) { + //查询各危险级别权重、各类别权重,放入map,避免循环中多次查数据库 + HashMap hazardScoreMap = new HashMap<>(); + List caseHazardLevelList = hazardLevelMapper.getCaseHazardLevelList(null); + caseHazardLevelList.forEach(hazardLevel -> { + hazardScoreMap.put(hazardLevel.getCode(), hazardLevel.getWeight()); + }); + HashMap categoryScoreMap = new HashMap<>(); + List categoryLevelList = categoryLevelMapper.getCaseCategoryLevelList(null); + categoryLevelList.forEach(categoryLevel -> { + categoryScoreMap.put(categoryLevel.getCode(), categoryLevel.getWeight()); + }); + HashMap hashMap = new HashMap<>(); + if("week".equals(dimension)){ + //近7天早晚高峰数据 + List caseInfos = caseInfoMapper.selectListBySevenDay(); + //按时间(天)进行分组 + caseInfos.forEach(caseInfo -> { + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); + Double score = Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + String[] array = caseInfo.getHappenTime().split(" "); + String dayTime = array[0]; + BigDecimal preScore; + if(hashMap.containsKey(dayTime)){ + Double aDouble = hashMap.get(dayTime); + preScore = new BigDecimal(aDouble.toString()); + + }else{ + preScore = new BigDecimal("100.0"); + } + BigDecimal nowScore = new BigDecimal(score.toString()); + hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); + }); + return ResponseData.success(hashMap); + }else if("day".equals(dimension)) { + //今天数据按小时分组统计 + List caseInfos = caseInfoMapper.selectListByToday(); + caseInfos.forEach(caseInfo -> { + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); + Double score = Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + String[] array = caseInfo.getHappenTime().split(":"); + String dayTime = array[0]; + BigDecimal preScore; + if(hashMap.containsKey(dayTime)){ + Double aDouble = hashMap.get(dayTime); + preScore = new BigDecimal(aDouble.toString()); + + }else{ + preScore = new BigDecimal("100.0"); + } + BigDecimal nowScore = new BigDecimal(score.toString()); + hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); + }); + return ResponseData.success(hashMap); + } + return null; + } + + /** + * 重点区域安防事态评估,统计重点区域6:00-23:00按小时分组数据 + */ + @GetMapping("/security/keyAreaStatistic") + @ResponseBody + public Object keyAreaStatistic() { + //查询各危险级别权重、各类别权重,放入map,避免循环中多次查数据库 + HashMap hazardScoreMap = new HashMap<>(); + List caseHazardLevelList = hazardLevelMapper.getCaseHazardLevelList(null); + caseHazardLevelList.forEach(hazardLevel -> { + hazardScoreMap.put(hazardLevel.getCode(), hazardLevel.getWeight()); + }); + HashMap categoryScoreMap = new HashMap<>(); + List categoryLevelList = categoryLevelMapper.getCaseCategoryLevelList(null); + categoryLevelList.forEach(categoryLevel -> { + categoryScoreMap.put(categoryLevel.getCode(), categoryLevel.getWeight()); + }); + HashMap hashMap = new HashMap<>(); + //今天数据按小时分组统计 + List caseInfos = caseInfoMapper.selectListByToday2(); + caseInfos.forEach(caseInfo -> { + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); + Double score = Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + String[] array = caseInfo.getHappenTime().split(":"); + String dayTime = array[0]; + BigDecimal preScore; + if(hashMap.containsKey(dayTime)){ + Double aDouble = hashMap.get(dayTime); + preScore = new BigDecimal(aDouble.toString()); + + }else{ + preScore = new BigDecimal("100.0"); + } + BigDecimal nowScore = new BigDecimal(score.toString()); + hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); + }); + return ResponseData.success(hashMap); + } + + /** + * 安防机动支援力量调配响应评估,根据事件已解决状态及已解决时间-发送时间,按时间(小时)分组统计 + */ + @GetMapping("/security/responseAssess") + @ResponseBody + public Object responseAssess() { + //查询各危险级别权重、各类别权重,放入map,避免循环中多次查数据库 + HashMap hazardScoreMap = new HashMap<>(); + List caseHazardLevelList = hazardLevelMapper.getCaseHazardLevelList(null); + caseHazardLevelList.forEach(hazardLevel -> { + hazardScoreMap.put(hazardLevel.getCode(), hazardLevel.getWeight()); + }); + HashMap hashMap = new HashMap<>(); + //今天数据按小时分组统计 + List caseInfos = caseInfoMapper.selectListByToday3(); + caseInfos.forEach(caseInfo -> { + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + //扣分=事件级别权重*未解决小时数 + Date updateTime = DateUtil.parse(caseInfo.getUpdateTime()); + Date happenTime = DateUtil.parse(caseInfo.getHappenTime()); + long between = DateUtil.between(updateTime, happenTime, DateUnit.HOUR); + Double score = Double.valueOf(hazardWeight)*between; + String[] array = caseInfo.getHappenTime().split(":"); + String dayTime = array[0]; + BigDecimal preScore; + if(hashMap.containsKey(dayTime)){ + Double aDouble = hashMap.get(dayTime); + preScore = new BigDecimal(aDouble.toString()); + }else{ + preScore = new BigDecimal("100.0"); + } + BigDecimal nowScore = new BigDecimal(score.toString()); + hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); + }); + return ResponseData.success(hashMap); + } /** * 重点区域威胁事件类型统计,优先级2,统计近7天和近30天 @@ -224,7 +413,34 @@ } /** - * 设备状态计算系数和评判,优先级3,需确认设备恢复时间是否可以获取 + * 近30天/近一周安保人员到岗排行 */ + + /** + * 安保等级评估,发生离岗事件减1分 + */ + @GetMapping("/security/levelAssess") + @ResponseBody + public Object securityLevelAssess() { + //今天数据按小时分组统计 + List resultList = caseInfoMapper.selectListByType(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); + resultList.forEach(result -> { + BigDecimal deScore = new BigDecimal(result.getQuantity()); + BigDecimal preScore = new BigDecimal("100.0"); + result.setScore(preScore.subtract(deScore).doubleValue()); + }); + return ResponseData.success(resultList); + } + + /** + * 设备状态计算系数和评判,即设备维修管理查询(不分页) + */ + @PostMapping("/device/repairList") + @ResponseBody + public Object repairList(@RequestBody DeviceRepairRequest deviceRepairRequest) { + List deviceRepairLogDTOS = deviceInfoService.deviceRepairListPage(deviceRepairRequest); + return ResponseData.success(deviceRepairLogDTOS); + } + } 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 fbf8ab6..c71a15a 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 @@ -1,13 +1,12 @@ package com.casic.missiles.modular.controller.hik; +import cn.hutool.core.date.DateTime; +import cn.hutool.core.date.DateUtil; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.casic.missiles.model.response.ResponseData; import com.casic.missiles.modular.dao.HikFaceGroupInfoMapper; -import com.casic.missiles.modular.dto.hik.EventSubscribeRequest; -import com.casic.missiles.modular.dto.hik.FaceGroupAdditionRequest; -import com.casic.missiles.modular.dto.hik.HikRecvEvent; -import com.casic.missiles.modular.dto.hik.OrgBatchAdd; +import com.casic.missiles.modular.dto.hik.*; import com.casic.missiles.modular.enums.HikUri; import com.casic.missiles.modular.enums.SecurityEventType; import com.casic.missiles.modular.model.CaseInfo; @@ -18,16 +17,20 @@ import com.casic.missiles.modular.util.CaseInfoFactoryUtil; import com.casic.missiles.modular.util.HikUtil; import com.casic.missiles.modular.util.ThreadPoolUtil; +import com.casic.missiles.modular.util.WebSocket; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; -import org.springframework.web.bind.annotation.*; +import org.springframework.util.CollectionUtils; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.RestController; -import java.net.InetAddress; -import java.net.UnknownHostException; import java.util.ArrayList; +import java.util.Iterator; import java.util.List; import java.util.Objects; @@ -38,7 +41,6 @@ */ @Slf4j @RestController -@RequestMapping("/hik") public class HikController { @Autowired @@ -53,28 +55,37 @@ @Autowired private HikService hikService; + @Autowired + private HikFaceGroupInfoMapper hikFaceGroupInfoMapper; + + @Autowired + private WebSocket webSocket; + @Value("${server.port}") private int serverPort; - @Autowired - private HikFaceGroupInfoMapper hikFaceGroupInfoMapper; /** * 海康事件订阅 */ - @PostMapping("/event/subscribe") + @PostMapping("/hik/event/subscribe") @ResponseBody - public Object eventSubscribe() throws UnknownHostException { + public Object eventSubscribe() { EventSubscribeRequest eventSubscribeRequest = new EventSubscribeRequest(); ArrayList list = new ArrayList<>(); list.add(SecurityEventType.DEVICE_OFFLINE); + list.add(SecurityEventType.DEVICE_ONLINE); list.add(SecurityEventType.KEY_PERSONNEL_IDENTIFY_EVENT); list.add(SecurityEventType.MONITORING_POINT_OFFLINE); + list.add(SecurityEventType.MONITORING_POINT_ONLINE); list.add(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); list.add(SecurityEventType.PERSONNEL_GATHER_EVENT); - InetAddress localHost = InetAddress.getLocalHost(); + list.add(SecurityEventType.VISITOR_REGISTER); + list.add(SecurityEventType.VISITOR_CHECKOUT); + list.add(SecurityEventType.HIGH_ALTITUDE_PARABOLIC); +// InetAddress localHost = InetAddress.getLocalHost(); eventSubscribeRequest.setEventTypes(list); - eventSubscribeRequest.setEventDest("https://" + localHost + ":" + serverPort + "/eventRcv"); + eventSubscribeRequest.setEventDest("http://" + "192.168.10.6" + ":" + serverPort + "/eventRcv"); //订阅类型,0-订阅原始事件,1-联动事件,2-原始事件和联动事件,不填使用默认值0 eventSubscribeRequest.setSubType(0); /** @@ -92,19 +103,25 @@ } /** + * 查询事件订阅信息 + */ + @PostMapping("/hik/event/query") + @ResponseBody + public Object eventQuery() { + String result = HikUtil.hikApi(HikUri.EVENT_INFO, ""); + return result; + } + + /** * 海康事件接收 */ @PostMapping("/eventRcv") @ResponseBody public Object eventRcv(@RequestBody HikRecvEvent hikRecvEvent) { //1、接收所需事件类型 - Long eventType = hikRecvEvent.getEventType(); + Number eventType = hikRecvEvent.getEventType(); log.info("接收到安防事件类型为:{}", eventType); CaseInfo caseInfo = caseInfoFactoryUtil.getCaseInfo(eventType); - //接收到不关心事件直接返回 - if(Objects.isNull(caseInfo)){ - return ResponseData.success(); - } //2、不同事件不同处理,caseInfoFactoryUtil已设置好事件基础定义信息 // 再为事件添加状态、设备编码、设备名称、位置、区域、时间 // 异步处理事件 @@ -114,19 +131,23 @@ caseHandle(hikRecvEvent, eventType, caseInfo); } })); +// caseHandle(hikRecvEvent, eventType, caseInfo); - return null; + return ResponseData.success(); } - private void caseHandle(HikRecvEvent hikRecvEvent, Long eventType, CaseInfo caseInfo) { + private void caseHandle(HikRecvEvent hikRecvEvent, Number eventType, CaseInfo caseInfo) { JSONArray eventArray = hikRecvEvent.getEventArray(); List caseInfos = new ArrayList<>(); - while (eventArray.stream().iterator().hasNext()) { + Iterator iterator = eventArray.iterator(); + while (iterator.hasNext()) { CaseInfo caseInfo1 = new CaseInfo(); - BeanUtils.copyProperties(caseInfo, caseInfo1); - JSONObject event = (JSONObject) eventArray.stream().iterator().next(); + if(!Objects.isNull(caseInfo)){ + BeanUtils.copyProperties(caseInfo, caseInfo1); + } + JSONObject event = (JSONObject) iterator.next(); //5种事件进行不同处理 - if(SecurityEventType.KEY_PERSONNEL_IDENTIFY_EVENT == eventType){ + if (SecurityEventType.KEY_PERSONNEL_IDENTIFY_EVENT.equals(eventType)) { //判断所属人脸分组 JSONObject data = (JSONObject) event.get("data"); JSONObject faceRecognitionResult = (JSONObject) data.get("faceRecognitionResult"); @@ -142,52 +163,101 @@ if (faceGroupCode.equals(blackListGroup.getFaceGroupCode())) { //黑名单分组处理 caseInfo1 = hikService.blackListHandle(event, caseInfo1); - }else if(faceGroupCode.equals(propertyPersonnelGroup.getFaceGroupCode())){ + } else if (faceGroupCode.equals(propertyPersonnelGroup.getFaceGroupCode())) { //考勤分组处理-物业人员,添加到考勤表 hikService.propertyAttendanceHandle(event); - }else if(faceGroupCode.equals(securityPersonnelGroup.getFaceGroupCode())){ + } else if (faceGroupCode.equals(securityPersonnelGroup.getFaceGroupCode())) { //考勤分组处理-安保人员,添加到考勤表 hikService.securityPersonnelHandle(event); - }else { + } else { return; } - }else if(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT == eventType){ + } else if (SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT.equals(eventType)) { //离岗事件处理 caseInfo1 = hikService.demobilizedHandle(event, caseInfo1); - }else if(SecurityEventType.PERSONNEL_GATHER_EVENT == eventType){ + } else if (SecurityEventType.PERSONNEL_GATHER_EVENT.equals(eventType)) { //人员聚集事件处理 caseInfo1 = hikService.personGatherHandle(event, caseInfo1); - }else if(SecurityEventType.MONITORING_POINT_OFFLINE == eventType){ + } else if (SecurityEventType.MONITORING_POINT_OFFLINE.equals(eventType)) { //监控点离线事件处理 caseInfo1 = hikService.monitorPointOfflineHandle(event, caseInfo1); - }else if(SecurityEventType.DEVICE_OFFLINE == eventType){ + } else if (SecurityEventType.MONITORING_POINT_ONLINE.equals(eventType)) { + //监控点上线事件处理 + hikService.monitorPointOnlineHandle(event); + } else if (SecurityEventType.DEVICE_OFFLINE.equals(eventType)) { //装置离线事件处理 caseInfo1 = hikService.deviceOfflineHandle(event, caseInfo1); - }else if(SecurityEventType.VISITOR_REGISTER == eventType){ + } else if (SecurityEventType.DEVICE_ONLINE.equals(eventType)) { + //装置上线处理 + hikService.deviceOnlineHandle(event); + } else if (SecurityEventType.VISITOR_REGISTER.equals(eventType)) { //记录访客登记记录,添加到访客记录表 hikService.visitorRegisterHandler(event); - }else if(SecurityEventType.VISITOR_CHECKOUT == eventType){ + } else if (SecurityEventType.VISITOR_CHECKOUT.equals(eventType)) { //记录访客签离记录 hikService.visitorCheckOutHandler(event); } - if(!Objects.isNull(caseInfo1) && !StringUtils.isEmpty(caseInfo1.getHappenTime())){ + if (!Objects.isNull(caseInfo1) && !StringUtils.isEmpty(caseInfo1.getHappenTime())) { caseInfos.add(caseInfo1); } } //3、安防事件入库 - if(!caseInfoService.insertCaseInfoBatch(caseInfos)){ - log.error("安防事件批量入库异常"); + if (!CollectionUtils.isEmpty(caseInfos) && !caseInfoService.insertCaseInfoBatch(caseInfos)) { + log.error("安防事件批量入库异常!"); } // TODO: 2022/8/15 webSocket推送 + if (CollectionUtils.isEmpty(caseInfos)) { + log.info("webSocket事件推送"); + webSocket.sendAllMessage(JSONObject.toJSONString(caseInfos)); + } return; } /** + * 以图搜图,前端用于轨迹追踪 + */ + @PostMapping("/hik/search/picture") + @ResponseBody + public Object searchPictures(@RequestBody SearchPicturesRequest searchPicturesRequest) { + DateTime startDateTime = DateUtil.parse(searchPicturesRequest.getStartTime()); + DateTime endDateTime = DateUtil.parse(searchPicturesRequest.getEndTime()); + String startTime = DateUtil.format(startDateTime, "yyyy-MM-dd'T'HH:mm:ss.SSSXXX"); + String endTime = DateUtil.format(endDateTime, "yyyy-MM-dd'T'HH:mm:ss.SSSXXX"); + searchPicturesRequest.setStartTime(startTime); + searchPicturesRequest.setEndTime(endTime); + String body = JSONObject.toJSONString(searchPicturesRequest); + String resultStr = HikUtil.hikApi(HikUri.SEARCH_PICTURES, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (!"0".equals(resultJson.get("code"))) { + log.error("请求海康,以图搜图失败,海康response:{}", resultStr); + return ResponseData.error("以图搜图失败"); + } + return ResponseData.success(resultJson); + } + + + /** + * 海康事件取消订阅 + */ + @PostMapping("/hik/event/cancel") + @ResponseBody + public Object eventCancelSubscribe(@RequestBody CancelSubscribeRequest cancelSubscribeRequest) { + String body = JSONObject.toJSONString(cancelSubscribeRequest); + String resultStr = HikUtil.hikApi(HikUri.EVENT_CANCEL, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (!"0".equals(resultJson.get("code"))) { + log.error("请求海康,取消订阅失败,海康response:{}", resultStr); + return ResponseData.error("取消订阅失败"); + } + return ResponseData.success(resultJson); + } + + /** * 单个添加海康人脸分组 * api->hik单个添加人脸分组api->response->mysql */ - @PostMapping("/faceGroup/single/add") + @PostMapping("/hik/faceGroup/single/add") @ResponseBody public Object faceGroupAddition(@RequestBody FaceGroupAdditionRequest faceGroupAdditionRequest) { String body = JSONObject.toJSONString(faceGroupAdditionRequest); @@ -212,7 +282,7 @@ * 批量添加海康组织 * api->hik批量添加组织api->response */ - @PostMapping("/org/batch/add") + @PostMapping("/hik/org/batch/add") @ResponseBody public Object orgBatchAdd(@RequestBody List orgBatchAddRequest) { String body = JSONObject.toJSONString(orgBatchAddRequest); @@ -232,4 +302,62 @@ return ResponseData.error("批量添加组织失败"); } + /** + * 获取人员列表 + */ + @PostMapping("/hik/person/personList") + @ResponseBody + public Object personList() { + PersonListRequest request = new PersonListRequest(); + request.setPageNo(1); + request.setPageSize(100); + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi("/api/resource/v2/person/personList", body); + return resultStr; + } + + /** + * 获取组织列表 + */ + @PostMapping("/hik/org/orgList") + @ResponseBody + public Object orgList() { + PersonListRequest request = new PersonListRequest(); + request.setPageNo(1); + request.setPageSize(100); + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi("/api/resource/v1/org/orgList", body); + return resultStr; + } + + /** + * 查询访客权限下载记录 + */ + @PostMapping("/hik/auth/result") + @ResponseBody + public Object authResult() { + PersonListRequest request = new PersonListRequest(); + request.setPageNo(1); + request.setPageSize(100); + request.setOrderId("ba101db6246711edaea66f7939a13638"); + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi("/api/visitor/v1/auth/result", body); + return resultStr; + } + + /** + * 人脸图片获取 + */ + @PostMapping("/hik/face/picture") + @ResponseBody + public Object facePicture() { + FaceRequest request = new FaceRequest(); +// List list = new ArrayList<>(); +// list.add(""); + request.setCertificateNum("wanggong"); + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi("/api/frs/v1/face", body); + return resultStr; + } + } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/AssetInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/AssetInfoMapper.java index 4f64e83..c0684ee 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/AssetInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/AssetInfoMapper.java @@ -17,6 +17,6 @@ @Mapper public interface AssetInfoMapper extends BaseMapper { - List getAssetInfoListPage(@Param("page") Page page, AssetInfoRequest assetInfoRequest); + List getAssetInfoListPage(@Param("page") Page page, @Param("assetInfoRequest") AssetInfoRequest assetInfoRequest); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/AttendanceInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/AttendanceInfoMapper.java index f9e793e..ec87e46 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/AttendanceInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/AttendanceInfoMapper.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.statistics.AttendanceNumberDTO; import com.casic.missiles.modular.dto.statistics.AttendanceRatioDTO; import com.casic.missiles.modular.model.AttendanceInfo; import org.apache.ibatis.annotations.Mapper; @@ -17,7 +18,7 @@ */ @Mapper public interface AttendanceInfoMapper extends BaseMapper { - List getAttendanceInfoListPage(@Param("page") Page page, StaffInfoRequest attendanceInfoRequest); + List getAttendanceInfoListPage(@Param("page") Page page, @Param("attendanceInfoRequest") StaffInfoRequest attendanceInfoRequest); AttendanceInfo selectByCodeAndDate(@Param("staffCode") String staffCode); @@ -26,4 +27,8 @@ List getCountByTypeAndDateForMonth(@Param("staffType")String staffType); List getCountByTypeAndDateForYear(@Param("staffType")String staffType); + + List getCountForWeek(); + + List getCountForDay(); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java index ce94b8f..6137a7d 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java @@ -17,5 +17,5 @@ @Mapper public interface BlackInfoMapper extends BaseMapper { - List getBlackInfoListPage(@Param("page") Page page, BlackInfoRequest blackInfoRequest); + List getBlackInfoListPage(@Param("page") Page page, @Param("blackInfoRequest") BlackInfoRequest blackInfoRequest); } 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 efda6b3..50aaa6f 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 @@ -20,7 +20,7 @@ List getCaseInfoListPage(@Param("page") Page page, @Param("caseInfoRequest") CaseInfoRequest caseInfoRequest); - int updateStatusById(CaseInfoRequest caseInfoRequest); + int updateStatusById(@Param("caseInfoRequest") CaseInfoRequest caseInfoRequest); List selectByLevelAndMonth(@Param("year") String year); @@ -47,4 +47,20 @@ List selectPreWeekCountByThirtyDay(); List selectPreDayCountBySevenDay(); + + Integer selectDemobilizedCount(@Param("eventType") Number personnelDemobilizedEvent); + + List selectPreMonthCount(); + + List selectListBySevenDay(); + + List selectListByToday(); + + List selectListByToday2(); + + List selectListByToday3(); + + List selectListByType(@Param("eventType") Number eventType); + + List selectDemobilizedCountByHour(@Param("eventType") Number eventType); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/CategoryLevelMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/CategoryLevelMapper.java index 52fc714..afe1650 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/CategoryLevelMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/CategoryLevelMapper.java @@ -17,9 +17,9 @@ @Mapper public interface CategoryLevelMapper extends BaseMapper { - List getCaseCategoryLevelListPage(@Param("page") Page page, CategoryLevelRequest categoryLevelRequest); + List getCaseCategoryLevelListPage(@Param("page") Page page, @Param("categoryLevelRequest") CategoryLevelRequest categoryLevelRequest); - List getCaseCategoryLevelList(CategoryLevelRequest categoryLevelRequest); + List getCaseCategoryLevelList(@Param("categoryLevelRequest") CategoryLevelRequest categoryLevelRequest); CaseCategoryLevel getCaseCategoryLevel(@Param("categoryLevelCode") String categoryLevelCode); 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 66353b1..2555a09 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 @@ -19,7 +19,7 @@ @Mapper public interface DeviceInfoMapper extends BaseMapper { - List getDeviceInfoListPage(@Param("page") Page page, DeviceInfoRequest deviceInfoRequest); + List getDeviceInfoListPage(@Param("page") Page page, @Param("deviceInfoRequest") DeviceInfoRequest deviceInfoRequest); List getDeviceInfoList(@Param("deviceInfoRequest") DeviceInfoRequest deviceInfoRequest); @@ -27,6 +27,8 @@ DeviceInfo getByIndexCode(@Param("srcIndex") String srcIndex); + DeviceInfo getByIp(@Param("ip") String ip); + List selectIndexCodesByCodes(@Param("deviceCodes") List deviceCodes); List selectByType(@Param("devType") String devType); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java index 41dd0af..5bfaf63 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java @@ -5,6 +5,7 @@ import com.casic.missiles.modular.dto.DeviceRepairRequest; import com.casic.missiles.modular.model.DeviceRepairLog; import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; import java.util.List; @@ -16,7 +17,7 @@ @Mapper public interface DeviceRepairLogMapper extends BaseMapper { - List getDeviceRepairListPage(Page page, DeviceRepairRequest deviceRepairRequest); + List getDeviceRepairListPage(@Param("page") Page page, @Param("deviceRepairRequest")DeviceRepairRequest deviceRepairRequest); - List getDeviceRepairList(DeviceRepairRequest deviceRepairRequest); + List getDeviceRepairList(@Param("deviceRepairRequest") DeviceRepairRequest deviceRepairRequest); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java index 9035c47..4823ac1 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java @@ -18,7 +18,7 @@ @Mapper public interface FireEquipInfoMapper extends BaseMapper { - List getFireEquipInfoListPage(@Param("page") Page page, FireEquipRequest fireEquipRequest); + List getFireEquipInfoListPage(@Param("page") Page page, @Param("fireEquipRequest") FireEquipRequest fireEquipRequest); FireEquipInfo getFireEquipInfo(@Param("equipCode") String equipCode); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/GateGroupMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/GateGroupMapper.java index d8c330d..977a427 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/GateGroupMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/GateGroupMapper.java @@ -17,7 +17,7 @@ */ @Mapper public interface GateGroupMapper extends BaseMapper { - List getGateGroupListPage(@Param("page") Page page, GateGroupRequest gateGroupRequest); + List getGateGroupListPage(@Param("page") Page page, @Param("gateGroupRequest") GateGroupRequest gateGroupRequest); GateGroup getGateGroupByName(@Param("groupName") String groupName); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/HazardLevelMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/HazardLevelMapper.java index 8957780..dcf47bb 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/HazardLevelMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/HazardLevelMapper.java @@ -17,11 +17,13 @@ @Mapper public interface HazardLevelMapper extends BaseMapper { - List getCaseHazardLevelListPage(@Param("page") Page page, HazardLevelRequest hazardLevelRequest); + List getCaseHazardLevelListPage(@Param("page") Page page, @Param("hazardLevelRequest") HazardLevelRequest hazardLevelRequest); - List getCaseHazardLevelList(HazardLevelRequest hazardLevelRequest); + List getCaseHazardLevelList(@Param("hazardLevelRequest") HazardLevelRequest hazardLevelRequest); CaseHazardLevel getCaseHazardLevel(@Param("hazardLevelCode") String hazardLevelCode); List selectHazardName(); + + String selectHazardNameByCode(@Param("hazardLevelCode") String hazardLevelCode); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/HikCaseDefineMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/HikCaseDefineMapper.java index 0dc47d1..f162fef 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/HikCaseDefineMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/HikCaseDefineMapper.java @@ -12,5 +12,5 @@ */ @Mapper public interface HikCaseDefineMapper extends BaseMapper { - HikCaseDefine getHikCaseDefine(@Param("caseTypeCode") Long caseTypeCode); + HikCaseDefine getHikCaseDefine(@Param("caseTypeCode") Number caseTypeCode); } 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 f8a674c..fe5afc2 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 @@ -17,11 +17,13 @@ @Mapper public interface StaffInfoMapper extends BaseMapper { - List getStaffInfoListPage(@Param("page") Page page, StaffInfoRequest staffInfoRequest); + List getStaffInfoListPage(@Param("page") Page page, @Param("staffInfoRequest") StaffInfoRequest staffInfoRequest); StaffInfo selectByCode(@Param("staffCode") String staffCode); - List getStaffInfoList(StaffInfoRequest staffInfoRequest); + List getStaffInfoList(@Param("staffInfoRequest") StaffInfoRequest staffInfoRequest); - List selectBatchCodes(List list); + List selectBatchCodes(@Param("list") List list); + + int updateByCodeForCard(@Param("staffCode") String staffCode, @Param("cardNo") String cardNo); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitInfoMapper.java index b1217c5..6c52542 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitInfoMapper.java @@ -16,7 +16,7 @@ */ @Mapper public interface VisitInfoMapper extends BaseMapper { - List getVisitInfoListPage(@Param("page") Page page, VisitorRequest visitorRequest); + List getVisitInfoListPage(@Param("page") Page page, @Param("visitorRequest") VisitorRequest visitorRequest); VisitInfo selectByOrderId(@Param("orderId") String orderId); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitorApplyMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitorApplyMapper.java index c09f3c0..6ea55bd 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitorApplyMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitorApplyMapper.java @@ -18,7 +18,7 @@ @Mapper public interface VisitorApplyMapper extends BaseMapper { - List getVisitorApplyListPage(@Param("page") Page page, VisitorApplyRequest visitorApplyRequest); + List getVisitorApplyListPage(@Param("page") Page page, @Param("visitorApplyRequest") VisitorApplyRequest visitorApplyRequest); List selectByVisitReason(); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/AttendanceInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/AttendanceInfoMapper.xml index b2ece71..f8bdd6e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/AttendanceInfoMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/AttendanceInfoMapper.xml @@ -43,7 +43,8 @@ and staff_type = #{staffType} - and YEARWEEK(date_format(atte_date, '%Y-%m-%d'), 1) = YEARWEEK(now(),1); + AND DATE_SUB(CURDATE(), INTERVAL 7 DAY) <= DATE(atte_date) + GROUP BY DATE_FORMAT(atte_date, '%Y-%m-%d') @@ -69,4 +70,20 @@ GROUP BY DATE_FORMAT(atte_date, '%Y-%m') + + + \ No newline at end of file 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 2b6953f..06ec0a8 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 @@ -28,7 +28,9 @@ @@ -87,7 +89,8 @@ SELECT hazard_level_code as levelCode, count(id) as quantity FROM bus_case_info WHERE hazard_level_code is not null - AND DATE_SUB(CURDATE(), INTERVAL 7 DAY) <= date(happen_time); + AND is_key_area = 1 + AND DATE_SUB(CURDATE(), INTERVAL 7 DAY) <= date(happen_time) GROUP BY hazard_level_code @@ -95,7 +98,8 @@ SELECT hazard_level_code as levelCode, count(id) as quantity FROM bus_case_info WHERE hazard_level_code is not null - AND DATE_SUB(CURDATE(), INTERVAL 30 DAY) <= date(happen_time); + AND is_key_area = 1 + AND DATE_SUB(CURDATE(), INTERVAL 30 DAY) <= date(happen_time) GROUP BY hazard_level_code @@ -122,4 +126,71 @@ AND hazard_level_code is not null GROUP BY DATE_FORMAT(happen_time,'%Y-%m-%d') + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/CategoryLevelMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/CategoryLevelMapper.xml index 4670b1f..1d25cbd 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/CategoryLevelMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/CategoryLevelMapper.xml @@ -20,11 +20,11 @@ SELECT * FROM bus_case_category_level WHERE 1=1 - - and code = #{code} + + and code = #{categoryLevelRequest.code} - - and name = #{name} + + and name = #{categoryLevelRequest.name} ORDER by create_time DESC 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 9b66fd8..bfd84b7 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 @@ -98,4 +98,10 @@ #{item} + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceRepairLogMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceRepairLogMapper.xml index 078ed3c..cf1a481 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceRepairLogMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceRepairLogMapper.xml @@ -22,14 +22,14 @@ SELECT * FROM bus_device_repair_log WHERE 1=1 - - and device_code = #{devCode} + + and device_code = #{deviceRepairRequest.devCode} - - and device_name = #{devName} + + and device_name = #{deviceRepairRequest.devName} - - and DATE_FORMAT(create_time,"%y%m%d") = DATE_FORMAT(#{createTime},"%y%m%d") + + and DATE_FORMAT(create_time,"%y%m%d") = DATE_FORMAT(#{deviceRepairRequest.createTime},"%y%m%d") ORDER by create_time DESC diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/HazardLevelMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/HazardLevelMapper.xml index f16f2b9..458322b 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/HazardLevelMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/HazardLevelMapper.xml @@ -20,11 +20,11 @@ SELECT * FROM bus_case_hazard_level WHERE 1=1 - - and code = #{code} + + and code = #{hazardLevelRequest.code} - - and name = #{name} + + and name = #{hazardLevelRequest.name} ORDER by create_time DESC @@ -42,4 +42,10 @@ SELECT name FROM bus_case_hazard_level + + \ 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 557237e..b6a183a 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 @@ -50,4 +50,10 @@ + + + UPDATE bus_staff_info + SET card_no = #{cardNo} + WHERE staff_code = #{staffCode} + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitInfoMapper.xml index 84aa84f..230529a 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitInfoMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitInfoMapper.xml @@ -27,5 +27,6 @@ SELECT * FROM bus_visit_info WHERE order_id = #{orderId} and DATE_FORMAT(in_time,'%Y-%m-%d') = CURRENT_DATE + limit 1 \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/BlackPictureRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/BlackPictureRequest.java new file mode 100644 index 0000000..fc92701 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/BlackPictureRequest.java @@ -0,0 +1,14 @@ +package com.casic.missiles.modular.dto; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/29 19:26 + */ +@Data +public class BlackPictureRequest { + private String picUri; + private String serverIndexCode; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/CancelSubscribeRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/CancelSubscribeRequest.java new file mode 100644 index 0000000..e2d390a --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/CancelSubscribeRequest.java @@ -0,0 +1,15 @@ +package com.casic.missiles.modular.dto.hik; + +import lombok.Data; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/24 15:14 + */ +@Data +public class CancelSubscribeRequest { + private List eventTypes; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/CardInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/CardInfo.java new file mode 100644 index 0000000..341457d --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/CardInfo.java @@ -0,0 +1,24 @@ +package com.casic.missiles.modular.dto.hik; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/26 16:08 + */ +@Data +public class CardInfo { + //卡号,8~20个字符,支持数字和大写字母 + private String cardNo; + //人员ID,员工工号 + private String personId; + //人员所属组织IndexCode + private String orgIndexCode; + //卡片类型,默认是1:IC卡 + //1:IC卡 + //2:CPU卡 + //3:远距离卡 + //4:MIFARE卡 + private Number cardType; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/FaceRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/FaceRequest.java new file mode 100644 index 0000000..edc04bf --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/FaceRequest.java @@ -0,0 +1,16 @@ +package com.casic.missiles.modular.dto.hik; + +import lombok.Data; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/25 16:53 + */ +@Data +public class FaceRequest { + private String certificateNum; + private List indexCodes; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/HikRecvEvent.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/HikRecvEvent.java index a3e9845..1b2b2b1 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/HikRecvEvent.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/HikRecvEvent.java @@ -28,12 +28,12 @@ /** * 事件类型,用于判断所需接收到的事件类型 */ - public Long getEventType(){ + public Number getEventType(){ JSONObject jsonObject = (JSONObject)JSONObject.toJSON(params); //事件类别对应SecurityEventTypeEnum JSONArray eventTypeArray = (JSONArray)jsonObject.get("events"); JSONObject eventJsonObject = (JSONObject)JSONObject.toJSON(eventTypeArray.get(0)); - Long eventType = (Long) eventJsonObject.get("eventType"); + Number eventType = (Number) eventJsonObject.get("eventType"); return eventType; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonBatchDeleteRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonBatchDeleteRequest.java index 027d31d..9751929 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonBatchDeleteRequest.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonBatchDeleteRequest.java @@ -12,4 +12,6 @@ @Data public class PersonBatchDeleteRequest { private List personIds; + //删除人脸接口使用 + private String faceId; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonInfoRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonInfoRequest.java new file mode 100644 index 0000000..05dc9e1 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonInfoRequest.java @@ -0,0 +1,20 @@ +package com.casic.missiles.modular.dto.hik; + +import lombok.Data; + +import java.util.List; + +/** + * @Description: 获取员工照片请求实体 + * @Author: wangpeng + * @Date: 2022/8/25 16:53 + */ +@Data +public class PersonInfoRequest { + //获取员工详细信息使用 + private String paramName; + private List paramValue; + //获取照片使用 + private String picUri; + private String serverIndexCode; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonListRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonListRequest.java new file mode 100644 index 0000000..3f7149b --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonListRequest.java @@ -0,0 +1,16 @@ +package com.casic.missiles.modular.dto.hik; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/25 16:53 + */ +@Data +public class PersonListRequest { + private Number pageNo; + private Number pageSize; + + private String orderId; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/SearchPicturesRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/SearchPicturesRequest.java new file mode 100644 index 0000000..0a95966 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/SearchPicturesRequest.java @@ -0,0 +1,24 @@ +package com.casic.missiles.modular.dto.hik; + +import lombok.Data; + +import java.util.List; + +/** + * @Description: 以图搜图请求 + * @Author: wangpeng + * @Date: 2022/8/29 10:46 + */ +@Data +public class SearchPicturesRequest { + private String facePicBinaryData; + private String facePicUrl; + private List cameraIndexCodes; + private String startTime; + private String endTime; + //指定搜图的最小相似度,最小为1,最大为100 + private String minSimilarity; + private Number age; + //male-男性,female-女性 + private String sex; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/StaffCardRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/StaffCardRequest.java new file mode 100644 index 0000000..4052e6d --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/StaffCardRequest.java @@ -0,0 +1,20 @@ +package com.casic.missiles.modular.dto.hik; + +import lombok.Data; + +import java.util.List; + +/** + * @Description: 人员开卡请求实体 + * @Author: wangpeng + * @Date: 2022/8/26 16:05 + */ +@Data +public class StaffCardRequest { + //卡片开始有效时间,时间格式:yyyy-MM-dd + private String startDate; + //卡片截止有效时间,时间格式:yyyy-MM-dd,不能大于2037年12月31日 + private String endDate; + //cardList,待开卡列表,最大支持50张卡 + private List cardList; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/VisitorInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/VisitorInfo.java index 73aa316..b99f301 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/VisitorInfo.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/VisitorInfo.java @@ -14,7 +14,7 @@ //访客性别 //1: 男 //2: 女 - private String gender; + private Integer gender; //联系电话建议填写手机号码 private String phoneNo; //证件类型 diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/ApplyReasonGroupDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/ApplyReasonGroupDTO.java index 514f382..786143e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/ApplyReasonGroupDTO.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/ApplyReasonGroupDTO.java @@ -13,4 +13,6 @@ private String visitReason; //访问人数 private Integer quantity; + //占比 + private String ratio; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/AttendanceNumberDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/AttendanceNumberDTO.java new file mode 100644 index 0000000..a494321 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/AttendanceNumberDTO.java @@ -0,0 +1,24 @@ +package com.casic.missiles.modular.dto.statistics; + +import com.fasterxml.jackson.annotation.JsonIgnore; +import lombok.Data; + +/** + * @Description: 出勤人数统计实体 + * @Author: wangpeng + * @Date: 2022/8/31 19:24 + */ +@Data +public class AttendanceNumberDTO { + //日期维度,周、今日,入参 + @JsonIgnore + private String dateDimension; + + //日期,具体天/小时,出参 + private String date; + //出勤人数 + private String quantity; + //员工类型 + private String staffType; + +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/AvgMonthAndWeekGroupDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/AvgMonthAndWeekGroupDTO.java index 4366916..331a9a9 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/AvgMonthAndWeekGroupDTO.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/AvgMonthAndWeekGroupDTO.java @@ -2,8 +2,6 @@ import lombok.Data; -import java.util.Map; - /** * @Description: 平均每月和每周的数据实体 * @Author: wangpeng @@ -13,6 +11,4 @@ public class AvgMonthAndWeekGroupDTO { //入参 private String year; - //出参,key:事件类型,value:周和月数据平均值 - private Map map; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/GateStatusGroupResponse.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/GateStatusGroupResponse.java new file mode 100644 index 0000000..d16f4e5 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/GateStatusGroupResponse.java @@ -0,0 +1,16 @@ +package com.casic.missiles.modular.dto.statistics; + +import lombok.Data; + +/** + * @Description: 闸机/摄像机统计响应实体 + * @Author: wangpeng + * @Date: 2022/8/30 14:22 + */ +@Data +public class GateStatusGroupResponse { + //设备状态 + private String status; + //占比 + private String ratio; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/MonthAndWeekDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/MonthAndWeekDTO.java index 7482b2a..284115a 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/MonthAndWeekDTO.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/MonthAndWeekDTO.java @@ -9,7 +9,7 @@ */ @Data public class MonthAndWeekDTO { -// private String levelName; + private String levelName; private Integer monthQuantity; private Integer weekQuantity; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/OnDutyRatioDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/OnDutyRatioDTO.java new file mode 100644 index 0000000..4f6a65d --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/OnDutyRatioDTO.java @@ -0,0 +1,15 @@ +package com.casic.missiles.modular.dto.statistics; + +import lombok.Data; + +/** + * @Description: 在岗率统计实体 + * @Author: wangpeng + * @Date: 2022/9/2 21:24 + */ +@Data +public class OnDutyRatioDTO { + private String date; + private String quantity; + private String ratio; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/SecurityLevelAssessDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/SecurityLevelAssessDTO.java new file mode 100644 index 0000000..40a0738 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/SecurityLevelAssessDTO.java @@ -0,0 +1,15 @@ +package com.casic.missiles.modular.dto.statistics; + +import lombok.Data; + +/** + * @Description: 出勤人数统计实体 + * @Author: wangpeng + * @Date: 2022/8/31 19:24 + */ +@Data +public class SecurityLevelAssessDTO { + private String date; + private String quantity; + private Double score; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/SecurityScoreDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/SecurityScoreDTO.java index 304d169..f7bd4a2 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/SecurityScoreDTO.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/SecurityScoreDTO.java @@ -14,5 +14,5 @@ //楼层,出参 private String area; //评分,出参 - private String score; + private Double score; } 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 6a30786..e5e613d 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 @@ -8,6 +8,10 @@ public interface HikUri { //事件订阅 String EVENT_SUBSCRIBE = "/api/eventService/v1/eventSubscriptionByEventTypes"; + //事件订阅信息查询 + String EVENT_INFO = "/api/eventService/v1/eventSubscriptionView"; + //事件订阅取消 + String EVENT_CANCEL = "/api/eventService/v1/eventUnSubscriptionByEventTypes"; //预约免登记 String APPOINTMENT_FREE_REGISTER = "/api/visitor/v1/appointment/registration"; //修改访客预约 @@ -32,8 +36,18 @@ String PERSON_SINGLE_UPDATE = "/api/resource/v1/person/single/update"; //批量删除人员 String PERSON_BATCH_DELETE = "/api/resource/v1/person/batch/delete"; + //根据人脸Id删除人脸 + String PERSON_SINGLE_DELETE = "/api/resource/v1/face/single/delete"; //门禁点反控 String DOOR_CONTROL = "/api/acs/v1/door/doControl"; //查询海康门禁点事件v2 String DOOR_EVENTS = "/api/acs/v2/door/events"; + //批量开卡 + String CARD_BINDING = "/api/cis/v1/card/binding"; + //提取人员照片 + String PERSON_PICTURE = "/api/resource/v1/person/picture"; + //根据人员唯一字段获取人员详细信息 + String PERSON_INFO = "/api/resource/v1/person/condition/personInfo"; + //以图搜图 + String SEARCH_PICTURES = "/api/frs/v1/application/captureSearch"; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/enums/SecurityEventType.java b/casic-server/src/main/java/com/casic/missiles/modular/enums/SecurityEventType.java index d51034c..42eacf8 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/enums/SecurityEventType.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/enums/SecurityEventType.java @@ -14,18 +14,27 @@ Number PERSONNEL_GATHER_EVENT = 131593; //监控点离线事件 Number MONITORING_POINT_OFFLINE = 889196545; + //监控点上线事件 + Number MONITORING_POINT_ONLINE = 889196546; //装置离线 Number DEVICE_OFFLINE = 199710; + //装置连线 + Number DEVICE_ONLINE = 199711; //访客登记 Number VISITOR_REGISTER = 1392513025; //访客签离 Number VISITOR_CHECKOUT = 1392513026; + //高空抛物 + Number HIGH_ALTITUDE_PARABOLIC = 930335; + //下面两个查询海康门禁点事件使用 //合法卡比对通过 Number CARD_COMPARE_PASS = 198914; //人脸认证通过 Number FACE_COMPARE_PASS = 196893; + + // //正常开门 // Number NORMAL_OPENING = 198913; // //按钮开门 @@ -46,7 +55,6 @@ // Number FIREWORKS_DETECTION = 192514; // //陌生人识别事件 // Number STRANGER_RECOGNITION = 1644171265; -// //高空抛物 -// Number HIGH_ALTITUDE_PARABOLIC = 930335; + } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/BlackListController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/BlackListController.java index a27f9f8..0c06661 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/BlackListController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/BlackListController.java @@ -1,13 +1,18 @@ package com.casic.missiles.modular.controller; +import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.base.controller.ExportController; import com.casic.missiles.core.page.PageFactory; import com.casic.missiles.model.response.ResponseData; import com.casic.missiles.modular.dto.BlackInfoRequest; +import com.casic.missiles.modular.dto.BlackPictureRequest; +import com.casic.missiles.modular.dto.hik.PersonInfoRequest; +import com.casic.missiles.modular.enums.HikUri; import com.casic.missiles.modular.enums.OperateTypeEnum; import com.casic.missiles.modular.model.BlackInfo; import com.casic.missiles.modular.service.BlackInfoService; +import com.casic.missiles.modular.util.HikUtil; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; @@ -56,4 +61,22 @@ return null; } + /** + * 黑名单人员照片 + */ + @PostMapping("/personPicture") + @ResponseBody + public Object personPicture(@RequestBody BlackPictureRequest blackPictureRequest){ + //获取照片 + String picUri = blackPictureRequest.getPicUri(); + String serverIndexCode = blackPictureRequest.getServerIndexCode(); + PersonInfoRequest picRequest = new PersonInfoRequest(); + picRequest.setPicUri(picUri); + picRequest.setServerIndexCode(serverIndexCode); + String reBody = JSONObject.toJSONString(picRequest); + //重定向地址获取 + String url = HikUtil.hikApiFor302(HikUri.PERSON_PICTURE, reBody); + return ResponseData.success(url); + } + } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/DeviceController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/DeviceController.java index e1c4eba..666bbee 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/DeviceController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/DeviceController.java @@ -107,7 +107,7 @@ } /** - * 设备维修管理查询(分页),需计算MTTR=总维修时间/故障次数 + * 设备状态计算与评判/设备维修管理查询(分页),需计算MTTR=总维修时间/故障次数 */ @PostMapping("/repair/listPage") @ResponseBody @@ -211,7 +211,7 @@ //需根据设备编号获取到对应的门禁点唯一标识 doorControlRequest.setDoorIndexCodes(indexCodes); doorControlRequest.setControlType(Integer.valueOf(gateGroupDTO.getStatus())); - String body = JSONObject.toJSONString(deviceCodes); + String body = JSONObject.toJSONString(doorControlRequest); String resultStr = HikUtil.hikApi(HikUri.DOOR_CONTROL, body); JSONObject resultJson = (JSONObject)JSONObject.parse(resultStr); if (!"0".equals(resultJson.get("code"))) { diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/StaffController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/StaffController.java index b58ccab..704093c 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/StaffController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/StaffController.java @@ -2,15 +2,21 @@ import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.util.StrUtil; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.base.controller.ExportController; import com.casic.missiles.core.page.PageFactory; import com.casic.missiles.model.response.ErrorResponseData; import com.casic.missiles.model.response.ResponseData; import com.casic.missiles.modular.dto.StaffInfoRequest; +import com.casic.missiles.modular.dto.hik.PersonInfoRequest; +import com.casic.missiles.modular.dto.hik.StaffCardRequest; +import com.casic.missiles.modular.enums.HikUri; import com.casic.missiles.modular.enums.OperateTypeEnum; import com.casic.missiles.modular.model.StaffInfo; import com.casic.missiles.modular.service.StaffInfoService; +import com.casic.missiles.modular.util.HikUtil; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; @@ -110,4 +116,60 @@ } return ResponseData.success(); } + + /** + * 批量开卡,添加人员之后调用,若在一个接口中添加人员成功开卡失败则第二次添加时会有问题 + */ + @PostMapping("/cardBinding") + @ResponseBody + public Object cardBinding(@RequestBody StaffCardRequest staffCardRequest) { + String body = JSONObject.toJSONString(staffCardRequest); + String resultStr = HikUtil.hikApi(HikUri.CARD_BINDING, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (!"0".equals(resultJson.get("code"))) { + log.error("请求海康,批量开卡失败,海康response:{}", resultStr); + return ResponseData.error("批量开卡失败"); + } + //保存卡号 + if(staffInfoService.saveCardInfo(staffCardRequest) > 0){ + return ResponseData.success(); + } + return ResponseData.error("批量开卡失败"); + } + + /** + * 获取员工照片,海康存储 + */ + @PostMapping("/personPicture/{staffCode}") + @ResponseBody + public Object personPicture(@PathVariable("staffCode") String staffCode){ + //获取员工详细信息,含图片服务器、uri + PersonInfoRequest request = new PersonInfoRequest(); + List list = new ArrayList<>(); + list.add(staffCode); + request.setParamName("personId"); + request.setParamValue(list); + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi(HikUri.PERSON_INFO, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (!"0".equals(resultJson.get("code"))) { + log.error("请求海康,根据人员唯一字段获取人员详细信息失败,海康response:{}", resultStr); + return ResponseData.error("获取员工照片失败"); + } + //获取照片 + JSONObject data = (JSONObject) resultJson.get("data"); + JSONArray dataArray = (JSONArray) data.get("list"); + JSONObject jsonObject = (JSONObject) dataArray.get(0); + JSONArray personPhoto = (JSONArray) jsonObject.get("personPhoto"); + JSONObject photo = (JSONObject) personPhoto.get(0); + String picUri = photo.getString("picUri"); + String serverIndexCode = photo.getString("serverIndexCode"); + PersonInfoRequest picRequest = new PersonInfoRequest(); + picRequest.setPicUri(picUri); + picRequest.setServerIndexCode(serverIndexCode); + String reBody = JSONObject.toJSONString(picRequest); + //重定向地址获取 + String url = HikUtil.hikApiFor302(HikUri.PERSON_PICTURE, reBody); + return ResponseData.success(url); + } } 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 4a07dd9..7b1dcf6 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 @@ -16,6 +16,7 @@ import com.casic.missiles.modular.redis.key.CacheKeys; import com.casic.missiles.modular.service.CockpitService; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.util.CollectionUtils; import org.springframework.web.bind.annotation.*; @@ -24,10 +25,7 @@ import java.text.NumberFormat; import java.time.LocalDateTime; import java.time.temporal.ChronoUnit; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.util.*; import java.util.stream.Collectors; /** @@ -73,6 +71,9 @@ private StatisticNumberMapper numberMapper; @Autowired + private HazardLevelMapper hazardLevelMapper; + + @Autowired private AccessGroupConfig accessGroupConfig; /** @@ -104,8 +105,24 @@ public Object buildingNumberPerHour(){ //当天按小时分组的人数 List list = numberMapper.selectListByTime(); - Map> collect = list.stream().collect(Collectors.groupingBy(BuildingNumberDTO::getStatisticPosition)); - return ResponseData.success(collect); + Map> collect = list.stream().collect(Collectors.groupingBy(BuildingNumberDTO::getStatisticTime)); + //定时任务中已将每小时三栋楼人数存到数据库 + //将一期主楼和录制楼人数合并,二期单算 + List> resultList = new ArrayList<>(); + collect.keySet().forEach(key -> { + List buildingNumberDTOS = collect.get(key); + BuildingNumberDTO mainBuildingOne = buildingNumberDTOS.get(0); + BuildingNumberDTO mainBuildingTwo = buildingNumberDTOS.get(1); + BuildingNumberDTO recordingBuilding = buildingNumberDTOS.get(2); + HashMap resultMap = new HashMap<>(); + Integer oneQuantity = Integer.valueOf(mainBuildingOne.getStatisticQuantity()); + Integer recordingQuantity = Integer.valueOf(recordingBuilding.getStatisticQuantity()); + resultMap.put("staticTime", mainBuildingOne.getStatisticTime()); + resultMap.put(mainBuildingOne.getStatisticPositionName()+"、"+recordingBuilding.getStatisticPositionName(), String.valueOf(oneQuantity+recordingQuantity)); + resultMap.put(mainBuildingTwo.getStatisticPositionName(), mainBuildingTwo.getStatisticQuantity()); + resultList.add(resultMap); + }); + return ResponseData.success(resultList); } /** @@ -151,12 +168,11 @@ public Object securityNumber() { QueryWrapper wrapper = new QueryWrapper<>(); wrapper.eq("staff_type", 2); + // TODO: 2022/9/2 后续使用产品确定的每天出勤的安保人员的数量 Integer total = staffInfoMapper.selectCount(wrapper); - //当日离岗事件个数 - QueryWrapper wrapper1 = new QueryWrapper<>(); - wrapper1.eq("hik_event_type", SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); - wrapper1.apply("date_format(now(),'%Y-%m-%d') = date_format(happen_time,'%Y-%m-%d')"); - Integer leave = caseInfoMapper.selectCount(wrapper1); + //当日离岗事件按设备去重后的个数 + // TODO: 2022/9/2 目前相当于24小时内的计算,之后看需要可改成自定义小时数计算离岗率,即离岗+6小时内仅一次离岗则恢复为100%,多次则累加离岗次数计算离岗率 + Integer leave = caseInfoMapper.selectDemobilizedCount(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); NumberFormat numberFormat = NumberFormat.getInstance(); // 设置精确到小数点后2位 numberFormat.setMaximumFractionDigits(2); @@ -179,7 +195,6 @@ @ResponseBody public Object visitorApplyDetail() { List reasonGroup = applyMapper.selectByVisitReason(); - HashMap resultMap = new HashMap<>(); NumberFormat numberFormat = NumberFormat.getInstance(); // 设置精确到小数点后2位 numberFormat.setMaximumFractionDigits(2); @@ -187,12 +202,17 @@ if(0 == sum){ return ResponseData.success(); } + List resultList = new ArrayList<>(); reasonGroup.forEach(group -> { String reasonName = dictService.getDictNameByCode(SecurityEventDict.VISIT_REASON, group.getVisitReason()); String result = numberFormat.format((float) group.getQuantity() / (float) sum * 100); - resultMap.put(reasonName, result+"%"); + ApplyReasonGroupDTO applyReasonGroupDTO = new ApplyReasonGroupDTO(); + applyReasonGroupDTO.setQuantity(group.getQuantity()); + applyReasonGroupDTO.setVisitReason(reasonName); + applyReasonGroupDTO.setRatio(result+"%"); + resultList.add(applyReasonGroupDTO); }); - return ResponseData.success(resultMap); + return ResponseData.success(resultList); } /** @@ -247,6 +267,32 @@ } /** + * 机动力量实时在岗率,在岗人数除以总应在岗人数,用离岗+6小时内恢复为100%,6小时外再计算 + */ + @GetMapping("/staff/beOnDutyRatio") + @ResponseBody + public Object beOnDutyRatio() { + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("staff_type", 2); + // TODO: 2022/9/2 后续使用产品确定的每天出勤的安保人员的数量 + Integer total = staffInfoMapper.selectCount(wrapper); + if(0 == total){ + return ResponseData.success(null); + } + //当日离岗事件按设备去重后的个数 + // TODO: 2022/9/2 目前相当于24小时内的计算,之后看需要可改成自定义小时数计算离岗率,即离岗+6小时内仅一次离岗则恢复为100%,多次则累加离岗次数计算离岗率 + List onDutyRatioDTOS = caseInfoMapper.selectDemobilizedCountByHour(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); + onDutyRatioDTOS.forEach(dto -> { + NumberFormat numberFormat = NumberFormat.getInstance(); + // 设置精确到小数点后2位 + numberFormat.setMaximumFractionDigits(2); + String result = numberFormat.format(100 - Float.valueOf(dto.getQuantity()) / (float) total * 100); + dto.setRatio(result+"%"); + }); + return ResponseData.success(onDutyRatioDTOS); + } + + /** * 闸机速通门统计-设备状态分组计算数量,devType传闸机字典key * 视频频监控摄像机统计-设备状态分组计算数量,devType传摄像头字典key */ @@ -262,12 +308,17 @@ if(sum <= 0){ return ResponseData.error("无该类设备信息"); } + List resultList = new ArrayList<>(); gateStatusGroup.forEach(group -> { String devStatus = dictService.getDictNameByCode(SecurityEventDict.DEVICE_STATUS, group.getStatus()); String result = numberFormat.format((float) group.getQuantity() / (float) sum * 100); - resultMap.put(devStatus, result+"%"); + GateStatusGroupResponse gateStatusGroupResponse = new GateStatusGroupResponse(); + gateStatusGroupResponse.setStatus(devStatus); + gateStatusGroupResponse.setRatio(result+"%"); + resultList.add(gateStatusGroupResponse); }); - resultMap.put("总", sum); + resultMap.put("total", sum); + resultMap.put("list", resultList); return ResponseData.success(resultMap); } @@ -282,17 +333,38 @@ String position = securityScoreDTO.getPosition(); List caseInfos = caseInfoMapper.selectByPosition(position); //查询各危险级别权重、各类别权重,放入map,避免循环中多次查数据库 - + HashMap hazardScoreMap = new HashMap<>(); + List caseHazardLevelList = hazardLevelMapper.getCaseHazardLevelList(null); + caseHazardLevelList.forEach(hazardLevel -> { + hazardScoreMap.put(hazardLevel.getCode(), hazardLevel.getWeight()); + }); + HashMap categoryScoreMap = new HashMap<>(); + List categoryLevelList = categoryLevelMapper.getCaseCategoryLevelList(null); + categoryLevelList.forEach(categoryLevel -> { + categoryScoreMap.put(categoryLevel.getCode(), categoryLevel.getWeight()); + }); + //事件按楼层分组,计算 List securityScoreDTOs = new ArrayList<>(); caseInfos.forEach(caseInfo -> { SecurityScoreDTO securityScoreDTO1 = new SecurityScoreDTO(); + securityScoreDTO1.setPosition(caseInfo.getPosition()); securityScoreDTO1.setArea(caseInfo.getArea()); - // TODO: 2022/8/4 楼层评分计算根据产品定义调整 -// caseInfo.get -// securityScoreDTO1.setScore(); + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); + Double score = 100 - Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + securityScoreDTO1.setScore(score); + securityScoreDTOs.add(securityScoreDTO1); }); - - return null; + 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); + }); + return ResponseData.success(securityScoreDTOs); } /** @@ -303,9 +375,13 @@ public Object SecurityFrequency(@RequestBody SecurityFrequencyDTO securityFrequencyDTO) { String year = securityFrequencyDTO.getYear(); String month = securityFrequencyDTO.getMonth(); - Integer quantity = caseInfoMapper.selectCountByMonth(year, month); - securityFrequencyDTO.setQuantity(quantity); - return ResponseData.success(securityFrequencyDTO); + if(!StringUtils.isEmpty(year) && StringUtils.isEmpty(month)){ + Integer quantity = caseInfoMapper.selectCountByMonth(year, month); + securityFrequencyDTO.setQuantity(quantity); + return ResponseData.success(securityFrequencyDTO); + } + List list = caseInfoMapper.selectPreMonthCount(); + return ResponseData.success(list); } } 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 ae4d770..f4f075c 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 @@ -1,20 +1,25 @@ package com.casic.missiles.modular.controller.cockpit; +import cn.hutool.core.date.DateUnit; import cn.hutool.core.date.DateUtil; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.casic.missiles.model.response.ResponseData; -import com.casic.missiles.modular.dao.AttendanceInfoMapper; -import com.casic.missiles.modular.dao.CaseInfoMapper; -import com.casic.missiles.modular.dao.HazardLevelMapper; -import com.casic.missiles.modular.dao.StaffInfoMapper; +import com.casic.missiles.modular.dao.*; +import com.casic.missiles.modular.dto.DeviceRepairLogDTO; +import com.casic.missiles.modular.dto.DeviceRepairRequest; import com.casic.missiles.modular.dto.statistics.*; +import com.casic.missiles.modular.enums.SecurityEventType; +import com.casic.missiles.modular.model.CaseCategoryLevel; import com.casic.missiles.modular.model.CaseHazardLevel; +import com.casic.missiles.modular.model.CaseInfo; import com.casic.missiles.modular.model.StaffInfo; +import com.casic.missiles.modular.service.DeviceInfoService; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.util.CollectionUtils; import org.springframework.web.bind.annotation.*; +import java.math.BigDecimal; import java.text.NumberFormat; import java.util.*; import java.util.stream.Collectors; @@ -40,6 +45,12 @@ @Autowired private HazardLevelMapper hazardLevelMapper; + @Autowired + private CategoryLevelMapper categoryLevelMapper; + + @Autowired + private DeviceInfoService deviceInfoService; + /** * 安防事件时域频次统计,每月的每天安防事件个数(原方案) * 月维度:展示每个月的每天的数据 @@ -89,15 +100,17 @@ List monthList = caseInfoMapper.selectPreMonthCountByYear(year); Map> collect = monthList.stream().collect(Collectors.groupingBy(PreMonthOrWeekCaseDTO::getHazardLevelCode)); HashMap strAvgMap = new HashMap<>(); + List resultList = new ArrayList<>(); for (String key : collect.keySet()) { List preMonthOrWeekCaseDTOS = collect.get(key); int sum = preMonthOrWeekCaseDTOS.stream().mapToInt(PreMonthOrWeekCaseDTO::getQuantity).sum(); //若年份是本年,则使用个安防级别数量/当前月份数 //若不是本年,除数为12 MonthAndWeekDTO monthAndWeekDTO = new MonthAndWeekDTO(); + String hazardName = hazardLevelMapper.selectHazardNameByCode(key); + monthAndWeekDTO.setLevelName(hazardName); if(year.equals(String.valueOf(DateUtil.thisYear()))){ monthAndWeekDTO.setMonthQuantity(sum / DateUtil.thisMonth()); -// monthAndWeekDTO.setLevelName(); strAvgMap.put(key, monthAndWeekDTO); }else{ monthAndWeekDTO.setMonthQuantity(sum / 12); @@ -113,27 +126,37 @@ if(year.equals(String.valueOf(DateUtil.thisYear()))){ if(!Objects.isNull(strAvgMap.get(key))){ MonthAndWeekDTO monthAndWeekDTO = strAvgMap.get(key); + String hazardName = hazardLevelMapper.selectHazardNameByCode(key); + monthAndWeekDTO.setLevelName(hazardName); monthAndWeekDTO.setWeekQuantity(sum / DateUtil.thisWeekOfYear()); strAvgMap.put(key, monthAndWeekDTO); }else{ MonthAndWeekDTO monthAndWeekDTO = new MonthAndWeekDTO(); + String hazardName = hazardLevelMapper.selectHazardNameByCode(key); + monthAndWeekDTO.setLevelName(hazardName); monthAndWeekDTO.setWeekQuantity(sum / DateUtil.thisWeekOfYear()); strAvgMap.put(key, monthAndWeekDTO); } }else{ if(!Objects.isNull(strAvgMap.get(key))){ MonthAndWeekDTO monthAndWeekDTO = strAvgMap.get(key); + String hazardName = hazardLevelMapper.selectHazardNameByCode(key); + monthAndWeekDTO.setLevelName(hazardName); monthAndWeekDTO.setWeekQuantity(sum / 52); strAvgMap.put(key, monthAndWeekDTO); }else{ MonthAndWeekDTO monthAndWeekDTO = new MonthAndWeekDTO(); + String hazardName = hazardLevelMapper.selectHazardNameByCode(key); + monthAndWeekDTO.setLevelName(hazardName); monthAndWeekDTO.setWeekQuantity(sum / 52); strAvgMap.put(key, monthAndWeekDTO); } } } - avgMonthAndWeekGroupDTO.setMap(strAvgMap); - return ResponseData.success(avgMonthAndWeekGroupDTO); + strAvgMap.keySet().forEach(key -> { + resultList.add(strAvgMap.get(key)); + }); + return ResponseData.success(resultList); } /** @@ -181,12 +204,178 @@ } /** - * 员工考勤人数变化,功能待定 + * 员工考勤人数变化,统计当天(横坐标为时)及近7天(横坐标为天)的考勤人数变化,只要发生一次考勤识别,次数的基数就正常增加(没有上班下班区分) */ + @PostMapping("/staff/attendanceNumber/{dimension}") + @ResponseBody + public Object attendanceNumber(@PathVariable("dimension") String dimension) { + List attendanceNumberDTOs = null; + List> resultList = new ArrayList<>(); + if("week".equals(dimension)){ + //近7天数据按天分组统计 + attendanceNumberDTOs = attendanceInfoMapper.getCountForWeek(); + }else if("day".equals(dimension)) { + //今天数据按小时分组统计 + attendanceNumberDTOs = attendanceInfoMapper.getCountForDay(); + } + if(CollectionUtils.isEmpty(attendanceNumberDTOs)){ + return ResponseData.error("该查询条件下,无员工出勤数据!"); + } + Map> collect = attendanceNumberDTOs.stream().collect(Collectors.groupingBy(AttendanceNumberDTO::getDate)); + collect.keySet().forEach(key -> { + List attendanceNumberDTOS = collect.get(key); + AttendanceNumberDTO attendanceNumberDTO = attendanceNumberDTOS.get(0); + AttendanceNumberDTO attendanceNumberDTO2 = attendanceNumberDTOS.get(1); + Map resultMap = new HashMap<>(); + resultMap.put(attendanceNumberDTO.getStaffType(), attendanceNumberDTO.getQuantity()); + resultMap.put(attendanceNumberDTO2.getStaffType(), attendanceNumberDTO2.getQuantity()); + resultMap.put("staticTime", attendanceNumberDTO.getDate()); + resultList.add(resultMap); + }); + return ResponseData.success(resultList); + } /** - * 近30天/近一周安保人员到岗排行 + * 早晚高峰区域安防评估 */ + @PostMapping("/security/assessment/{dimension}") + @ResponseBody + public Object securityAssessment(@PathVariable("dimension") String dimension) { + //查询各危险级别权重、各类别权重,放入map,避免循环中多次查数据库 + HashMap hazardScoreMap = new HashMap<>(); + List caseHazardLevelList = hazardLevelMapper.getCaseHazardLevelList(null); + caseHazardLevelList.forEach(hazardLevel -> { + hazardScoreMap.put(hazardLevel.getCode(), hazardLevel.getWeight()); + }); + HashMap categoryScoreMap = new HashMap<>(); + List categoryLevelList = categoryLevelMapper.getCaseCategoryLevelList(null); + categoryLevelList.forEach(categoryLevel -> { + categoryScoreMap.put(categoryLevel.getCode(), categoryLevel.getWeight()); + }); + HashMap hashMap = new HashMap<>(); + if("week".equals(dimension)){ + //近7天早晚高峰数据 + List caseInfos = caseInfoMapper.selectListBySevenDay(); + //按时间(天)进行分组 + caseInfos.forEach(caseInfo -> { + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); + Double score = Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + String[] array = caseInfo.getHappenTime().split(" "); + String dayTime = array[0]; + BigDecimal preScore; + if(hashMap.containsKey(dayTime)){ + Double aDouble = hashMap.get(dayTime); + preScore = new BigDecimal(aDouble.toString()); + + }else{ + preScore = new BigDecimal("100.0"); + } + BigDecimal nowScore = new BigDecimal(score.toString()); + hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); + }); + return ResponseData.success(hashMap); + }else if("day".equals(dimension)) { + //今天数据按小时分组统计 + List caseInfos = caseInfoMapper.selectListByToday(); + caseInfos.forEach(caseInfo -> { + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); + Double score = Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + String[] array = caseInfo.getHappenTime().split(":"); + String dayTime = array[0]; + BigDecimal preScore; + if(hashMap.containsKey(dayTime)){ + Double aDouble = hashMap.get(dayTime); + preScore = new BigDecimal(aDouble.toString()); + + }else{ + preScore = new BigDecimal("100.0"); + } + BigDecimal nowScore = new BigDecimal(score.toString()); + hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); + }); + return ResponseData.success(hashMap); + } + return null; + } + + /** + * 重点区域安防事态评估,统计重点区域6:00-23:00按小时分组数据 + */ + @GetMapping("/security/keyAreaStatistic") + @ResponseBody + public Object keyAreaStatistic() { + //查询各危险级别权重、各类别权重,放入map,避免循环中多次查数据库 + HashMap hazardScoreMap = new HashMap<>(); + List caseHazardLevelList = hazardLevelMapper.getCaseHazardLevelList(null); + caseHazardLevelList.forEach(hazardLevel -> { + hazardScoreMap.put(hazardLevel.getCode(), hazardLevel.getWeight()); + }); + HashMap categoryScoreMap = new HashMap<>(); + List categoryLevelList = categoryLevelMapper.getCaseCategoryLevelList(null); + categoryLevelList.forEach(categoryLevel -> { + categoryScoreMap.put(categoryLevel.getCode(), categoryLevel.getWeight()); + }); + HashMap hashMap = new HashMap<>(); + //今天数据按小时分组统计 + List caseInfos = caseInfoMapper.selectListByToday2(); + caseInfos.forEach(caseInfo -> { + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); + Double score = Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + String[] array = caseInfo.getHappenTime().split(":"); + String dayTime = array[0]; + BigDecimal preScore; + if(hashMap.containsKey(dayTime)){ + Double aDouble = hashMap.get(dayTime); + preScore = new BigDecimal(aDouble.toString()); + + }else{ + preScore = new BigDecimal("100.0"); + } + BigDecimal nowScore = new BigDecimal(score.toString()); + hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); + }); + return ResponseData.success(hashMap); + } + + /** + * 安防机动支援力量调配响应评估,根据事件已解决状态及已解决时间-发送时间,按时间(小时)分组统计 + */ + @GetMapping("/security/responseAssess") + @ResponseBody + public Object responseAssess() { + //查询各危险级别权重、各类别权重,放入map,避免循环中多次查数据库 + HashMap hazardScoreMap = new HashMap<>(); + List caseHazardLevelList = hazardLevelMapper.getCaseHazardLevelList(null); + caseHazardLevelList.forEach(hazardLevel -> { + hazardScoreMap.put(hazardLevel.getCode(), hazardLevel.getWeight()); + }); + HashMap hashMap = new HashMap<>(); + //今天数据按小时分组统计 + List caseInfos = caseInfoMapper.selectListByToday3(); + caseInfos.forEach(caseInfo -> { + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + //扣分=事件级别权重*未解决小时数 + Date updateTime = DateUtil.parse(caseInfo.getUpdateTime()); + Date happenTime = DateUtil.parse(caseInfo.getHappenTime()); + long between = DateUtil.between(updateTime, happenTime, DateUnit.HOUR); + Double score = Double.valueOf(hazardWeight)*between; + String[] array = caseInfo.getHappenTime().split(":"); + String dayTime = array[0]; + BigDecimal preScore; + if(hashMap.containsKey(dayTime)){ + Double aDouble = hashMap.get(dayTime); + preScore = new BigDecimal(aDouble.toString()); + }else{ + preScore = new BigDecimal("100.0"); + } + BigDecimal nowScore = new BigDecimal(score.toString()); + hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); + }); + return ResponseData.success(hashMap); + } /** * 重点区域威胁事件类型统计,优先级2,统计近7天和近30天 @@ -224,7 +413,34 @@ } /** - * 设备状态计算系数和评判,优先级3,需确认设备恢复时间是否可以获取 + * 近30天/近一周安保人员到岗排行 */ + + /** + * 安保等级评估,发生离岗事件减1分 + */ + @GetMapping("/security/levelAssess") + @ResponseBody + public Object securityLevelAssess() { + //今天数据按小时分组统计 + List resultList = caseInfoMapper.selectListByType(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); + resultList.forEach(result -> { + BigDecimal deScore = new BigDecimal(result.getQuantity()); + BigDecimal preScore = new BigDecimal("100.0"); + result.setScore(preScore.subtract(deScore).doubleValue()); + }); + return ResponseData.success(resultList); + } + + /** + * 设备状态计算系数和评判,即设备维修管理查询(不分页) + */ + @PostMapping("/device/repairList") + @ResponseBody + public Object repairList(@RequestBody DeviceRepairRequest deviceRepairRequest) { + List deviceRepairLogDTOS = deviceInfoService.deviceRepairListPage(deviceRepairRequest); + return ResponseData.success(deviceRepairLogDTOS); + } + } 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 fbf8ab6..c71a15a 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 @@ -1,13 +1,12 @@ package com.casic.missiles.modular.controller.hik; +import cn.hutool.core.date.DateTime; +import cn.hutool.core.date.DateUtil; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.casic.missiles.model.response.ResponseData; import com.casic.missiles.modular.dao.HikFaceGroupInfoMapper; -import com.casic.missiles.modular.dto.hik.EventSubscribeRequest; -import com.casic.missiles.modular.dto.hik.FaceGroupAdditionRequest; -import com.casic.missiles.modular.dto.hik.HikRecvEvent; -import com.casic.missiles.modular.dto.hik.OrgBatchAdd; +import com.casic.missiles.modular.dto.hik.*; import com.casic.missiles.modular.enums.HikUri; import com.casic.missiles.modular.enums.SecurityEventType; import com.casic.missiles.modular.model.CaseInfo; @@ -18,16 +17,20 @@ import com.casic.missiles.modular.util.CaseInfoFactoryUtil; import com.casic.missiles.modular.util.HikUtil; import com.casic.missiles.modular.util.ThreadPoolUtil; +import com.casic.missiles.modular.util.WebSocket; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; -import org.springframework.web.bind.annotation.*; +import org.springframework.util.CollectionUtils; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.RestController; -import java.net.InetAddress; -import java.net.UnknownHostException; import java.util.ArrayList; +import java.util.Iterator; import java.util.List; import java.util.Objects; @@ -38,7 +41,6 @@ */ @Slf4j @RestController -@RequestMapping("/hik") public class HikController { @Autowired @@ -53,28 +55,37 @@ @Autowired private HikService hikService; + @Autowired + private HikFaceGroupInfoMapper hikFaceGroupInfoMapper; + + @Autowired + private WebSocket webSocket; + @Value("${server.port}") private int serverPort; - @Autowired - private HikFaceGroupInfoMapper hikFaceGroupInfoMapper; /** * 海康事件订阅 */ - @PostMapping("/event/subscribe") + @PostMapping("/hik/event/subscribe") @ResponseBody - public Object eventSubscribe() throws UnknownHostException { + public Object eventSubscribe() { EventSubscribeRequest eventSubscribeRequest = new EventSubscribeRequest(); ArrayList list = new ArrayList<>(); list.add(SecurityEventType.DEVICE_OFFLINE); + list.add(SecurityEventType.DEVICE_ONLINE); list.add(SecurityEventType.KEY_PERSONNEL_IDENTIFY_EVENT); list.add(SecurityEventType.MONITORING_POINT_OFFLINE); + list.add(SecurityEventType.MONITORING_POINT_ONLINE); list.add(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); list.add(SecurityEventType.PERSONNEL_GATHER_EVENT); - InetAddress localHost = InetAddress.getLocalHost(); + list.add(SecurityEventType.VISITOR_REGISTER); + list.add(SecurityEventType.VISITOR_CHECKOUT); + list.add(SecurityEventType.HIGH_ALTITUDE_PARABOLIC); +// InetAddress localHost = InetAddress.getLocalHost(); eventSubscribeRequest.setEventTypes(list); - eventSubscribeRequest.setEventDest("https://" + localHost + ":" + serverPort + "/eventRcv"); + eventSubscribeRequest.setEventDest("http://" + "192.168.10.6" + ":" + serverPort + "/eventRcv"); //订阅类型,0-订阅原始事件,1-联动事件,2-原始事件和联动事件,不填使用默认值0 eventSubscribeRequest.setSubType(0); /** @@ -92,19 +103,25 @@ } /** + * 查询事件订阅信息 + */ + @PostMapping("/hik/event/query") + @ResponseBody + public Object eventQuery() { + String result = HikUtil.hikApi(HikUri.EVENT_INFO, ""); + return result; + } + + /** * 海康事件接收 */ @PostMapping("/eventRcv") @ResponseBody public Object eventRcv(@RequestBody HikRecvEvent hikRecvEvent) { //1、接收所需事件类型 - Long eventType = hikRecvEvent.getEventType(); + Number eventType = hikRecvEvent.getEventType(); log.info("接收到安防事件类型为:{}", eventType); CaseInfo caseInfo = caseInfoFactoryUtil.getCaseInfo(eventType); - //接收到不关心事件直接返回 - if(Objects.isNull(caseInfo)){ - return ResponseData.success(); - } //2、不同事件不同处理,caseInfoFactoryUtil已设置好事件基础定义信息 // 再为事件添加状态、设备编码、设备名称、位置、区域、时间 // 异步处理事件 @@ -114,19 +131,23 @@ caseHandle(hikRecvEvent, eventType, caseInfo); } })); +// caseHandle(hikRecvEvent, eventType, caseInfo); - return null; + return ResponseData.success(); } - private void caseHandle(HikRecvEvent hikRecvEvent, Long eventType, CaseInfo caseInfo) { + private void caseHandle(HikRecvEvent hikRecvEvent, Number eventType, CaseInfo caseInfo) { JSONArray eventArray = hikRecvEvent.getEventArray(); List caseInfos = new ArrayList<>(); - while (eventArray.stream().iterator().hasNext()) { + Iterator iterator = eventArray.iterator(); + while (iterator.hasNext()) { CaseInfo caseInfo1 = new CaseInfo(); - BeanUtils.copyProperties(caseInfo, caseInfo1); - JSONObject event = (JSONObject) eventArray.stream().iterator().next(); + if(!Objects.isNull(caseInfo)){ + BeanUtils.copyProperties(caseInfo, caseInfo1); + } + JSONObject event = (JSONObject) iterator.next(); //5种事件进行不同处理 - if(SecurityEventType.KEY_PERSONNEL_IDENTIFY_EVENT == eventType){ + if (SecurityEventType.KEY_PERSONNEL_IDENTIFY_EVENT.equals(eventType)) { //判断所属人脸分组 JSONObject data = (JSONObject) event.get("data"); JSONObject faceRecognitionResult = (JSONObject) data.get("faceRecognitionResult"); @@ -142,52 +163,101 @@ if (faceGroupCode.equals(blackListGroup.getFaceGroupCode())) { //黑名单分组处理 caseInfo1 = hikService.blackListHandle(event, caseInfo1); - }else if(faceGroupCode.equals(propertyPersonnelGroup.getFaceGroupCode())){ + } else if (faceGroupCode.equals(propertyPersonnelGroup.getFaceGroupCode())) { //考勤分组处理-物业人员,添加到考勤表 hikService.propertyAttendanceHandle(event); - }else if(faceGroupCode.equals(securityPersonnelGroup.getFaceGroupCode())){ + } else if (faceGroupCode.equals(securityPersonnelGroup.getFaceGroupCode())) { //考勤分组处理-安保人员,添加到考勤表 hikService.securityPersonnelHandle(event); - }else { + } else { return; } - }else if(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT == eventType){ + } else if (SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT.equals(eventType)) { //离岗事件处理 caseInfo1 = hikService.demobilizedHandle(event, caseInfo1); - }else if(SecurityEventType.PERSONNEL_GATHER_EVENT == eventType){ + } else if (SecurityEventType.PERSONNEL_GATHER_EVENT.equals(eventType)) { //人员聚集事件处理 caseInfo1 = hikService.personGatherHandle(event, caseInfo1); - }else if(SecurityEventType.MONITORING_POINT_OFFLINE == eventType){ + } else if (SecurityEventType.MONITORING_POINT_OFFLINE.equals(eventType)) { //监控点离线事件处理 caseInfo1 = hikService.monitorPointOfflineHandle(event, caseInfo1); - }else if(SecurityEventType.DEVICE_OFFLINE == eventType){ + } else if (SecurityEventType.MONITORING_POINT_ONLINE.equals(eventType)) { + //监控点上线事件处理 + hikService.monitorPointOnlineHandle(event); + } else if (SecurityEventType.DEVICE_OFFLINE.equals(eventType)) { //装置离线事件处理 caseInfo1 = hikService.deviceOfflineHandle(event, caseInfo1); - }else if(SecurityEventType.VISITOR_REGISTER == eventType){ + } else if (SecurityEventType.DEVICE_ONLINE.equals(eventType)) { + //装置上线处理 + hikService.deviceOnlineHandle(event); + } else if (SecurityEventType.VISITOR_REGISTER.equals(eventType)) { //记录访客登记记录,添加到访客记录表 hikService.visitorRegisterHandler(event); - }else if(SecurityEventType.VISITOR_CHECKOUT == eventType){ + } else if (SecurityEventType.VISITOR_CHECKOUT.equals(eventType)) { //记录访客签离记录 hikService.visitorCheckOutHandler(event); } - if(!Objects.isNull(caseInfo1) && !StringUtils.isEmpty(caseInfo1.getHappenTime())){ + if (!Objects.isNull(caseInfo1) && !StringUtils.isEmpty(caseInfo1.getHappenTime())) { caseInfos.add(caseInfo1); } } //3、安防事件入库 - if(!caseInfoService.insertCaseInfoBatch(caseInfos)){ - log.error("安防事件批量入库异常"); + if (!CollectionUtils.isEmpty(caseInfos) && !caseInfoService.insertCaseInfoBatch(caseInfos)) { + log.error("安防事件批量入库异常!"); } // TODO: 2022/8/15 webSocket推送 + if (CollectionUtils.isEmpty(caseInfos)) { + log.info("webSocket事件推送"); + webSocket.sendAllMessage(JSONObject.toJSONString(caseInfos)); + } return; } /** + * 以图搜图,前端用于轨迹追踪 + */ + @PostMapping("/hik/search/picture") + @ResponseBody + public Object searchPictures(@RequestBody SearchPicturesRequest searchPicturesRequest) { + DateTime startDateTime = DateUtil.parse(searchPicturesRequest.getStartTime()); + DateTime endDateTime = DateUtil.parse(searchPicturesRequest.getEndTime()); + String startTime = DateUtil.format(startDateTime, "yyyy-MM-dd'T'HH:mm:ss.SSSXXX"); + String endTime = DateUtil.format(endDateTime, "yyyy-MM-dd'T'HH:mm:ss.SSSXXX"); + searchPicturesRequest.setStartTime(startTime); + searchPicturesRequest.setEndTime(endTime); + String body = JSONObject.toJSONString(searchPicturesRequest); + String resultStr = HikUtil.hikApi(HikUri.SEARCH_PICTURES, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (!"0".equals(resultJson.get("code"))) { + log.error("请求海康,以图搜图失败,海康response:{}", resultStr); + return ResponseData.error("以图搜图失败"); + } + return ResponseData.success(resultJson); + } + + + /** + * 海康事件取消订阅 + */ + @PostMapping("/hik/event/cancel") + @ResponseBody + public Object eventCancelSubscribe(@RequestBody CancelSubscribeRequest cancelSubscribeRequest) { + String body = JSONObject.toJSONString(cancelSubscribeRequest); + String resultStr = HikUtil.hikApi(HikUri.EVENT_CANCEL, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (!"0".equals(resultJson.get("code"))) { + log.error("请求海康,取消订阅失败,海康response:{}", resultStr); + return ResponseData.error("取消订阅失败"); + } + return ResponseData.success(resultJson); + } + + /** * 单个添加海康人脸分组 * api->hik单个添加人脸分组api->response->mysql */ - @PostMapping("/faceGroup/single/add") + @PostMapping("/hik/faceGroup/single/add") @ResponseBody public Object faceGroupAddition(@RequestBody FaceGroupAdditionRequest faceGroupAdditionRequest) { String body = JSONObject.toJSONString(faceGroupAdditionRequest); @@ -212,7 +282,7 @@ * 批量添加海康组织 * api->hik批量添加组织api->response */ - @PostMapping("/org/batch/add") + @PostMapping("/hik/org/batch/add") @ResponseBody public Object orgBatchAdd(@RequestBody List orgBatchAddRequest) { String body = JSONObject.toJSONString(orgBatchAddRequest); @@ -232,4 +302,62 @@ return ResponseData.error("批量添加组织失败"); } + /** + * 获取人员列表 + */ + @PostMapping("/hik/person/personList") + @ResponseBody + public Object personList() { + PersonListRequest request = new PersonListRequest(); + request.setPageNo(1); + request.setPageSize(100); + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi("/api/resource/v2/person/personList", body); + return resultStr; + } + + /** + * 获取组织列表 + */ + @PostMapping("/hik/org/orgList") + @ResponseBody + public Object orgList() { + PersonListRequest request = new PersonListRequest(); + request.setPageNo(1); + request.setPageSize(100); + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi("/api/resource/v1/org/orgList", body); + return resultStr; + } + + /** + * 查询访客权限下载记录 + */ + @PostMapping("/hik/auth/result") + @ResponseBody + public Object authResult() { + PersonListRequest request = new PersonListRequest(); + request.setPageNo(1); + request.setPageSize(100); + request.setOrderId("ba101db6246711edaea66f7939a13638"); + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi("/api/visitor/v1/auth/result", body); + return resultStr; + } + + /** + * 人脸图片获取 + */ + @PostMapping("/hik/face/picture") + @ResponseBody + public Object facePicture() { + FaceRequest request = new FaceRequest(); +// List list = new ArrayList<>(); +// list.add(""); + request.setCertificateNum("wanggong"); + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi("/api/frs/v1/face", body); + return resultStr; + } + } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/AssetInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/AssetInfoMapper.java index 4f64e83..c0684ee 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/AssetInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/AssetInfoMapper.java @@ -17,6 +17,6 @@ @Mapper public interface AssetInfoMapper extends BaseMapper { - List getAssetInfoListPage(@Param("page") Page page, AssetInfoRequest assetInfoRequest); + List getAssetInfoListPage(@Param("page") Page page, @Param("assetInfoRequest") AssetInfoRequest assetInfoRequest); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/AttendanceInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/AttendanceInfoMapper.java index f9e793e..ec87e46 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/AttendanceInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/AttendanceInfoMapper.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.statistics.AttendanceNumberDTO; import com.casic.missiles.modular.dto.statistics.AttendanceRatioDTO; import com.casic.missiles.modular.model.AttendanceInfo; import org.apache.ibatis.annotations.Mapper; @@ -17,7 +18,7 @@ */ @Mapper public interface AttendanceInfoMapper extends BaseMapper { - List getAttendanceInfoListPage(@Param("page") Page page, StaffInfoRequest attendanceInfoRequest); + List getAttendanceInfoListPage(@Param("page") Page page, @Param("attendanceInfoRequest") StaffInfoRequest attendanceInfoRequest); AttendanceInfo selectByCodeAndDate(@Param("staffCode") String staffCode); @@ -26,4 +27,8 @@ List getCountByTypeAndDateForMonth(@Param("staffType")String staffType); List getCountByTypeAndDateForYear(@Param("staffType")String staffType); + + List getCountForWeek(); + + List getCountForDay(); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java index ce94b8f..6137a7d 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java @@ -17,5 +17,5 @@ @Mapper public interface BlackInfoMapper extends BaseMapper { - List getBlackInfoListPage(@Param("page") Page page, BlackInfoRequest blackInfoRequest); + List getBlackInfoListPage(@Param("page") Page page, @Param("blackInfoRequest") BlackInfoRequest blackInfoRequest); } 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 efda6b3..50aaa6f 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 @@ -20,7 +20,7 @@ List getCaseInfoListPage(@Param("page") Page page, @Param("caseInfoRequest") CaseInfoRequest caseInfoRequest); - int updateStatusById(CaseInfoRequest caseInfoRequest); + int updateStatusById(@Param("caseInfoRequest") CaseInfoRequest caseInfoRequest); List selectByLevelAndMonth(@Param("year") String year); @@ -47,4 +47,20 @@ List selectPreWeekCountByThirtyDay(); List selectPreDayCountBySevenDay(); + + Integer selectDemobilizedCount(@Param("eventType") Number personnelDemobilizedEvent); + + List selectPreMonthCount(); + + List selectListBySevenDay(); + + List selectListByToday(); + + List selectListByToday2(); + + List selectListByToday3(); + + List selectListByType(@Param("eventType") Number eventType); + + List selectDemobilizedCountByHour(@Param("eventType") Number eventType); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/CategoryLevelMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/CategoryLevelMapper.java index 52fc714..afe1650 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/CategoryLevelMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/CategoryLevelMapper.java @@ -17,9 +17,9 @@ @Mapper public interface CategoryLevelMapper extends BaseMapper { - List getCaseCategoryLevelListPage(@Param("page") Page page, CategoryLevelRequest categoryLevelRequest); + List getCaseCategoryLevelListPage(@Param("page") Page page, @Param("categoryLevelRequest") CategoryLevelRequest categoryLevelRequest); - List getCaseCategoryLevelList(CategoryLevelRequest categoryLevelRequest); + List getCaseCategoryLevelList(@Param("categoryLevelRequest") CategoryLevelRequest categoryLevelRequest); CaseCategoryLevel getCaseCategoryLevel(@Param("categoryLevelCode") String categoryLevelCode); 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 66353b1..2555a09 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 @@ -19,7 +19,7 @@ @Mapper public interface DeviceInfoMapper extends BaseMapper { - List getDeviceInfoListPage(@Param("page") Page page, DeviceInfoRequest deviceInfoRequest); + List getDeviceInfoListPage(@Param("page") Page page, @Param("deviceInfoRequest") DeviceInfoRequest deviceInfoRequest); List getDeviceInfoList(@Param("deviceInfoRequest") DeviceInfoRequest deviceInfoRequest); @@ -27,6 +27,8 @@ DeviceInfo getByIndexCode(@Param("srcIndex") String srcIndex); + DeviceInfo getByIp(@Param("ip") String ip); + List selectIndexCodesByCodes(@Param("deviceCodes") List deviceCodes); List selectByType(@Param("devType") String devType); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java index 41dd0af..5bfaf63 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java @@ -5,6 +5,7 @@ import com.casic.missiles.modular.dto.DeviceRepairRequest; import com.casic.missiles.modular.model.DeviceRepairLog; import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; import java.util.List; @@ -16,7 +17,7 @@ @Mapper public interface DeviceRepairLogMapper extends BaseMapper { - List getDeviceRepairListPage(Page page, DeviceRepairRequest deviceRepairRequest); + List getDeviceRepairListPage(@Param("page") Page page, @Param("deviceRepairRequest")DeviceRepairRequest deviceRepairRequest); - List getDeviceRepairList(DeviceRepairRequest deviceRepairRequest); + List getDeviceRepairList(@Param("deviceRepairRequest") DeviceRepairRequest deviceRepairRequest); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java index 9035c47..4823ac1 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java @@ -18,7 +18,7 @@ @Mapper public interface FireEquipInfoMapper extends BaseMapper { - List getFireEquipInfoListPage(@Param("page") Page page, FireEquipRequest fireEquipRequest); + List getFireEquipInfoListPage(@Param("page") Page page, @Param("fireEquipRequest") FireEquipRequest fireEquipRequest); FireEquipInfo getFireEquipInfo(@Param("equipCode") String equipCode); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/GateGroupMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/GateGroupMapper.java index d8c330d..977a427 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/GateGroupMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/GateGroupMapper.java @@ -17,7 +17,7 @@ */ @Mapper public interface GateGroupMapper extends BaseMapper { - List getGateGroupListPage(@Param("page") Page page, GateGroupRequest gateGroupRequest); + List getGateGroupListPage(@Param("page") Page page, @Param("gateGroupRequest") GateGroupRequest gateGroupRequest); GateGroup getGateGroupByName(@Param("groupName") String groupName); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/HazardLevelMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/HazardLevelMapper.java index 8957780..dcf47bb 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/HazardLevelMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/HazardLevelMapper.java @@ -17,11 +17,13 @@ @Mapper public interface HazardLevelMapper extends BaseMapper { - List getCaseHazardLevelListPage(@Param("page") Page page, HazardLevelRequest hazardLevelRequest); + List getCaseHazardLevelListPage(@Param("page") Page page, @Param("hazardLevelRequest") HazardLevelRequest hazardLevelRequest); - List getCaseHazardLevelList(HazardLevelRequest hazardLevelRequest); + List getCaseHazardLevelList(@Param("hazardLevelRequest") HazardLevelRequest hazardLevelRequest); CaseHazardLevel getCaseHazardLevel(@Param("hazardLevelCode") String hazardLevelCode); List selectHazardName(); + + String selectHazardNameByCode(@Param("hazardLevelCode") String hazardLevelCode); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/HikCaseDefineMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/HikCaseDefineMapper.java index 0dc47d1..f162fef 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/HikCaseDefineMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/HikCaseDefineMapper.java @@ -12,5 +12,5 @@ */ @Mapper public interface HikCaseDefineMapper extends BaseMapper { - HikCaseDefine getHikCaseDefine(@Param("caseTypeCode") Long caseTypeCode); + HikCaseDefine getHikCaseDefine(@Param("caseTypeCode") Number caseTypeCode); } 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 f8a674c..fe5afc2 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 @@ -17,11 +17,13 @@ @Mapper public interface StaffInfoMapper extends BaseMapper { - List getStaffInfoListPage(@Param("page") Page page, StaffInfoRequest staffInfoRequest); + List getStaffInfoListPage(@Param("page") Page page, @Param("staffInfoRequest") StaffInfoRequest staffInfoRequest); StaffInfo selectByCode(@Param("staffCode") String staffCode); - List getStaffInfoList(StaffInfoRequest staffInfoRequest); + List getStaffInfoList(@Param("staffInfoRequest") StaffInfoRequest staffInfoRequest); - List selectBatchCodes(List list); + List selectBatchCodes(@Param("list") List list); + + int updateByCodeForCard(@Param("staffCode") String staffCode, @Param("cardNo") String cardNo); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitInfoMapper.java index b1217c5..6c52542 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitInfoMapper.java @@ -16,7 +16,7 @@ */ @Mapper public interface VisitInfoMapper extends BaseMapper { - List getVisitInfoListPage(@Param("page") Page page, VisitorRequest visitorRequest); + List getVisitInfoListPage(@Param("page") Page page, @Param("visitorRequest") VisitorRequest visitorRequest); VisitInfo selectByOrderId(@Param("orderId") String orderId); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitorApplyMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitorApplyMapper.java index c09f3c0..6ea55bd 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitorApplyMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitorApplyMapper.java @@ -18,7 +18,7 @@ @Mapper public interface VisitorApplyMapper extends BaseMapper { - List getVisitorApplyListPage(@Param("page") Page page, VisitorApplyRequest visitorApplyRequest); + List getVisitorApplyListPage(@Param("page") Page page, @Param("visitorApplyRequest") VisitorApplyRequest visitorApplyRequest); List selectByVisitReason(); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/AttendanceInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/AttendanceInfoMapper.xml index b2ece71..f8bdd6e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/AttendanceInfoMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/AttendanceInfoMapper.xml @@ -43,7 +43,8 @@ and staff_type = #{staffType} - and YEARWEEK(date_format(atte_date, '%Y-%m-%d'), 1) = YEARWEEK(now(),1); + AND DATE_SUB(CURDATE(), INTERVAL 7 DAY) <= DATE(atte_date) + GROUP BY DATE_FORMAT(atte_date, '%Y-%m-%d') @@ -69,4 +70,20 @@ GROUP BY DATE_FORMAT(atte_date, '%Y-%m') + + + \ No newline at end of file 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 2b6953f..06ec0a8 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 @@ -28,7 +28,9 @@ @@ -87,7 +89,8 @@ SELECT hazard_level_code as levelCode, count(id) as quantity FROM bus_case_info WHERE hazard_level_code is not null - AND DATE_SUB(CURDATE(), INTERVAL 7 DAY) <= date(happen_time); + AND is_key_area = 1 + AND DATE_SUB(CURDATE(), INTERVAL 7 DAY) <= date(happen_time) GROUP BY hazard_level_code @@ -95,7 +98,8 @@ SELECT hazard_level_code as levelCode, count(id) as quantity FROM bus_case_info WHERE hazard_level_code is not null - AND DATE_SUB(CURDATE(), INTERVAL 30 DAY) <= date(happen_time); + AND is_key_area = 1 + AND DATE_SUB(CURDATE(), INTERVAL 30 DAY) <= date(happen_time) GROUP BY hazard_level_code @@ -122,4 +126,71 @@ AND hazard_level_code is not null GROUP BY DATE_FORMAT(happen_time,'%Y-%m-%d') + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/CategoryLevelMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/CategoryLevelMapper.xml index 4670b1f..1d25cbd 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/CategoryLevelMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/CategoryLevelMapper.xml @@ -20,11 +20,11 @@ SELECT * FROM bus_case_category_level WHERE 1=1 - - and code = #{code} + + and code = #{categoryLevelRequest.code} - - and name = #{name} + + and name = #{categoryLevelRequest.name} ORDER by create_time DESC 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 9b66fd8..bfd84b7 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 @@ -98,4 +98,10 @@ #{item} + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceRepairLogMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceRepairLogMapper.xml index 078ed3c..cf1a481 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceRepairLogMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceRepairLogMapper.xml @@ -22,14 +22,14 @@ SELECT * FROM bus_device_repair_log WHERE 1=1 - - and device_code = #{devCode} + + and device_code = #{deviceRepairRequest.devCode} - - and device_name = #{devName} + + and device_name = #{deviceRepairRequest.devName} - - and DATE_FORMAT(create_time,"%y%m%d") = DATE_FORMAT(#{createTime},"%y%m%d") + + and DATE_FORMAT(create_time,"%y%m%d") = DATE_FORMAT(#{deviceRepairRequest.createTime},"%y%m%d") ORDER by create_time DESC diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/HazardLevelMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/HazardLevelMapper.xml index f16f2b9..458322b 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/HazardLevelMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/HazardLevelMapper.xml @@ -20,11 +20,11 @@ SELECT * FROM bus_case_hazard_level WHERE 1=1 - - and code = #{code} + + and code = #{hazardLevelRequest.code} - - and name = #{name} + + and name = #{hazardLevelRequest.name} ORDER by create_time DESC @@ -42,4 +42,10 @@ SELECT name FROM bus_case_hazard_level + + \ 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 557237e..b6a183a 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 @@ -50,4 +50,10 @@ + + + UPDATE bus_staff_info + SET card_no = #{cardNo} + WHERE staff_code = #{staffCode} + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitInfoMapper.xml index 84aa84f..230529a 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitInfoMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitInfoMapper.xml @@ -27,5 +27,6 @@ SELECT * FROM bus_visit_info WHERE order_id = #{orderId} and DATE_FORMAT(in_time,'%Y-%m-%d') = CURRENT_DATE + limit 1 \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/BlackPictureRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/BlackPictureRequest.java new file mode 100644 index 0000000..fc92701 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/BlackPictureRequest.java @@ -0,0 +1,14 @@ +package com.casic.missiles.modular.dto; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/29 19:26 + */ +@Data +public class BlackPictureRequest { + private String picUri; + private String serverIndexCode; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/CancelSubscribeRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/CancelSubscribeRequest.java new file mode 100644 index 0000000..e2d390a --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/CancelSubscribeRequest.java @@ -0,0 +1,15 @@ +package com.casic.missiles.modular.dto.hik; + +import lombok.Data; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/24 15:14 + */ +@Data +public class CancelSubscribeRequest { + private List eventTypes; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/CardInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/CardInfo.java new file mode 100644 index 0000000..341457d --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/CardInfo.java @@ -0,0 +1,24 @@ +package com.casic.missiles.modular.dto.hik; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/26 16:08 + */ +@Data +public class CardInfo { + //卡号,8~20个字符,支持数字和大写字母 + private String cardNo; + //人员ID,员工工号 + private String personId; + //人员所属组织IndexCode + private String orgIndexCode; + //卡片类型,默认是1:IC卡 + //1:IC卡 + //2:CPU卡 + //3:远距离卡 + //4:MIFARE卡 + private Number cardType; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/FaceRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/FaceRequest.java new file mode 100644 index 0000000..edc04bf --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/FaceRequest.java @@ -0,0 +1,16 @@ +package com.casic.missiles.modular.dto.hik; + +import lombok.Data; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/25 16:53 + */ +@Data +public class FaceRequest { + private String certificateNum; + private List indexCodes; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/HikRecvEvent.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/HikRecvEvent.java index a3e9845..1b2b2b1 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/HikRecvEvent.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/HikRecvEvent.java @@ -28,12 +28,12 @@ /** * 事件类型,用于判断所需接收到的事件类型 */ - public Long getEventType(){ + public Number getEventType(){ JSONObject jsonObject = (JSONObject)JSONObject.toJSON(params); //事件类别对应SecurityEventTypeEnum JSONArray eventTypeArray = (JSONArray)jsonObject.get("events"); JSONObject eventJsonObject = (JSONObject)JSONObject.toJSON(eventTypeArray.get(0)); - Long eventType = (Long) eventJsonObject.get("eventType"); + Number eventType = (Number) eventJsonObject.get("eventType"); return eventType; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonBatchDeleteRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonBatchDeleteRequest.java index 027d31d..9751929 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonBatchDeleteRequest.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonBatchDeleteRequest.java @@ -12,4 +12,6 @@ @Data public class PersonBatchDeleteRequest { private List personIds; + //删除人脸接口使用 + private String faceId; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonInfoRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonInfoRequest.java new file mode 100644 index 0000000..05dc9e1 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonInfoRequest.java @@ -0,0 +1,20 @@ +package com.casic.missiles.modular.dto.hik; + +import lombok.Data; + +import java.util.List; + +/** + * @Description: 获取员工照片请求实体 + * @Author: wangpeng + * @Date: 2022/8/25 16:53 + */ +@Data +public class PersonInfoRequest { + //获取员工详细信息使用 + private String paramName; + private List paramValue; + //获取照片使用 + private String picUri; + private String serverIndexCode; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonListRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonListRequest.java new file mode 100644 index 0000000..3f7149b --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonListRequest.java @@ -0,0 +1,16 @@ +package com.casic.missiles.modular.dto.hik; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/25 16:53 + */ +@Data +public class PersonListRequest { + private Number pageNo; + private Number pageSize; + + private String orderId; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/SearchPicturesRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/SearchPicturesRequest.java new file mode 100644 index 0000000..0a95966 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/SearchPicturesRequest.java @@ -0,0 +1,24 @@ +package com.casic.missiles.modular.dto.hik; + +import lombok.Data; + +import java.util.List; + +/** + * @Description: 以图搜图请求 + * @Author: wangpeng + * @Date: 2022/8/29 10:46 + */ +@Data +public class SearchPicturesRequest { + private String facePicBinaryData; + private String facePicUrl; + private List cameraIndexCodes; + private String startTime; + private String endTime; + //指定搜图的最小相似度,最小为1,最大为100 + private String minSimilarity; + private Number age; + //male-男性,female-女性 + private String sex; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/StaffCardRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/StaffCardRequest.java new file mode 100644 index 0000000..4052e6d --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/StaffCardRequest.java @@ -0,0 +1,20 @@ +package com.casic.missiles.modular.dto.hik; + +import lombok.Data; + +import java.util.List; + +/** + * @Description: 人员开卡请求实体 + * @Author: wangpeng + * @Date: 2022/8/26 16:05 + */ +@Data +public class StaffCardRequest { + //卡片开始有效时间,时间格式:yyyy-MM-dd + private String startDate; + //卡片截止有效时间,时间格式:yyyy-MM-dd,不能大于2037年12月31日 + private String endDate; + //cardList,待开卡列表,最大支持50张卡 + private List cardList; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/VisitorInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/VisitorInfo.java index 73aa316..b99f301 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/VisitorInfo.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/VisitorInfo.java @@ -14,7 +14,7 @@ //访客性别 //1: 男 //2: 女 - private String gender; + private Integer gender; //联系电话建议填写手机号码 private String phoneNo; //证件类型 diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/ApplyReasonGroupDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/ApplyReasonGroupDTO.java index 514f382..786143e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/ApplyReasonGroupDTO.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/ApplyReasonGroupDTO.java @@ -13,4 +13,6 @@ private String visitReason; //访问人数 private Integer quantity; + //占比 + private String ratio; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/AttendanceNumberDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/AttendanceNumberDTO.java new file mode 100644 index 0000000..a494321 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/AttendanceNumberDTO.java @@ -0,0 +1,24 @@ +package com.casic.missiles.modular.dto.statistics; + +import com.fasterxml.jackson.annotation.JsonIgnore; +import lombok.Data; + +/** + * @Description: 出勤人数统计实体 + * @Author: wangpeng + * @Date: 2022/8/31 19:24 + */ +@Data +public class AttendanceNumberDTO { + //日期维度,周、今日,入参 + @JsonIgnore + private String dateDimension; + + //日期,具体天/小时,出参 + private String date; + //出勤人数 + private String quantity; + //员工类型 + private String staffType; + +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/AvgMonthAndWeekGroupDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/AvgMonthAndWeekGroupDTO.java index 4366916..331a9a9 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/AvgMonthAndWeekGroupDTO.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/AvgMonthAndWeekGroupDTO.java @@ -2,8 +2,6 @@ import lombok.Data; -import java.util.Map; - /** * @Description: 平均每月和每周的数据实体 * @Author: wangpeng @@ -13,6 +11,4 @@ public class AvgMonthAndWeekGroupDTO { //入参 private String year; - //出参,key:事件类型,value:周和月数据平均值 - private Map map; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/GateStatusGroupResponse.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/GateStatusGroupResponse.java new file mode 100644 index 0000000..d16f4e5 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/GateStatusGroupResponse.java @@ -0,0 +1,16 @@ +package com.casic.missiles.modular.dto.statistics; + +import lombok.Data; + +/** + * @Description: 闸机/摄像机统计响应实体 + * @Author: wangpeng + * @Date: 2022/8/30 14:22 + */ +@Data +public class GateStatusGroupResponse { + //设备状态 + private String status; + //占比 + private String ratio; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/MonthAndWeekDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/MonthAndWeekDTO.java index 7482b2a..284115a 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/MonthAndWeekDTO.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/MonthAndWeekDTO.java @@ -9,7 +9,7 @@ */ @Data public class MonthAndWeekDTO { -// private String levelName; + private String levelName; private Integer monthQuantity; private Integer weekQuantity; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/OnDutyRatioDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/OnDutyRatioDTO.java new file mode 100644 index 0000000..4f6a65d --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/OnDutyRatioDTO.java @@ -0,0 +1,15 @@ +package com.casic.missiles.modular.dto.statistics; + +import lombok.Data; + +/** + * @Description: 在岗率统计实体 + * @Author: wangpeng + * @Date: 2022/9/2 21:24 + */ +@Data +public class OnDutyRatioDTO { + private String date; + private String quantity; + private String ratio; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/SecurityLevelAssessDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/SecurityLevelAssessDTO.java new file mode 100644 index 0000000..40a0738 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/SecurityLevelAssessDTO.java @@ -0,0 +1,15 @@ +package com.casic.missiles.modular.dto.statistics; + +import lombok.Data; + +/** + * @Description: 出勤人数统计实体 + * @Author: wangpeng + * @Date: 2022/8/31 19:24 + */ +@Data +public class SecurityLevelAssessDTO { + private String date; + private String quantity; + private Double score; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/SecurityScoreDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/SecurityScoreDTO.java index 304d169..f7bd4a2 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/SecurityScoreDTO.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/SecurityScoreDTO.java @@ -14,5 +14,5 @@ //楼层,出参 private String area; //评分,出参 - private String score; + private Double score; } 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 6a30786..e5e613d 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 @@ -8,6 +8,10 @@ public interface HikUri { //事件订阅 String EVENT_SUBSCRIBE = "/api/eventService/v1/eventSubscriptionByEventTypes"; + //事件订阅信息查询 + String EVENT_INFO = "/api/eventService/v1/eventSubscriptionView"; + //事件订阅取消 + String EVENT_CANCEL = "/api/eventService/v1/eventUnSubscriptionByEventTypes"; //预约免登记 String APPOINTMENT_FREE_REGISTER = "/api/visitor/v1/appointment/registration"; //修改访客预约 @@ -32,8 +36,18 @@ String PERSON_SINGLE_UPDATE = "/api/resource/v1/person/single/update"; //批量删除人员 String PERSON_BATCH_DELETE = "/api/resource/v1/person/batch/delete"; + //根据人脸Id删除人脸 + String PERSON_SINGLE_DELETE = "/api/resource/v1/face/single/delete"; //门禁点反控 String DOOR_CONTROL = "/api/acs/v1/door/doControl"; //查询海康门禁点事件v2 String DOOR_EVENTS = "/api/acs/v2/door/events"; + //批量开卡 + String CARD_BINDING = "/api/cis/v1/card/binding"; + //提取人员照片 + String PERSON_PICTURE = "/api/resource/v1/person/picture"; + //根据人员唯一字段获取人员详细信息 + String PERSON_INFO = "/api/resource/v1/person/condition/personInfo"; + //以图搜图 + String SEARCH_PICTURES = "/api/frs/v1/application/captureSearch"; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/enums/SecurityEventType.java b/casic-server/src/main/java/com/casic/missiles/modular/enums/SecurityEventType.java index d51034c..42eacf8 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/enums/SecurityEventType.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/enums/SecurityEventType.java @@ -14,18 +14,27 @@ Number PERSONNEL_GATHER_EVENT = 131593; //监控点离线事件 Number MONITORING_POINT_OFFLINE = 889196545; + //监控点上线事件 + Number MONITORING_POINT_ONLINE = 889196546; //装置离线 Number DEVICE_OFFLINE = 199710; + //装置连线 + Number DEVICE_ONLINE = 199711; //访客登记 Number VISITOR_REGISTER = 1392513025; //访客签离 Number VISITOR_CHECKOUT = 1392513026; + //高空抛物 + Number HIGH_ALTITUDE_PARABOLIC = 930335; + //下面两个查询海康门禁点事件使用 //合法卡比对通过 Number CARD_COMPARE_PASS = 198914; //人脸认证通过 Number FACE_COMPARE_PASS = 196893; + + // //正常开门 // Number NORMAL_OPENING = 198913; // //按钮开门 @@ -46,7 +55,6 @@ // Number FIREWORKS_DETECTION = 192514; // //陌生人识别事件 // Number STRANGER_RECOGNITION = 1644171265; -// //高空抛物 -// Number HIGH_ALTITUDE_PARABOLIC = 930335; + } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/job/CockpitJob.java b/casic-server/src/main/java/com/casic/missiles/modular/job/CockpitJob.java index 7490a27..85dd016 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/job/CockpitJob.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/job/CockpitJob.java @@ -79,14 +79,6 @@ } }); } - } - /** - * 机动力量实时在岗率,在岗人数除以总应在岗人数,功能待定 - */ -// @Scheduled(cron = "0 0/1 * * * ?") - public void BeOnDutyRatio() { - - } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/BlackListController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/BlackListController.java index a27f9f8..0c06661 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/BlackListController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/BlackListController.java @@ -1,13 +1,18 @@ package com.casic.missiles.modular.controller; +import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.base.controller.ExportController; import com.casic.missiles.core.page.PageFactory; import com.casic.missiles.model.response.ResponseData; import com.casic.missiles.modular.dto.BlackInfoRequest; +import com.casic.missiles.modular.dto.BlackPictureRequest; +import com.casic.missiles.modular.dto.hik.PersonInfoRequest; +import com.casic.missiles.modular.enums.HikUri; import com.casic.missiles.modular.enums.OperateTypeEnum; import com.casic.missiles.modular.model.BlackInfo; import com.casic.missiles.modular.service.BlackInfoService; +import com.casic.missiles.modular.util.HikUtil; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; @@ -56,4 +61,22 @@ return null; } + /** + * 黑名单人员照片 + */ + @PostMapping("/personPicture") + @ResponseBody + public Object personPicture(@RequestBody BlackPictureRequest blackPictureRequest){ + //获取照片 + String picUri = blackPictureRequest.getPicUri(); + String serverIndexCode = blackPictureRequest.getServerIndexCode(); + PersonInfoRequest picRequest = new PersonInfoRequest(); + picRequest.setPicUri(picUri); + picRequest.setServerIndexCode(serverIndexCode); + String reBody = JSONObject.toJSONString(picRequest); + //重定向地址获取 + String url = HikUtil.hikApiFor302(HikUri.PERSON_PICTURE, reBody); + return ResponseData.success(url); + } + } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/DeviceController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/DeviceController.java index e1c4eba..666bbee 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/DeviceController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/DeviceController.java @@ -107,7 +107,7 @@ } /** - * 设备维修管理查询(分页),需计算MTTR=总维修时间/故障次数 + * 设备状态计算与评判/设备维修管理查询(分页),需计算MTTR=总维修时间/故障次数 */ @PostMapping("/repair/listPage") @ResponseBody @@ -211,7 +211,7 @@ //需根据设备编号获取到对应的门禁点唯一标识 doorControlRequest.setDoorIndexCodes(indexCodes); doorControlRequest.setControlType(Integer.valueOf(gateGroupDTO.getStatus())); - String body = JSONObject.toJSONString(deviceCodes); + String body = JSONObject.toJSONString(doorControlRequest); String resultStr = HikUtil.hikApi(HikUri.DOOR_CONTROL, body); JSONObject resultJson = (JSONObject)JSONObject.parse(resultStr); if (!"0".equals(resultJson.get("code"))) { diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/StaffController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/StaffController.java index b58ccab..704093c 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/StaffController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/StaffController.java @@ -2,15 +2,21 @@ import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.util.StrUtil; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.base.controller.ExportController; import com.casic.missiles.core.page.PageFactory; import com.casic.missiles.model.response.ErrorResponseData; import com.casic.missiles.model.response.ResponseData; import com.casic.missiles.modular.dto.StaffInfoRequest; +import com.casic.missiles.modular.dto.hik.PersonInfoRequest; +import com.casic.missiles.modular.dto.hik.StaffCardRequest; +import com.casic.missiles.modular.enums.HikUri; import com.casic.missiles.modular.enums.OperateTypeEnum; import com.casic.missiles.modular.model.StaffInfo; import com.casic.missiles.modular.service.StaffInfoService; +import com.casic.missiles.modular.util.HikUtil; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; @@ -110,4 +116,60 @@ } return ResponseData.success(); } + + /** + * 批量开卡,添加人员之后调用,若在一个接口中添加人员成功开卡失败则第二次添加时会有问题 + */ + @PostMapping("/cardBinding") + @ResponseBody + public Object cardBinding(@RequestBody StaffCardRequest staffCardRequest) { + String body = JSONObject.toJSONString(staffCardRequest); + String resultStr = HikUtil.hikApi(HikUri.CARD_BINDING, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (!"0".equals(resultJson.get("code"))) { + log.error("请求海康,批量开卡失败,海康response:{}", resultStr); + return ResponseData.error("批量开卡失败"); + } + //保存卡号 + if(staffInfoService.saveCardInfo(staffCardRequest) > 0){ + return ResponseData.success(); + } + return ResponseData.error("批量开卡失败"); + } + + /** + * 获取员工照片,海康存储 + */ + @PostMapping("/personPicture/{staffCode}") + @ResponseBody + public Object personPicture(@PathVariable("staffCode") String staffCode){ + //获取员工详细信息,含图片服务器、uri + PersonInfoRequest request = new PersonInfoRequest(); + List list = new ArrayList<>(); + list.add(staffCode); + request.setParamName("personId"); + request.setParamValue(list); + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi(HikUri.PERSON_INFO, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (!"0".equals(resultJson.get("code"))) { + log.error("请求海康,根据人员唯一字段获取人员详细信息失败,海康response:{}", resultStr); + return ResponseData.error("获取员工照片失败"); + } + //获取照片 + JSONObject data = (JSONObject) resultJson.get("data"); + JSONArray dataArray = (JSONArray) data.get("list"); + JSONObject jsonObject = (JSONObject) dataArray.get(0); + JSONArray personPhoto = (JSONArray) jsonObject.get("personPhoto"); + JSONObject photo = (JSONObject) personPhoto.get(0); + String picUri = photo.getString("picUri"); + String serverIndexCode = photo.getString("serverIndexCode"); + PersonInfoRequest picRequest = new PersonInfoRequest(); + picRequest.setPicUri(picUri); + picRequest.setServerIndexCode(serverIndexCode); + String reBody = JSONObject.toJSONString(picRequest); + //重定向地址获取 + String url = HikUtil.hikApiFor302(HikUri.PERSON_PICTURE, reBody); + return ResponseData.success(url); + } } 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 4a07dd9..7b1dcf6 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 @@ -16,6 +16,7 @@ import com.casic.missiles.modular.redis.key.CacheKeys; import com.casic.missiles.modular.service.CockpitService; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.util.CollectionUtils; import org.springframework.web.bind.annotation.*; @@ -24,10 +25,7 @@ import java.text.NumberFormat; import java.time.LocalDateTime; import java.time.temporal.ChronoUnit; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.util.*; import java.util.stream.Collectors; /** @@ -73,6 +71,9 @@ private StatisticNumberMapper numberMapper; @Autowired + private HazardLevelMapper hazardLevelMapper; + + @Autowired private AccessGroupConfig accessGroupConfig; /** @@ -104,8 +105,24 @@ public Object buildingNumberPerHour(){ //当天按小时分组的人数 List list = numberMapper.selectListByTime(); - Map> collect = list.stream().collect(Collectors.groupingBy(BuildingNumberDTO::getStatisticPosition)); - return ResponseData.success(collect); + Map> collect = list.stream().collect(Collectors.groupingBy(BuildingNumberDTO::getStatisticTime)); + //定时任务中已将每小时三栋楼人数存到数据库 + //将一期主楼和录制楼人数合并,二期单算 + List> resultList = new ArrayList<>(); + collect.keySet().forEach(key -> { + List buildingNumberDTOS = collect.get(key); + BuildingNumberDTO mainBuildingOne = buildingNumberDTOS.get(0); + BuildingNumberDTO mainBuildingTwo = buildingNumberDTOS.get(1); + BuildingNumberDTO recordingBuilding = buildingNumberDTOS.get(2); + HashMap resultMap = new HashMap<>(); + Integer oneQuantity = Integer.valueOf(mainBuildingOne.getStatisticQuantity()); + Integer recordingQuantity = Integer.valueOf(recordingBuilding.getStatisticQuantity()); + resultMap.put("staticTime", mainBuildingOne.getStatisticTime()); + resultMap.put(mainBuildingOne.getStatisticPositionName()+"、"+recordingBuilding.getStatisticPositionName(), String.valueOf(oneQuantity+recordingQuantity)); + resultMap.put(mainBuildingTwo.getStatisticPositionName(), mainBuildingTwo.getStatisticQuantity()); + resultList.add(resultMap); + }); + return ResponseData.success(resultList); } /** @@ -151,12 +168,11 @@ public Object securityNumber() { QueryWrapper wrapper = new QueryWrapper<>(); wrapper.eq("staff_type", 2); + // TODO: 2022/9/2 后续使用产品确定的每天出勤的安保人员的数量 Integer total = staffInfoMapper.selectCount(wrapper); - //当日离岗事件个数 - QueryWrapper wrapper1 = new QueryWrapper<>(); - wrapper1.eq("hik_event_type", SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); - wrapper1.apply("date_format(now(),'%Y-%m-%d') = date_format(happen_time,'%Y-%m-%d')"); - Integer leave = caseInfoMapper.selectCount(wrapper1); + //当日离岗事件按设备去重后的个数 + // TODO: 2022/9/2 目前相当于24小时内的计算,之后看需要可改成自定义小时数计算离岗率,即离岗+6小时内仅一次离岗则恢复为100%,多次则累加离岗次数计算离岗率 + Integer leave = caseInfoMapper.selectDemobilizedCount(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); NumberFormat numberFormat = NumberFormat.getInstance(); // 设置精确到小数点后2位 numberFormat.setMaximumFractionDigits(2); @@ -179,7 +195,6 @@ @ResponseBody public Object visitorApplyDetail() { List reasonGroup = applyMapper.selectByVisitReason(); - HashMap resultMap = new HashMap<>(); NumberFormat numberFormat = NumberFormat.getInstance(); // 设置精确到小数点后2位 numberFormat.setMaximumFractionDigits(2); @@ -187,12 +202,17 @@ if(0 == sum){ return ResponseData.success(); } + List resultList = new ArrayList<>(); reasonGroup.forEach(group -> { String reasonName = dictService.getDictNameByCode(SecurityEventDict.VISIT_REASON, group.getVisitReason()); String result = numberFormat.format((float) group.getQuantity() / (float) sum * 100); - resultMap.put(reasonName, result+"%"); + ApplyReasonGroupDTO applyReasonGroupDTO = new ApplyReasonGroupDTO(); + applyReasonGroupDTO.setQuantity(group.getQuantity()); + applyReasonGroupDTO.setVisitReason(reasonName); + applyReasonGroupDTO.setRatio(result+"%"); + resultList.add(applyReasonGroupDTO); }); - return ResponseData.success(resultMap); + return ResponseData.success(resultList); } /** @@ -247,6 +267,32 @@ } /** + * 机动力量实时在岗率,在岗人数除以总应在岗人数,用离岗+6小时内恢复为100%,6小时外再计算 + */ + @GetMapping("/staff/beOnDutyRatio") + @ResponseBody + public Object beOnDutyRatio() { + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("staff_type", 2); + // TODO: 2022/9/2 后续使用产品确定的每天出勤的安保人员的数量 + Integer total = staffInfoMapper.selectCount(wrapper); + if(0 == total){ + return ResponseData.success(null); + } + //当日离岗事件按设备去重后的个数 + // TODO: 2022/9/2 目前相当于24小时内的计算,之后看需要可改成自定义小时数计算离岗率,即离岗+6小时内仅一次离岗则恢复为100%,多次则累加离岗次数计算离岗率 + List onDutyRatioDTOS = caseInfoMapper.selectDemobilizedCountByHour(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); + onDutyRatioDTOS.forEach(dto -> { + NumberFormat numberFormat = NumberFormat.getInstance(); + // 设置精确到小数点后2位 + numberFormat.setMaximumFractionDigits(2); + String result = numberFormat.format(100 - Float.valueOf(dto.getQuantity()) / (float) total * 100); + dto.setRatio(result+"%"); + }); + return ResponseData.success(onDutyRatioDTOS); + } + + /** * 闸机速通门统计-设备状态分组计算数量,devType传闸机字典key * 视频频监控摄像机统计-设备状态分组计算数量,devType传摄像头字典key */ @@ -262,12 +308,17 @@ if(sum <= 0){ return ResponseData.error("无该类设备信息"); } + List resultList = new ArrayList<>(); gateStatusGroup.forEach(group -> { String devStatus = dictService.getDictNameByCode(SecurityEventDict.DEVICE_STATUS, group.getStatus()); String result = numberFormat.format((float) group.getQuantity() / (float) sum * 100); - resultMap.put(devStatus, result+"%"); + GateStatusGroupResponse gateStatusGroupResponse = new GateStatusGroupResponse(); + gateStatusGroupResponse.setStatus(devStatus); + gateStatusGroupResponse.setRatio(result+"%"); + resultList.add(gateStatusGroupResponse); }); - resultMap.put("总", sum); + resultMap.put("total", sum); + resultMap.put("list", resultList); return ResponseData.success(resultMap); } @@ -282,17 +333,38 @@ String position = securityScoreDTO.getPosition(); List caseInfos = caseInfoMapper.selectByPosition(position); //查询各危险级别权重、各类别权重,放入map,避免循环中多次查数据库 - + HashMap hazardScoreMap = new HashMap<>(); + List caseHazardLevelList = hazardLevelMapper.getCaseHazardLevelList(null); + caseHazardLevelList.forEach(hazardLevel -> { + hazardScoreMap.put(hazardLevel.getCode(), hazardLevel.getWeight()); + }); + HashMap categoryScoreMap = new HashMap<>(); + List categoryLevelList = categoryLevelMapper.getCaseCategoryLevelList(null); + categoryLevelList.forEach(categoryLevel -> { + categoryScoreMap.put(categoryLevel.getCode(), categoryLevel.getWeight()); + }); + //事件按楼层分组,计算 List securityScoreDTOs = new ArrayList<>(); caseInfos.forEach(caseInfo -> { SecurityScoreDTO securityScoreDTO1 = new SecurityScoreDTO(); + securityScoreDTO1.setPosition(caseInfo.getPosition()); securityScoreDTO1.setArea(caseInfo.getArea()); - // TODO: 2022/8/4 楼层评分计算根据产品定义调整 -// caseInfo.get -// securityScoreDTO1.setScore(); + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); + Double score = 100 - Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + securityScoreDTO1.setScore(score); + securityScoreDTOs.add(securityScoreDTO1); }); - - return null; + 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); + }); + return ResponseData.success(securityScoreDTOs); } /** @@ -303,9 +375,13 @@ public Object SecurityFrequency(@RequestBody SecurityFrequencyDTO securityFrequencyDTO) { String year = securityFrequencyDTO.getYear(); String month = securityFrequencyDTO.getMonth(); - Integer quantity = caseInfoMapper.selectCountByMonth(year, month); - securityFrequencyDTO.setQuantity(quantity); - return ResponseData.success(securityFrequencyDTO); + if(!StringUtils.isEmpty(year) && StringUtils.isEmpty(month)){ + Integer quantity = caseInfoMapper.selectCountByMonth(year, month); + securityFrequencyDTO.setQuantity(quantity); + return ResponseData.success(securityFrequencyDTO); + } + List list = caseInfoMapper.selectPreMonthCount(); + return ResponseData.success(list); } } 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 ae4d770..f4f075c 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 @@ -1,20 +1,25 @@ package com.casic.missiles.modular.controller.cockpit; +import cn.hutool.core.date.DateUnit; import cn.hutool.core.date.DateUtil; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.casic.missiles.model.response.ResponseData; -import com.casic.missiles.modular.dao.AttendanceInfoMapper; -import com.casic.missiles.modular.dao.CaseInfoMapper; -import com.casic.missiles.modular.dao.HazardLevelMapper; -import com.casic.missiles.modular.dao.StaffInfoMapper; +import com.casic.missiles.modular.dao.*; +import com.casic.missiles.modular.dto.DeviceRepairLogDTO; +import com.casic.missiles.modular.dto.DeviceRepairRequest; import com.casic.missiles.modular.dto.statistics.*; +import com.casic.missiles.modular.enums.SecurityEventType; +import com.casic.missiles.modular.model.CaseCategoryLevel; import com.casic.missiles.modular.model.CaseHazardLevel; +import com.casic.missiles.modular.model.CaseInfo; import com.casic.missiles.modular.model.StaffInfo; +import com.casic.missiles.modular.service.DeviceInfoService; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.util.CollectionUtils; import org.springframework.web.bind.annotation.*; +import java.math.BigDecimal; import java.text.NumberFormat; import java.util.*; import java.util.stream.Collectors; @@ -40,6 +45,12 @@ @Autowired private HazardLevelMapper hazardLevelMapper; + @Autowired + private CategoryLevelMapper categoryLevelMapper; + + @Autowired + private DeviceInfoService deviceInfoService; + /** * 安防事件时域频次统计,每月的每天安防事件个数(原方案) * 月维度:展示每个月的每天的数据 @@ -89,15 +100,17 @@ List monthList = caseInfoMapper.selectPreMonthCountByYear(year); Map> collect = monthList.stream().collect(Collectors.groupingBy(PreMonthOrWeekCaseDTO::getHazardLevelCode)); HashMap strAvgMap = new HashMap<>(); + List resultList = new ArrayList<>(); for (String key : collect.keySet()) { List preMonthOrWeekCaseDTOS = collect.get(key); int sum = preMonthOrWeekCaseDTOS.stream().mapToInt(PreMonthOrWeekCaseDTO::getQuantity).sum(); //若年份是本年,则使用个安防级别数量/当前月份数 //若不是本年,除数为12 MonthAndWeekDTO monthAndWeekDTO = new MonthAndWeekDTO(); + String hazardName = hazardLevelMapper.selectHazardNameByCode(key); + monthAndWeekDTO.setLevelName(hazardName); if(year.equals(String.valueOf(DateUtil.thisYear()))){ monthAndWeekDTO.setMonthQuantity(sum / DateUtil.thisMonth()); -// monthAndWeekDTO.setLevelName(); strAvgMap.put(key, monthAndWeekDTO); }else{ monthAndWeekDTO.setMonthQuantity(sum / 12); @@ -113,27 +126,37 @@ if(year.equals(String.valueOf(DateUtil.thisYear()))){ if(!Objects.isNull(strAvgMap.get(key))){ MonthAndWeekDTO monthAndWeekDTO = strAvgMap.get(key); + String hazardName = hazardLevelMapper.selectHazardNameByCode(key); + monthAndWeekDTO.setLevelName(hazardName); monthAndWeekDTO.setWeekQuantity(sum / DateUtil.thisWeekOfYear()); strAvgMap.put(key, monthAndWeekDTO); }else{ MonthAndWeekDTO monthAndWeekDTO = new MonthAndWeekDTO(); + String hazardName = hazardLevelMapper.selectHazardNameByCode(key); + monthAndWeekDTO.setLevelName(hazardName); monthAndWeekDTO.setWeekQuantity(sum / DateUtil.thisWeekOfYear()); strAvgMap.put(key, monthAndWeekDTO); } }else{ if(!Objects.isNull(strAvgMap.get(key))){ MonthAndWeekDTO monthAndWeekDTO = strAvgMap.get(key); + String hazardName = hazardLevelMapper.selectHazardNameByCode(key); + monthAndWeekDTO.setLevelName(hazardName); monthAndWeekDTO.setWeekQuantity(sum / 52); strAvgMap.put(key, monthAndWeekDTO); }else{ MonthAndWeekDTO monthAndWeekDTO = new MonthAndWeekDTO(); + String hazardName = hazardLevelMapper.selectHazardNameByCode(key); + monthAndWeekDTO.setLevelName(hazardName); monthAndWeekDTO.setWeekQuantity(sum / 52); strAvgMap.put(key, monthAndWeekDTO); } } } - avgMonthAndWeekGroupDTO.setMap(strAvgMap); - return ResponseData.success(avgMonthAndWeekGroupDTO); + strAvgMap.keySet().forEach(key -> { + resultList.add(strAvgMap.get(key)); + }); + return ResponseData.success(resultList); } /** @@ -181,12 +204,178 @@ } /** - * 员工考勤人数变化,功能待定 + * 员工考勤人数变化,统计当天(横坐标为时)及近7天(横坐标为天)的考勤人数变化,只要发生一次考勤识别,次数的基数就正常增加(没有上班下班区分) */ + @PostMapping("/staff/attendanceNumber/{dimension}") + @ResponseBody + public Object attendanceNumber(@PathVariable("dimension") String dimension) { + List attendanceNumberDTOs = null; + List> resultList = new ArrayList<>(); + if("week".equals(dimension)){ + //近7天数据按天分组统计 + attendanceNumberDTOs = attendanceInfoMapper.getCountForWeek(); + }else if("day".equals(dimension)) { + //今天数据按小时分组统计 + attendanceNumberDTOs = attendanceInfoMapper.getCountForDay(); + } + if(CollectionUtils.isEmpty(attendanceNumberDTOs)){ + return ResponseData.error("该查询条件下,无员工出勤数据!"); + } + Map> collect = attendanceNumberDTOs.stream().collect(Collectors.groupingBy(AttendanceNumberDTO::getDate)); + collect.keySet().forEach(key -> { + List attendanceNumberDTOS = collect.get(key); + AttendanceNumberDTO attendanceNumberDTO = attendanceNumberDTOS.get(0); + AttendanceNumberDTO attendanceNumberDTO2 = attendanceNumberDTOS.get(1); + Map resultMap = new HashMap<>(); + resultMap.put(attendanceNumberDTO.getStaffType(), attendanceNumberDTO.getQuantity()); + resultMap.put(attendanceNumberDTO2.getStaffType(), attendanceNumberDTO2.getQuantity()); + resultMap.put("staticTime", attendanceNumberDTO.getDate()); + resultList.add(resultMap); + }); + return ResponseData.success(resultList); + } /** - * 近30天/近一周安保人员到岗排行 + * 早晚高峰区域安防评估 */ + @PostMapping("/security/assessment/{dimension}") + @ResponseBody + public Object securityAssessment(@PathVariable("dimension") String dimension) { + //查询各危险级别权重、各类别权重,放入map,避免循环中多次查数据库 + HashMap hazardScoreMap = new HashMap<>(); + List caseHazardLevelList = hazardLevelMapper.getCaseHazardLevelList(null); + caseHazardLevelList.forEach(hazardLevel -> { + hazardScoreMap.put(hazardLevel.getCode(), hazardLevel.getWeight()); + }); + HashMap categoryScoreMap = new HashMap<>(); + List categoryLevelList = categoryLevelMapper.getCaseCategoryLevelList(null); + categoryLevelList.forEach(categoryLevel -> { + categoryScoreMap.put(categoryLevel.getCode(), categoryLevel.getWeight()); + }); + HashMap hashMap = new HashMap<>(); + if("week".equals(dimension)){ + //近7天早晚高峰数据 + List caseInfos = caseInfoMapper.selectListBySevenDay(); + //按时间(天)进行分组 + caseInfos.forEach(caseInfo -> { + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); + Double score = Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + String[] array = caseInfo.getHappenTime().split(" "); + String dayTime = array[0]; + BigDecimal preScore; + if(hashMap.containsKey(dayTime)){ + Double aDouble = hashMap.get(dayTime); + preScore = new BigDecimal(aDouble.toString()); + + }else{ + preScore = new BigDecimal("100.0"); + } + BigDecimal nowScore = new BigDecimal(score.toString()); + hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); + }); + return ResponseData.success(hashMap); + }else if("day".equals(dimension)) { + //今天数据按小时分组统计 + List caseInfos = caseInfoMapper.selectListByToday(); + caseInfos.forEach(caseInfo -> { + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); + Double score = Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + String[] array = caseInfo.getHappenTime().split(":"); + String dayTime = array[0]; + BigDecimal preScore; + if(hashMap.containsKey(dayTime)){ + Double aDouble = hashMap.get(dayTime); + preScore = new BigDecimal(aDouble.toString()); + + }else{ + preScore = new BigDecimal("100.0"); + } + BigDecimal nowScore = new BigDecimal(score.toString()); + hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); + }); + return ResponseData.success(hashMap); + } + return null; + } + + /** + * 重点区域安防事态评估,统计重点区域6:00-23:00按小时分组数据 + */ + @GetMapping("/security/keyAreaStatistic") + @ResponseBody + public Object keyAreaStatistic() { + //查询各危险级别权重、各类别权重,放入map,避免循环中多次查数据库 + HashMap hazardScoreMap = new HashMap<>(); + List caseHazardLevelList = hazardLevelMapper.getCaseHazardLevelList(null); + caseHazardLevelList.forEach(hazardLevel -> { + hazardScoreMap.put(hazardLevel.getCode(), hazardLevel.getWeight()); + }); + HashMap categoryScoreMap = new HashMap<>(); + List categoryLevelList = categoryLevelMapper.getCaseCategoryLevelList(null); + categoryLevelList.forEach(categoryLevel -> { + categoryScoreMap.put(categoryLevel.getCode(), categoryLevel.getWeight()); + }); + HashMap hashMap = new HashMap<>(); + //今天数据按小时分组统计 + List caseInfos = caseInfoMapper.selectListByToday2(); + caseInfos.forEach(caseInfo -> { + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); + Double score = Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + String[] array = caseInfo.getHappenTime().split(":"); + String dayTime = array[0]; + BigDecimal preScore; + if(hashMap.containsKey(dayTime)){ + Double aDouble = hashMap.get(dayTime); + preScore = new BigDecimal(aDouble.toString()); + + }else{ + preScore = new BigDecimal("100.0"); + } + BigDecimal nowScore = new BigDecimal(score.toString()); + hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); + }); + return ResponseData.success(hashMap); + } + + /** + * 安防机动支援力量调配响应评估,根据事件已解决状态及已解决时间-发送时间,按时间(小时)分组统计 + */ + @GetMapping("/security/responseAssess") + @ResponseBody + public Object responseAssess() { + //查询各危险级别权重、各类别权重,放入map,避免循环中多次查数据库 + HashMap hazardScoreMap = new HashMap<>(); + List caseHazardLevelList = hazardLevelMapper.getCaseHazardLevelList(null); + caseHazardLevelList.forEach(hazardLevel -> { + hazardScoreMap.put(hazardLevel.getCode(), hazardLevel.getWeight()); + }); + HashMap hashMap = new HashMap<>(); + //今天数据按小时分组统计 + List caseInfos = caseInfoMapper.selectListByToday3(); + caseInfos.forEach(caseInfo -> { + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + //扣分=事件级别权重*未解决小时数 + Date updateTime = DateUtil.parse(caseInfo.getUpdateTime()); + Date happenTime = DateUtil.parse(caseInfo.getHappenTime()); + long between = DateUtil.between(updateTime, happenTime, DateUnit.HOUR); + Double score = Double.valueOf(hazardWeight)*between; + String[] array = caseInfo.getHappenTime().split(":"); + String dayTime = array[0]; + BigDecimal preScore; + if(hashMap.containsKey(dayTime)){ + Double aDouble = hashMap.get(dayTime); + preScore = new BigDecimal(aDouble.toString()); + }else{ + preScore = new BigDecimal("100.0"); + } + BigDecimal nowScore = new BigDecimal(score.toString()); + hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); + }); + return ResponseData.success(hashMap); + } /** * 重点区域威胁事件类型统计,优先级2,统计近7天和近30天 @@ -224,7 +413,34 @@ } /** - * 设备状态计算系数和评判,优先级3,需确认设备恢复时间是否可以获取 + * 近30天/近一周安保人员到岗排行 */ + + /** + * 安保等级评估,发生离岗事件减1分 + */ + @GetMapping("/security/levelAssess") + @ResponseBody + public Object securityLevelAssess() { + //今天数据按小时分组统计 + List resultList = caseInfoMapper.selectListByType(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); + resultList.forEach(result -> { + BigDecimal deScore = new BigDecimal(result.getQuantity()); + BigDecimal preScore = new BigDecimal("100.0"); + result.setScore(preScore.subtract(deScore).doubleValue()); + }); + return ResponseData.success(resultList); + } + + /** + * 设备状态计算系数和评判,即设备维修管理查询(不分页) + */ + @PostMapping("/device/repairList") + @ResponseBody + public Object repairList(@RequestBody DeviceRepairRequest deviceRepairRequest) { + List deviceRepairLogDTOS = deviceInfoService.deviceRepairListPage(deviceRepairRequest); + return ResponseData.success(deviceRepairLogDTOS); + } + } 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 fbf8ab6..c71a15a 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 @@ -1,13 +1,12 @@ package com.casic.missiles.modular.controller.hik; +import cn.hutool.core.date.DateTime; +import cn.hutool.core.date.DateUtil; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.casic.missiles.model.response.ResponseData; import com.casic.missiles.modular.dao.HikFaceGroupInfoMapper; -import com.casic.missiles.modular.dto.hik.EventSubscribeRequest; -import com.casic.missiles.modular.dto.hik.FaceGroupAdditionRequest; -import com.casic.missiles.modular.dto.hik.HikRecvEvent; -import com.casic.missiles.modular.dto.hik.OrgBatchAdd; +import com.casic.missiles.modular.dto.hik.*; import com.casic.missiles.modular.enums.HikUri; import com.casic.missiles.modular.enums.SecurityEventType; import com.casic.missiles.modular.model.CaseInfo; @@ -18,16 +17,20 @@ import com.casic.missiles.modular.util.CaseInfoFactoryUtil; import com.casic.missiles.modular.util.HikUtil; import com.casic.missiles.modular.util.ThreadPoolUtil; +import com.casic.missiles.modular.util.WebSocket; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; -import org.springframework.web.bind.annotation.*; +import org.springframework.util.CollectionUtils; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.RestController; -import java.net.InetAddress; -import java.net.UnknownHostException; import java.util.ArrayList; +import java.util.Iterator; import java.util.List; import java.util.Objects; @@ -38,7 +41,6 @@ */ @Slf4j @RestController -@RequestMapping("/hik") public class HikController { @Autowired @@ -53,28 +55,37 @@ @Autowired private HikService hikService; + @Autowired + private HikFaceGroupInfoMapper hikFaceGroupInfoMapper; + + @Autowired + private WebSocket webSocket; + @Value("${server.port}") private int serverPort; - @Autowired - private HikFaceGroupInfoMapper hikFaceGroupInfoMapper; /** * 海康事件订阅 */ - @PostMapping("/event/subscribe") + @PostMapping("/hik/event/subscribe") @ResponseBody - public Object eventSubscribe() throws UnknownHostException { + public Object eventSubscribe() { EventSubscribeRequest eventSubscribeRequest = new EventSubscribeRequest(); ArrayList list = new ArrayList<>(); list.add(SecurityEventType.DEVICE_OFFLINE); + list.add(SecurityEventType.DEVICE_ONLINE); list.add(SecurityEventType.KEY_PERSONNEL_IDENTIFY_EVENT); list.add(SecurityEventType.MONITORING_POINT_OFFLINE); + list.add(SecurityEventType.MONITORING_POINT_ONLINE); list.add(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); list.add(SecurityEventType.PERSONNEL_GATHER_EVENT); - InetAddress localHost = InetAddress.getLocalHost(); + list.add(SecurityEventType.VISITOR_REGISTER); + list.add(SecurityEventType.VISITOR_CHECKOUT); + list.add(SecurityEventType.HIGH_ALTITUDE_PARABOLIC); +// InetAddress localHost = InetAddress.getLocalHost(); eventSubscribeRequest.setEventTypes(list); - eventSubscribeRequest.setEventDest("https://" + localHost + ":" + serverPort + "/eventRcv"); + eventSubscribeRequest.setEventDest("http://" + "192.168.10.6" + ":" + serverPort + "/eventRcv"); //订阅类型,0-订阅原始事件,1-联动事件,2-原始事件和联动事件,不填使用默认值0 eventSubscribeRequest.setSubType(0); /** @@ -92,19 +103,25 @@ } /** + * 查询事件订阅信息 + */ + @PostMapping("/hik/event/query") + @ResponseBody + public Object eventQuery() { + String result = HikUtil.hikApi(HikUri.EVENT_INFO, ""); + return result; + } + + /** * 海康事件接收 */ @PostMapping("/eventRcv") @ResponseBody public Object eventRcv(@RequestBody HikRecvEvent hikRecvEvent) { //1、接收所需事件类型 - Long eventType = hikRecvEvent.getEventType(); + Number eventType = hikRecvEvent.getEventType(); log.info("接收到安防事件类型为:{}", eventType); CaseInfo caseInfo = caseInfoFactoryUtil.getCaseInfo(eventType); - //接收到不关心事件直接返回 - if(Objects.isNull(caseInfo)){ - return ResponseData.success(); - } //2、不同事件不同处理,caseInfoFactoryUtil已设置好事件基础定义信息 // 再为事件添加状态、设备编码、设备名称、位置、区域、时间 // 异步处理事件 @@ -114,19 +131,23 @@ caseHandle(hikRecvEvent, eventType, caseInfo); } })); +// caseHandle(hikRecvEvent, eventType, caseInfo); - return null; + return ResponseData.success(); } - private void caseHandle(HikRecvEvent hikRecvEvent, Long eventType, CaseInfo caseInfo) { + private void caseHandle(HikRecvEvent hikRecvEvent, Number eventType, CaseInfo caseInfo) { JSONArray eventArray = hikRecvEvent.getEventArray(); List caseInfos = new ArrayList<>(); - while (eventArray.stream().iterator().hasNext()) { + Iterator iterator = eventArray.iterator(); + while (iterator.hasNext()) { CaseInfo caseInfo1 = new CaseInfo(); - BeanUtils.copyProperties(caseInfo, caseInfo1); - JSONObject event = (JSONObject) eventArray.stream().iterator().next(); + if(!Objects.isNull(caseInfo)){ + BeanUtils.copyProperties(caseInfo, caseInfo1); + } + JSONObject event = (JSONObject) iterator.next(); //5种事件进行不同处理 - if(SecurityEventType.KEY_PERSONNEL_IDENTIFY_EVENT == eventType){ + if (SecurityEventType.KEY_PERSONNEL_IDENTIFY_EVENT.equals(eventType)) { //判断所属人脸分组 JSONObject data = (JSONObject) event.get("data"); JSONObject faceRecognitionResult = (JSONObject) data.get("faceRecognitionResult"); @@ -142,52 +163,101 @@ if (faceGroupCode.equals(blackListGroup.getFaceGroupCode())) { //黑名单分组处理 caseInfo1 = hikService.blackListHandle(event, caseInfo1); - }else if(faceGroupCode.equals(propertyPersonnelGroup.getFaceGroupCode())){ + } else if (faceGroupCode.equals(propertyPersonnelGroup.getFaceGroupCode())) { //考勤分组处理-物业人员,添加到考勤表 hikService.propertyAttendanceHandle(event); - }else if(faceGroupCode.equals(securityPersonnelGroup.getFaceGroupCode())){ + } else if (faceGroupCode.equals(securityPersonnelGroup.getFaceGroupCode())) { //考勤分组处理-安保人员,添加到考勤表 hikService.securityPersonnelHandle(event); - }else { + } else { return; } - }else if(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT == eventType){ + } else if (SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT.equals(eventType)) { //离岗事件处理 caseInfo1 = hikService.demobilizedHandle(event, caseInfo1); - }else if(SecurityEventType.PERSONNEL_GATHER_EVENT == eventType){ + } else if (SecurityEventType.PERSONNEL_GATHER_EVENT.equals(eventType)) { //人员聚集事件处理 caseInfo1 = hikService.personGatherHandle(event, caseInfo1); - }else if(SecurityEventType.MONITORING_POINT_OFFLINE == eventType){ + } else if (SecurityEventType.MONITORING_POINT_OFFLINE.equals(eventType)) { //监控点离线事件处理 caseInfo1 = hikService.monitorPointOfflineHandle(event, caseInfo1); - }else if(SecurityEventType.DEVICE_OFFLINE == eventType){ + } else if (SecurityEventType.MONITORING_POINT_ONLINE.equals(eventType)) { + //监控点上线事件处理 + hikService.monitorPointOnlineHandle(event); + } else if (SecurityEventType.DEVICE_OFFLINE.equals(eventType)) { //装置离线事件处理 caseInfo1 = hikService.deviceOfflineHandle(event, caseInfo1); - }else if(SecurityEventType.VISITOR_REGISTER == eventType){ + } else if (SecurityEventType.DEVICE_ONLINE.equals(eventType)) { + //装置上线处理 + hikService.deviceOnlineHandle(event); + } else if (SecurityEventType.VISITOR_REGISTER.equals(eventType)) { //记录访客登记记录,添加到访客记录表 hikService.visitorRegisterHandler(event); - }else if(SecurityEventType.VISITOR_CHECKOUT == eventType){ + } else if (SecurityEventType.VISITOR_CHECKOUT.equals(eventType)) { //记录访客签离记录 hikService.visitorCheckOutHandler(event); } - if(!Objects.isNull(caseInfo1) && !StringUtils.isEmpty(caseInfo1.getHappenTime())){ + if (!Objects.isNull(caseInfo1) && !StringUtils.isEmpty(caseInfo1.getHappenTime())) { caseInfos.add(caseInfo1); } } //3、安防事件入库 - if(!caseInfoService.insertCaseInfoBatch(caseInfos)){ - log.error("安防事件批量入库异常"); + if (!CollectionUtils.isEmpty(caseInfos) && !caseInfoService.insertCaseInfoBatch(caseInfos)) { + log.error("安防事件批量入库异常!"); } // TODO: 2022/8/15 webSocket推送 + if (CollectionUtils.isEmpty(caseInfos)) { + log.info("webSocket事件推送"); + webSocket.sendAllMessage(JSONObject.toJSONString(caseInfos)); + } return; } /** + * 以图搜图,前端用于轨迹追踪 + */ + @PostMapping("/hik/search/picture") + @ResponseBody + public Object searchPictures(@RequestBody SearchPicturesRequest searchPicturesRequest) { + DateTime startDateTime = DateUtil.parse(searchPicturesRequest.getStartTime()); + DateTime endDateTime = DateUtil.parse(searchPicturesRequest.getEndTime()); + String startTime = DateUtil.format(startDateTime, "yyyy-MM-dd'T'HH:mm:ss.SSSXXX"); + String endTime = DateUtil.format(endDateTime, "yyyy-MM-dd'T'HH:mm:ss.SSSXXX"); + searchPicturesRequest.setStartTime(startTime); + searchPicturesRequest.setEndTime(endTime); + String body = JSONObject.toJSONString(searchPicturesRequest); + String resultStr = HikUtil.hikApi(HikUri.SEARCH_PICTURES, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (!"0".equals(resultJson.get("code"))) { + log.error("请求海康,以图搜图失败,海康response:{}", resultStr); + return ResponseData.error("以图搜图失败"); + } + return ResponseData.success(resultJson); + } + + + /** + * 海康事件取消订阅 + */ + @PostMapping("/hik/event/cancel") + @ResponseBody + public Object eventCancelSubscribe(@RequestBody CancelSubscribeRequest cancelSubscribeRequest) { + String body = JSONObject.toJSONString(cancelSubscribeRequest); + String resultStr = HikUtil.hikApi(HikUri.EVENT_CANCEL, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (!"0".equals(resultJson.get("code"))) { + log.error("请求海康,取消订阅失败,海康response:{}", resultStr); + return ResponseData.error("取消订阅失败"); + } + return ResponseData.success(resultJson); + } + + /** * 单个添加海康人脸分组 * api->hik单个添加人脸分组api->response->mysql */ - @PostMapping("/faceGroup/single/add") + @PostMapping("/hik/faceGroup/single/add") @ResponseBody public Object faceGroupAddition(@RequestBody FaceGroupAdditionRequest faceGroupAdditionRequest) { String body = JSONObject.toJSONString(faceGroupAdditionRequest); @@ -212,7 +282,7 @@ * 批量添加海康组织 * api->hik批量添加组织api->response */ - @PostMapping("/org/batch/add") + @PostMapping("/hik/org/batch/add") @ResponseBody public Object orgBatchAdd(@RequestBody List orgBatchAddRequest) { String body = JSONObject.toJSONString(orgBatchAddRequest); @@ -232,4 +302,62 @@ return ResponseData.error("批量添加组织失败"); } + /** + * 获取人员列表 + */ + @PostMapping("/hik/person/personList") + @ResponseBody + public Object personList() { + PersonListRequest request = new PersonListRequest(); + request.setPageNo(1); + request.setPageSize(100); + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi("/api/resource/v2/person/personList", body); + return resultStr; + } + + /** + * 获取组织列表 + */ + @PostMapping("/hik/org/orgList") + @ResponseBody + public Object orgList() { + PersonListRequest request = new PersonListRequest(); + request.setPageNo(1); + request.setPageSize(100); + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi("/api/resource/v1/org/orgList", body); + return resultStr; + } + + /** + * 查询访客权限下载记录 + */ + @PostMapping("/hik/auth/result") + @ResponseBody + public Object authResult() { + PersonListRequest request = new PersonListRequest(); + request.setPageNo(1); + request.setPageSize(100); + request.setOrderId("ba101db6246711edaea66f7939a13638"); + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi("/api/visitor/v1/auth/result", body); + return resultStr; + } + + /** + * 人脸图片获取 + */ + @PostMapping("/hik/face/picture") + @ResponseBody + public Object facePicture() { + FaceRequest request = new FaceRequest(); +// List list = new ArrayList<>(); +// list.add(""); + request.setCertificateNum("wanggong"); + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi("/api/frs/v1/face", body); + return resultStr; + } + } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/AssetInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/AssetInfoMapper.java index 4f64e83..c0684ee 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/AssetInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/AssetInfoMapper.java @@ -17,6 +17,6 @@ @Mapper public interface AssetInfoMapper extends BaseMapper { - List getAssetInfoListPage(@Param("page") Page page, AssetInfoRequest assetInfoRequest); + List getAssetInfoListPage(@Param("page") Page page, @Param("assetInfoRequest") AssetInfoRequest assetInfoRequest); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/AttendanceInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/AttendanceInfoMapper.java index f9e793e..ec87e46 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/AttendanceInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/AttendanceInfoMapper.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.statistics.AttendanceNumberDTO; import com.casic.missiles.modular.dto.statistics.AttendanceRatioDTO; import com.casic.missiles.modular.model.AttendanceInfo; import org.apache.ibatis.annotations.Mapper; @@ -17,7 +18,7 @@ */ @Mapper public interface AttendanceInfoMapper extends BaseMapper { - List getAttendanceInfoListPage(@Param("page") Page page, StaffInfoRequest attendanceInfoRequest); + List getAttendanceInfoListPage(@Param("page") Page page, @Param("attendanceInfoRequest") StaffInfoRequest attendanceInfoRequest); AttendanceInfo selectByCodeAndDate(@Param("staffCode") String staffCode); @@ -26,4 +27,8 @@ List getCountByTypeAndDateForMonth(@Param("staffType")String staffType); List getCountByTypeAndDateForYear(@Param("staffType")String staffType); + + List getCountForWeek(); + + List getCountForDay(); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java index ce94b8f..6137a7d 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java @@ -17,5 +17,5 @@ @Mapper public interface BlackInfoMapper extends BaseMapper { - List getBlackInfoListPage(@Param("page") Page page, BlackInfoRequest blackInfoRequest); + List getBlackInfoListPage(@Param("page") Page page, @Param("blackInfoRequest") BlackInfoRequest blackInfoRequest); } 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 efda6b3..50aaa6f 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 @@ -20,7 +20,7 @@ List getCaseInfoListPage(@Param("page") Page page, @Param("caseInfoRequest") CaseInfoRequest caseInfoRequest); - int updateStatusById(CaseInfoRequest caseInfoRequest); + int updateStatusById(@Param("caseInfoRequest") CaseInfoRequest caseInfoRequest); List selectByLevelAndMonth(@Param("year") String year); @@ -47,4 +47,20 @@ List selectPreWeekCountByThirtyDay(); List selectPreDayCountBySevenDay(); + + Integer selectDemobilizedCount(@Param("eventType") Number personnelDemobilizedEvent); + + List selectPreMonthCount(); + + List selectListBySevenDay(); + + List selectListByToday(); + + List selectListByToday2(); + + List selectListByToday3(); + + List selectListByType(@Param("eventType") Number eventType); + + List selectDemobilizedCountByHour(@Param("eventType") Number eventType); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/CategoryLevelMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/CategoryLevelMapper.java index 52fc714..afe1650 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/CategoryLevelMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/CategoryLevelMapper.java @@ -17,9 +17,9 @@ @Mapper public interface CategoryLevelMapper extends BaseMapper { - List getCaseCategoryLevelListPage(@Param("page") Page page, CategoryLevelRequest categoryLevelRequest); + List getCaseCategoryLevelListPage(@Param("page") Page page, @Param("categoryLevelRequest") CategoryLevelRequest categoryLevelRequest); - List getCaseCategoryLevelList(CategoryLevelRequest categoryLevelRequest); + List getCaseCategoryLevelList(@Param("categoryLevelRequest") CategoryLevelRequest categoryLevelRequest); CaseCategoryLevel getCaseCategoryLevel(@Param("categoryLevelCode") String categoryLevelCode); 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 66353b1..2555a09 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 @@ -19,7 +19,7 @@ @Mapper public interface DeviceInfoMapper extends BaseMapper { - List getDeviceInfoListPage(@Param("page") Page page, DeviceInfoRequest deviceInfoRequest); + List getDeviceInfoListPage(@Param("page") Page page, @Param("deviceInfoRequest") DeviceInfoRequest deviceInfoRequest); List getDeviceInfoList(@Param("deviceInfoRequest") DeviceInfoRequest deviceInfoRequest); @@ -27,6 +27,8 @@ DeviceInfo getByIndexCode(@Param("srcIndex") String srcIndex); + DeviceInfo getByIp(@Param("ip") String ip); + List selectIndexCodesByCodes(@Param("deviceCodes") List deviceCodes); List selectByType(@Param("devType") String devType); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java index 41dd0af..5bfaf63 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java @@ -5,6 +5,7 @@ import com.casic.missiles.modular.dto.DeviceRepairRequest; import com.casic.missiles.modular.model.DeviceRepairLog; import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; import java.util.List; @@ -16,7 +17,7 @@ @Mapper public interface DeviceRepairLogMapper extends BaseMapper { - List getDeviceRepairListPage(Page page, DeviceRepairRequest deviceRepairRequest); + List getDeviceRepairListPage(@Param("page") Page page, @Param("deviceRepairRequest")DeviceRepairRequest deviceRepairRequest); - List getDeviceRepairList(DeviceRepairRequest deviceRepairRequest); + List getDeviceRepairList(@Param("deviceRepairRequest") DeviceRepairRequest deviceRepairRequest); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java index 9035c47..4823ac1 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java @@ -18,7 +18,7 @@ @Mapper public interface FireEquipInfoMapper extends BaseMapper { - List getFireEquipInfoListPage(@Param("page") Page page, FireEquipRequest fireEquipRequest); + List getFireEquipInfoListPage(@Param("page") Page page, @Param("fireEquipRequest") FireEquipRequest fireEquipRequest); FireEquipInfo getFireEquipInfo(@Param("equipCode") String equipCode); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/GateGroupMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/GateGroupMapper.java index d8c330d..977a427 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/GateGroupMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/GateGroupMapper.java @@ -17,7 +17,7 @@ */ @Mapper public interface GateGroupMapper extends BaseMapper { - List getGateGroupListPage(@Param("page") Page page, GateGroupRequest gateGroupRequest); + List getGateGroupListPage(@Param("page") Page page, @Param("gateGroupRequest") GateGroupRequest gateGroupRequest); GateGroup getGateGroupByName(@Param("groupName") String groupName); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/HazardLevelMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/HazardLevelMapper.java index 8957780..dcf47bb 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/HazardLevelMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/HazardLevelMapper.java @@ -17,11 +17,13 @@ @Mapper public interface HazardLevelMapper extends BaseMapper { - List getCaseHazardLevelListPage(@Param("page") Page page, HazardLevelRequest hazardLevelRequest); + List getCaseHazardLevelListPage(@Param("page") Page page, @Param("hazardLevelRequest") HazardLevelRequest hazardLevelRequest); - List getCaseHazardLevelList(HazardLevelRequest hazardLevelRequest); + List getCaseHazardLevelList(@Param("hazardLevelRequest") HazardLevelRequest hazardLevelRequest); CaseHazardLevel getCaseHazardLevel(@Param("hazardLevelCode") String hazardLevelCode); List selectHazardName(); + + String selectHazardNameByCode(@Param("hazardLevelCode") String hazardLevelCode); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/HikCaseDefineMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/HikCaseDefineMapper.java index 0dc47d1..f162fef 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/HikCaseDefineMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/HikCaseDefineMapper.java @@ -12,5 +12,5 @@ */ @Mapper public interface HikCaseDefineMapper extends BaseMapper { - HikCaseDefine getHikCaseDefine(@Param("caseTypeCode") Long caseTypeCode); + HikCaseDefine getHikCaseDefine(@Param("caseTypeCode") Number caseTypeCode); } 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 f8a674c..fe5afc2 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 @@ -17,11 +17,13 @@ @Mapper public interface StaffInfoMapper extends BaseMapper { - List getStaffInfoListPage(@Param("page") Page page, StaffInfoRequest staffInfoRequest); + List getStaffInfoListPage(@Param("page") Page page, @Param("staffInfoRequest") StaffInfoRequest staffInfoRequest); StaffInfo selectByCode(@Param("staffCode") String staffCode); - List getStaffInfoList(StaffInfoRequest staffInfoRequest); + List getStaffInfoList(@Param("staffInfoRequest") StaffInfoRequest staffInfoRequest); - List selectBatchCodes(List list); + List selectBatchCodes(@Param("list") List list); + + int updateByCodeForCard(@Param("staffCode") String staffCode, @Param("cardNo") String cardNo); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitInfoMapper.java index b1217c5..6c52542 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitInfoMapper.java @@ -16,7 +16,7 @@ */ @Mapper public interface VisitInfoMapper extends BaseMapper { - List getVisitInfoListPage(@Param("page") Page page, VisitorRequest visitorRequest); + List getVisitInfoListPage(@Param("page") Page page, @Param("visitorRequest") VisitorRequest visitorRequest); VisitInfo selectByOrderId(@Param("orderId") String orderId); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitorApplyMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitorApplyMapper.java index c09f3c0..6ea55bd 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitorApplyMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitorApplyMapper.java @@ -18,7 +18,7 @@ @Mapper public interface VisitorApplyMapper extends BaseMapper { - List getVisitorApplyListPage(@Param("page") Page page, VisitorApplyRequest visitorApplyRequest); + List getVisitorApplyListPage(@Param("page") Page page, @Param("visitorApplyRequest") VisitorApplyRequest visitorApplyRequest); List selectByVisitReason(); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/AttendanceInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/AttendanceInfoMapper.xml index b2ece71..f8bdd6e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/AttendanceInfoMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/AttendanceInfoMapper.xml @@ -43,7 +43,8 @@ and staff_type = #{staffType} - and YEARWEEK(date_format(atte_date, '%Y-%m-%d'), 1) = YEARWEEK(now(),1); + AND DATE_SUB(CURDATE(), INTERVAL 7 DAY) <= DATE(atte_date) + GROUP BY DATE_FORMAT(atte_date, '%Y-%m-%d') @@ -69,4 +70,20 @@ GROUP BY DATE_FORMAT(atte_date, '%Y-%m') + + + \ No newline at end of file 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 2b6953f..06ec0a8 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 @@ -28,7 +28,9 @@ @@ -87,7 +89,8 @@ SELECT hazard_level_code as levelCode, count(id) as quantity FROM bus_case_info WHERE hazard_level_code is not null - AND DATE_SUB(CURDATE(), INTERVAL 7 DAY) <= date(happen_time); + AND is_key_area = 1 + AND DATE_SUB(CURDATE(), INTERVAL 7 DAY) <= date(happen_time) GROUP BY hazard_level_code @@ -95,7 +98,8 @@ SELECT hazard_level_code as levelCode, count(id) as quantity FROM bus_case_info WHERE hazard_level_code is not null - AND DATE_SUB(CURDATE(), INTERVAL 30 DAY) <= date(happen_time); + AND is_key_area = 1 + AND DATE_SUB(CURDATE(), INTERVAL 30 DAY) <= date(happen_time) GROUP BY hazard_level_code @@ -122,4 +126,71 @@ AND hazard_level_code is not null GROUP BY DATE_FORMAT(happen_time,'%Y-%m-%d') + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/CategoryLevelMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/CategoryLevelMapper.xml index 4670b1f..1d25cbd 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/CategoryLevelMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/CategoryLevelMapper.xml @@ -20,11 +20,11 @@ SELECT * FROM bus_case_category_level WHERE 1=1 - - and code = #{code} + + and code = #{categoryLevelRequest.code} - - and name = #{name} + + and name = #{categoryLevelRequest.name} ORDER by create_time DESC 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 9b66fd8..bfd84b7 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 @@ -98,4 +98,10 @@ #{item} + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceRepairLogMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceRepairLogMapper.xml index 078ed3c..cf1a481 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceRepairLogMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceRepairLogMapper.xml @@ -22,14 +22,14 @@ SELECT * FROM bus_device_repair_log WHERE 1=1 - - and device_code = #{devCode} + + and device_code = #{deviceRepairRequest.devCode} - - and device_name = #{devName} + + and device_name = #{deviceRepairRequest.devName} - - and DATE_FORMAT(create_time,"%y%m%d") = DATE_FORMAT(#{createTime},"%y%m%d") + + and DATE_FORMAT(create_time,"%y%m%d") = DATE_FORMAT(#{deviceRepairRequest.createTime},"%y%m%d") ORDER by create_time DESC diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/HazardLevelMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/HazardLevelMapper.xml index f16f2b9..458322b 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/HazardLevelMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/HazardLevelMapper.xml @@ -20,11 +20,11 @@ SELECT * FROM bus_case_hazard_level WHERE 1=1 - - and code = #{code} + + and code = #{hazardLevelRequest.code} - - and name = #{name} + + and name = #{hazardLevelRequest.name} ORDER by create_time DESC @@ -42,4 +42,10 @@ SELECT name FROM bus_case_hazard_level + + \ 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 557237e..b6a183a 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 @@ -50,4 +50,10 @@ + + + UPDATE bus_staff_info + SET card_no = #{cardNo} + WHERE staff_code = #{staffCode} + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitInfoMapper.xml index 84aa84f..230529a 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitInfoMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitInfoMapper.xml @@ -27,5 +27,6 @@ SELECT * FROM bus_visit_info WHERE order_id = #{orderId} and DATE_FORMAT(in_time,'%Y-%m-%d') = CURRENT_DATE + limit 1 \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/BlackPictureRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/BlackPictureRequest.java new file mode 100644 index 0000000..fc92701 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/BlackPictureRequest.java @@ -0,0 +1,14 @@ +package com.casic.missiles.modular.dto; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/29 19:26 + */ +@Data +public class BlackPictureRequest { + private String picUri; + private String serverIndexCode; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/CancelSubscribeRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/CancelSubscribeRequest.java new file mode 100644 index 0000000..e2d390a --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/CancelSubscribeRequest.java @@ -0,0 +1,15 @@ +package com.casic.missiles.modular.dto.hik; + +import lombok.Data; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/24 15:14 + */ +@Data +public class CancelSubscribeRequest { + private List eventTypes; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/CardInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/CardInfo.java new file mode 100644 index 0000000..341457d --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/CardInfo.java @@ -0,0 +1,24 @@ +package com.casic.missiles.modular.dto.hik; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/26 16:08 + */ +@Data +public class CardInfo { + //卡号,8~20个字符,支持数字和大写字母 + private String cardNo; + //人员ID,员工工号 + private String personId; + //人员所属组织IndexCode + private String orgIndexCode; + //卡片类型,默认是1:IC卡 + //1:IC卡 + //2:CPU卡 + //3:远距离卡 + //4:MIFARE卡 + private Number cardType; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/FaceRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/FaceRequest.java new file mode 100644 index 0000000..edc04bf --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/FaceRequest.java @@ -0,0 +1,16 @@ +package com.casic.missiles.modular.dto.hik; + +import lombok.Data; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/25 16:53 + */ +@Data +public class FaceRequest { + private String certificateNum; + private List indexCodes; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/HikRecvEvent.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/HikRecvEvent.java index a3e9845..1b2b2b1 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/HikRecvEvent.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/HikRecvEvent.java @@ -28,12 +28,12 @@ /** * 事件类型,用于判断所需接收到的事件类型 */ - public Long getEventType(){ + public Number getEventType(){ JSONObject jsonObject = (JSONObject)JSONObject.toJSON(params); //事件类别对应SecurityEventTypeEnum JSONArray eventTypeArray = (JSONArray)jsonObject.get("events"); JSONObject eventJsonObject = (JSONObject)JSONObject.toJSON(eventTypeArray.get(0)); - Long eventType = (Long) eventJsonObject.get("eventType"); + Number eventType = (Number) eventJsonObject.get("eventType"); return eventType; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonBatchDeleteRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonBatchDeleteRequest.java index 027d31d..9751929 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonBatchDeleteRequest.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonBatchDeleteRequest.java @@ -12,4 +12,6 @@ @Data public class PersonBatchDeleteRequest { private List personIds; + //删除人脸接口使用 + private String faceId; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonInfoRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonInfoRequest.java new file mode 100644 index 0000000..05dc9e1 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonInfoRequest.java @@ -0,0 +1,20 @@ +package com.casic.missiles.modular.dto.hik; + +import lombok.Data; + +import java.util.List; + +/** + * @Description: 获取员工照片请求实体 + * @Author: wangpeng + * @Date: 2022/8/25 16:53 + */ +@Data +public class PersonInfoRequest { + //获取员工详细信息使用 + private String paramName; + private List paramValue; + //获取照片使用 + private String picUri; + private String serverIndexCode; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonListRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonListRequest.java new file mode 100644 index 0000000..3f7149b --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonListRequest.java @@ -0,0 +1,16 @@ +package com.casic.missiles.modular.dto.hik; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/25 16:53 + */ +@Data +public class PersonListRequest { + private Number pageNo; + private Number pageSize; + + private String orderId; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/SearchPicturesRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/SearchPicturesRequest.java new file mode 100644 index 0000000..0a95966 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/SearchPicturesRequest.java @@ -0,0 +1,24 @@ +package com.casic.missiles.modular.dto.hik; + +import lombok.Data; + +import java.util.List; + +/** + * @Description: 以图搜图请求 + * @Author: wangpeng + * @Date: 2022/8/29 10:46 + */ +@Data +public class SearchPicturesRequest { + private String facePicBinaryData; + private String facePicUrl; + private List cameraIndexCodes; + private String startTime; + private String endTime; + //指定搜图的最小相似度,最小为1,最大为100 + private String minSimilarity; + private Number age; + //male-男性,female-女性 + private String sex; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/StaffCardRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/StaffCardRequest.java new file mode 100644 index 0000000..4052e6d --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/StaffCardRequest.java @@ -0,0 +1,20 @@ +package com.casic.missiles.modular.dto.hik; + +import lombok.Data; + +import java.util.List; + +/** + * @Description: 人员开卡请求实体 + * @Author: wangpeng + * @Date: 2022/8/26 16:05 + */ +@Data +public class StaffCardRequest { + //卡片开始有效时间,时间格式:yyyy-MM-dd + private String startDate; + //卡片截止有效时间,时间格式:yyyy-MM-dd,不能大于2037年12月31日 + private String endDate; + //cardList,待开卡列表,最大支持50张卡 + private List cardList; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/VisitorInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/VisitorInfo.java index 73aa316..b99f301 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/VisitorInfo.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/VisitorInfo.java @@ -14,7 +14,7 @@ //访客性别 //1: 男 //2: 女 - private String gender; + private Integer gender; //联系电话建议填写手机号码 private String phoneNo; //证件类型 diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/ApplyReasonGroupDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/ApplyReasonGroupDTO.java index 514f382..786143e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/ApplyReasonGroupDTO.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/ApplyReasonGroupDTO.java @@ -13,4 +13,6 @@ private String visitReason; //访问人数 private Integer quantity; + //占比 + private String ratio; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/AttendanceNumberDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/AttendanceNumberDTO.java new file mode 100644 index 0000000..a494321 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/AttendanceNumberDTO.java @@ -0,0 +1,24 @@ +package com.casic.missiles.modular.dto.statistics; + +import com.fasterxml.jackson.annotation.JsonIgnore; +import lombok.Data; + +/** + * @Description: 出勤人数统计实体 + * @Author: wangpeng + * @Date: 2022/8/31 19:24 + */ +@Data +public class AttendanceNumberDTO { + //日期维度,周、今日,入参 + @JsonIgnore + private String dateDimension; + + //日期,具体天/小时,出参 + private String date; + //出勤人数 + private String quantity; + //员工类型 + private String staffType; + +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/AvgMonthAndWeekGroupDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/AvgMonthAndWeekGroupDTO.java index 4366916..331a9a9 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/AvgMonthAndWeekGroupDTO.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/AvgMonthAndWeekGroupDTO.java @@ -2,8 +2,6 @@ import lombok.Data; -import java.util.Map; - /** * @Description: 平均每月和每周的数据实体 * @Author: wangpeng @@ -13,6 +11,4 @@ public class AvgMonthAndWeekGroupDTO { //入参 private String year; - //出参,key:事件类型,value:周和月数据平均值 - private Map map; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/GateStatusGroupResponse.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/GateStatusGroupResponse.java new file mode 100644 index 0000000..d16f4e5 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/GateStatusGroupResponse.java @@ -0,0 +1,16 @@ +package com.casic.missiles.modular.dto.statistics; + +import lombok.Data; + +/** + * @Description: 闸机/摄像机统计响应实体 + * @Author: wangpeng + * @Date: 2022/8/30 14:22 + */ +@Data +public class GateStatusGroupResponse { + //设备状态 + private String status; + //占比 + private String ratio; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/MonthAndWeekDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/MonthAndWeekDTO.java index 7482b2a..284115a 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/MonthAndWeekDTO.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/MonthAndWeekDTO.java @@ -9,7 +9,7 @@ */ @Data public class MonthAndWeekDTO { -// private String levelName; + private String levelName; private Integer monthQuantity; private Integer weekQuantity; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/OnDutyRatioDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/OnDutyRatioDTO.java new file mode 100644 index 0000000..4f6a65d --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/OnDutyRatioDTO.java @@ -0,0 +1,15 @@ +package com.casic.missiles.modular.dto.statistics; + +import lombok.Data; + +/** + * @Description: 在岗率统计实体 + * @Author: wangpeng + * @Date: 2022/9/2 21:24 + */ +@Data +public class OnDutyRatioDTO { + private String date; + private String quantity; + private String ratio; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/SecurityLevelAssessDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/SecurityLevelAssessDTO.java new file mode 100644 index 0000000..40a0738 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/SecurityLevelAssessDTO.java @@ -0,0 +1,15 @@ +package com.casic.missiles.modular.dto.statistics; + +import lombok.Data; + +/** + * @Description: 出勤人数统计实体 + * @Author: wangpeng + * @Date: 2022/8/31 19:24 + */ +@Data +public class SecurityLevelAssessDTO { + private String date; + private String quantity; + private Double score; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/SecurityScoreDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/SecurityScoreDTO.java index 304d169..f7bd4a2 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/SecurityScoreDTO.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/SecurityScoreDTO.java @@ -14,5 +14,5 @@ //楼层,出参 private String area; //评分,出参 - private String score; + private Double score; } 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 6a30786..e5e613d 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 @@ -8,6 +8,10 @@ public interface HikUri { //事件订阅 String EVENT_SUBSCRIBE = "/api/eventService/v1/eventSubscriptionByEventTypes"; + //事件订阅信息查询 + String EVENT_INFO = "/api/eventService/v1/eventSubscriptionView"; + //事件订阅取消 + String EVENT_CANCEL = "/api/eventService/v1/eventUnSubscriptionByEventTypes"; //预约免登记 String APPOINTMENT_FREE_REGISTER = "/api/visitor/v1/appointment/registration"; //修改访客预约 @@ -32,8 +36,18 @@ String PERSON_SINGLE_UPDATE = "/api/resource/v1/person/single/update"; //批量删除人员 String PERSON_BATCH_DELETE = "/api/resource/v1/person/batch/delete"; + //根据人脸Id删除人脸 + String PERSON_SINGLE_DELETE = "/api/resource/v1/face/single/delete"; //门禁点反控 String DOOR_CONTROL = "/api/acs/v1/door/doControl"; //查询海康门禁点事件v2 String DOOR_EVENTS = "/api/acs/v2/door/events"; + //批量开卡 + String CARD_BINDING = "/api/cis/v1/card/binding"; + //提取人员照片 + String PERSON_PICTURE = "/api/resource/v1/person/picture"; + //根据人员唯一字段获取人员详细信息 + String PERSON_INFO = "/api/resource/v1/person/condition/personInfo"; + //以图搜图 + String SEARCH_PICTURES = "/api/frs/v1/application/captureSearch"; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/enums/SecurityEventType.java b/casic-server/src/main/java/com/casic/missiles/modular/enums/SecurityEventType.java index d51034c..42eacf8 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/enums/SecurityEventType.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/enums/SecurityEventType.java @@ -14,18 +14,27 @@ Number PERSONNEL_GATHER_EVENT = 131593; //监控点离线事件 Number MONITORING_POINT_OFFLINE = 889196545; + //监控点上线事件 + Number MONITORING_POINT_ONLINE = 889196546; //装置离线 Number DEVICE_OFFLINE = 199710; + //装置连线 + Number DEVICE_ONLINE = 199711; //访客登记 Number VISITOR_REGISTER = 1392513025; //访客签离 Number VISITOR_CHECKOUT = 1392513026; + //高空抛物 + Number HIGH_ALTITUDE_PARABOLIC = 930335; + //下面两个查询海康门禁点事件使用 //合法卡比对通过 Number CARD_COMPARE_PASS = 198914; //人脸认证通过 Number FACE_COMPARE_PASS = 196893; + + // //正常开门 // Number NORMAL_OPENING = 198913; // //按钮开门 @@ -46,7 +55,6 @@ // Number FIREWORKS_DETECTION = 192514; // //陌生人识别事件 // Number STRANGER_RECOGNITION = 1644171265; -// //高空抛物 -// Number HIGH_ALTITUDE_PARABOLIC = 930335; + } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/job/CockpitJob.java b/casic-server/src/main/java/com/casic/missiles/modular/job/CockpitJob.java index 7490a27..85dd016 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/job/CockpitJob.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/job/CockpitJob.java @@ -79,14 +79,6 @@ } }); } - } - /** - * 机动力量实时在岗率,在岗人数除以总应在岗人数,功能待定 - */ -// @Scheduled(cron = "0 0/1 * * * ?") - public void BeOnDutyRatio() { - - } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/service/HikCaseDefineService.java b/casic-server/src/main/java/com/casic/missiles/modular/service/HikCaseDefineService.java index d9bb3a9..18e2936 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/service/HikCaseDefineService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/service/HikCaseDefineService.java @@ -9,5 +9,5 @@ * @Date: 2022/7/21 17:20 */ public interface HikCaseDefineService extends IService { - HikCaseDefine getHikCaseDefine(Long caseTypeCode); + HikCaseDefine getHikCaseDefine(Number caseTypeCode); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/BlackListController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/BlackListController.java index a27f9f8..0c06661 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/BlackListController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/BlackListController.java @@ -1,13 +1,18 @@ package com.casic.missiles.modular.controller; +import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.base.controller.ExportController; import com.casic.missiles.core.page.PageFactory; import com.casic.missiles.model.response.ResponseData; import com.casic.missiles.modular.dto.BlackInfoRequest; +import com.casic.missiles.modular.dto.BlackPictureRequest; +import com.casic.missiles.modular.dto.hik.PersonInfoRequest; +import com.casic.missiles.modular.enums.HikUri; import com.casic.missiles.modular.enums.OperateTypeEnum; import com.casic.missiles.modular.model.BlackInfo; import com.casic.missiles.modular.service.BlackInfoService; +import com.casic.missiles.modular.util.HikUtil; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; @@ -56,4 +61,22 @@ return null; } + /** + * 黑名单人员照片 + */ + @PostMapping("/personPicture") + @ResponseBody + public Object personPicture(@RequestBody BlackPictureRequest blackPictureRequest){ + //获取照片 + String picUri = blackPictureRequest.getPicUri(); + String serverIndexCode = blackPictureRequest.getServerIndexCode(); + PersonInfoRequest picRequest = new PersonInfoRequest(); + picRequest.setPicUri(picUri); + picRequest.setServerIndexCode(serverIndexCode); + String reBody = JSONObject.toJSONString(picRequest); + //重定向地址获取 + String url = HikUtil.hikApiFor302(HikUri.PERSON_PICTURE, reBody); + return ResponseData.success(url); + } + } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/DeviceController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/DeviceController.java index e1c4eba..666bbee 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/DeviceController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/DeviceController.java @@ -107,7 +107,7 @@ } /** - * 设备维修管理查询(分页),需计算MTTR=总维修时间/故障次数 + * 设备状态计算与评判/设备维修管理查询(分页),需计算MTTR=总维修时间/故障次数 */ @PostMapping("/repair/listPage") @ResponseBody @@ -211,7 +211,7 @@ //需根据设备编号获取到对应的门禁点唯一标识 doorControlRequest.setDoorIndexCodes(indexCodes); doorControlRequest.setControlType(Integer.valueOf(gateGroupDTO.getStatus())); - String body = JSONObject.toJSONString(deviceCodes); + String body = JSONObject.toJSONString(doorControlRequest); String resultStr = HikUtil.hikApi(HikUri.DOOR_CONTROL, body); JSONObject resultJson = (JSONObject)JSONObject.parse(resultStr); if (!"0".equals(resultJson.get("code"))) { diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/StaffController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/StaffController.java index b58ccab..704093c 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/StaffController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/StaffController.java @@ -2,15 +2,21 @@ import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.util.StrUtil; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.base.controller.ExportController; import com.casic.missiles.core.page.PageFactory; import com.casic.missiles.model.response.ErrorResponseData; import com.casic.missiles.model.response.ResponseData; import com.casic.missiles.modular.dto.StaffInfoRequest; +import com.casic.missiles.modular.dto.hik.PersonInfoRequest; +import com.casic.missiles.modular.dto.hik.StaffCardRequest; +import com.casic.missiles.modular.enums.HikUri; import com.casic.missiles.modular.enums.OperateTypeEnum; import com.casic.missiles.modular.model.StaffInfo; import com.casic.missiles.modular.service.StaffInfoService; +import com.casic.missiles.modular.util.HikUtil; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; @@ -110,4 +116,60 @@ } return ResponseData.success(); } + + /** + * 批量开卡,添加人员之后调用,若在一个接口中添加人员成功开卡失败则第二次添加时会有问题 + */ + @PostMapping("/cardBinding") + @ResponseBody + public Object cardBinding(@RequestBody StaffCardRequest staffCardRequest) { + String body = JSONObject.toJSONString(staffCardRequest); + String resultStr = HikUtil.hikApi(HikUri.CARD_BINDING, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (!"0".equals(resultJson.get("code"))) { + log.error("请求海康,批量开卡失败,海康response:{}", resultStr); + return ResponseData.error("批量开卡失败"); + } + //保存卡号 + if(staffInfoService.saveCardInfo(staffCardRequest) > 0){ + return ResponseData.success(); + } + return ResponseData.error("批量开卡失败"); + } + + /** + * 获取员工照片,海康存储 + */ + @PostMapping("/personPicture/{staffCode}") + @ResponseBody + public Object personPicture(@PathVariable("staffCode") String staffCode){ + //获取员工详细信息,含图片服务器、uri + PersonInfoRequest request = new PersonInfoRequest(); + List list = new ArrayList<>(); + list.add(staffCode); + request.setParamName("personId"); + request.setParamValue(list); + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi(HikUri.PERSON_INFO, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (!"0".equals(resultJson.get("code"))) { + log.error("请求海康,根据人员唯一字段获取人员详细信息失败,海康response:{}", resultStr); + return ResponseData.error("获取员工照片失败"); + } + //获取照片 + JSONObject data = (JSONObject) resultJson.get("data"); + JSONArray dataArray = (JSONArray) data.get("list"); + JSONObject jsonObject = (JSONObject) dataArray.get(0); + JSONArray personPhoto = (JSONArray) jsonObject.get("personPhoto"); + JSONObject photo = (JSONObject) personPhoto.get(0); + String picUri = photo.getString("picUri"); + String serverIndexCode = photo.getString("serverIndexCode"); + PersonInfoRequest picRequest = new PersonInfoRequest(); + picRequest.setPicUri(picUri); + picRequest.setServerIndexCode(serverIndexCode); + String reBody = JSONObject.toJSONString(picRequest); + //重定向地址获取 + String url = HikUtil.hikApiFor302(HikUri.PERSON_PICTURE, reBody); + return ResponseData.success(url); + } } 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 4a07dd9..7b1dcf6 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 @@ -16,6 +16,7 @@ import com.casic.missiles.modular.redis.key.CacheKeys; import com.casic.missiles.modular.service.CockpitService; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.util.CollectionUtils; import org.springframework.web.bind.annotation.*; @@ -24,10 +25,7 @@ import java.text.NumberFormat; import java.time.LocalDateTime; import java.time.temporal.ChronoUnit; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.util.*; import java.util.stream.Collectors; /** @@ -73,6 +71,9 @@ private StatisticNumberMapper numberMapper; @Autowired + private HazardLevelMapper hazardLevelMapper; + + @Autowired private AccessGroupConfig accessGroupConfig; /** @@ -104,8 +105,24 @@ public Object buildingNumberPerHour(){ //当天按小时分组的人数 List list = numberMapper.selectListByTime(); - Map> collect = list.stream().collect(Collectors.groupingBy(BuildingNumberDTO::getStatisticPosition)); - return ResponseData.success(collect); + Map> collect = list.stream().collect(Collectors.groupingBy(BuildingNumberDTO::getStatisticTime)); + //定时任务中已将每小时三栋楼人数存到数据库 + //将一期主楼和录制楼人数合并,二期单算 + List> resultList = new ArrayList<>(); + collect.keySet().forEach(key -> { + List buildingNumberDTOS = collect.get(key); + BuildingNumberDTO mainBuildingOne = buildingNumberDTOS.get(0); + BuildingNumberDTO mainBuildingTwo = buildingNumberDTOS.get(1); + BuildingNumberDTO recordingBuilding = buildingNumberDTOS.get(2); + HashMap resultMap = new HashMap<>(); + Integer oneQuantity = Integer.valueOf(mainBuildingOne.getStatisticQuantity()); + Integer recordingQuantity = Integer.valueOf(recordingBuilding.getStatisticQuantity()); + resultMap.put("staticTime", mainBuildingOne.getStatisticTime()); + resultMap.put(mainBuildingOne.getStatisticPositionName()+"、"+recordingBuilding.getStatisticPositionName(), String.valueOf(oneQuantity+recordingQuantity)); + resultMap.put(mainBuildingTwo.getStatisticPositionName(), mainBuildingTwo.getStatisticQuantity()); + resultList.add(resultMap); + }); + return ResponseData.success(resultList); } /** @@ -151,12 +168,11 @@ public Object securityNumber() { QueryWrapper wrapper = new QueryWrapper<>(); wrapper.eq("staff_type", 2); + // TODO: 2022/9/2 后续使用产品确定的每天出勤的安保人员的数量 Integer total = staffInfoMapper.selectCount(wrapper); - //当日离岗事件个数 - QueryWrapper wrapper1 = new QueryWrapper<>(); - wrapper1.eq("hik_event_type", SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); - wrapper1.apply("date_format(now(),'%Y-%m-%d') = date_format(happen_time,'%Y-%m-%d')"); - Integer leave = caseInfoMapper.selectCount(wrapper1); + //当日离岗事件按设备去重后的个数 + // TODO: 2022/9/2 目前相当于24小时内的计算,之后看需要可改成自定义小时数计算离岗率,即离岗+6小时内仅一次离岗则恢复为100%,多次则累加离岗次数计算离岗率 + Integer leave = caseInfoMapper.selectDemobilizedCount(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); NumberFormat numberFormat = NumberFormat.getInstance(); // 设置精确到小数点后2位 numberFormat.setMaximumFractionDigits(2); @@ -179,7 +195,6 @@ @ResponseBody public Object visitorApplyDetail() { List reasonGroup = applyMapper.selectByVisitReason(); - HashMap resultMap = new HashMap<>(); NumberFormat numberFormat = NumberFormat.getInstance(); // 设置精确到小数点后2位 numberFormat.setMaximumFractionDigits(2); @@ -187,12 +202,17 @@ if(0 == sum){ return ResponseData.success(); } + List resultList = new ArrayList<>(); reasonGroup.forEach(group -> { String reasonName = dictService.getDictNameByCode(SecurityEventDict.VISIT_REASON, group.getVisitReason()); String result = numberFormat.format((float) group.getQuantity() / (float) sum * 100); - resultMap.put(reasonName, result+"%"); + ApplyReasonGroupDTO applyReasonGroupDTO = new ApplyReasonGroupDTO(); + applyReasonGroupDTO.setQuantity(group.getQuantity()); + applyReasonGroupDTO.setVisitReason(reasonName); + applyReasonGroupDTO.setRatio(result+"%"); + resultList.add(applyReasonGroupDTO); }); - return ResponseData.success(resultMap); + return ResponseData.success(resultList); } /** @@ -247,6 +267,32 @@ } /** + * 机动力量实时在岗率,在岗人数除以总应在岗人数,用离岗+6小时内恢复为100%,6小时外再计算 + */ + @GetMapping("/staff/beOnDutyRatio") + @ResponseBody + public Object beOnDutyRatio() { + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("staff_type", 2); + // TODO: 2022/9/2 后续使用产品确定的每天出勤的安保人员的数量 + Integer total = staffInfoMapper.selectCount(wrapper); + if(0 == total){ + return ResponseData.success(null); + } + //当日离岗事件按设备去重后的个数 + // TODO: 2022/9/2 目前相当于24小时内的计算,之后看需要可改成自定义小时数计算离岗率,即离岗+6小时内仅一次离岗则恢复为100%,多次则累加离岗次数计算离岗率 + List onDutyRatioDTOS = caseInfoMapper.selectDemobilizedCountByHour(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); + onDutyRatioDTOS.forEach(dto -> { + NumberFormat numberFormat = NumberFormat.getInstance(); + // 设置精确到小数点后2位 + numberFormat.setMaximumFractionDigits(2); + String result = numberFormat.format(100 - Float.valueOf(dto.getQuantity()) / (float) total * 100); + dto.setRatio(result+"%"); + }); + return ResponseData.success(onDutyRatioDTOS); + } + + /** * 闸机速通门统计-设备状态分组计算数量,devType传闸机字典key * 视频频监控摄像机统计-设备状态分组计算数量,devType传摄像头字典key */ @@ -262,12 +308,17 @@ if(sum <= 0){ return ResponseData.error("无该类设备信息"); } + List resultList = new ArrayList<>(); gateStatusGroup.forEach(group -> { String devStatus = dictService.getDictNameByCode(SecurityEventDict.DEVICE_STATUS, group.getStatus()); String result = numberFormat.format((float) group.getQuantity() / (float) sum * 100); - resultMap.put(devStatus, result+"%"); + GateStatusGroupResponse gateStatusGroupResponse = new GateStatusGroupResponse(); + gateStatusGroupResponse.setStatus(devStatus); + gateStatusGroupResponse.setRatio(result+"%"); + resultList.add(gateStatusGroupResponse); }); - resultMap.put("总", sum); + resultMap.put("total", sum); + resultMap.put("list", resultList); return ResponseData.success(resultMap); } @@ -282,17 +333,38 @@ String position = securityScoreDTO.getPosition(); List caseInfos = caseInfoMapper.selectByPosition(position); //查询各危险级别权重、各类别权重,放入map,避免循环中多次查数据库 - + HashMap hazardScoreMap = new HashMap<>(); + List caseHazardLevelList = hazardLevelMapper.getCaseHazardLevelList(null); + caseHazardLevelList.forEach(hazardLevel -> { + hazardScoreMap.put(hazardLevel.getCode(), hazardLevel.getWeight()); + }); + HashMap categoryScoreMap = new HashMap<>(); + List categoryLevelList = categoryLevelMapper.getCaseCategoryLevelList(null); + categoryLevelList.forEach(categoryLevel -> { + categoryScoreMap.put(categoryLevel.getCode(), categoryLevel.getWeight()); + }); + //事件按楼层分组,计算 List securityScoreDTOs = new ArrayList<>(); caseInfos.forEach(caseInfo -> { SecurityScoreDTO securityScoreDTO1 = new SecurityScoreDTO(); + securityScoreDTO1.setPosition(caseInfo.getPosition()); securityScoreDTO1.setArea(caseInfo.getArea()); - // TODO: 2022/8/4 楼层评分计算根据产品定义调整 -// caseInfo.get -// securityScoreDTO1.setScore(); + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); + Double score = 100 - Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + securityScoreDTO1.setScore(score); + securityScoreDTOs.add(securityScoreDTO1); }); - - return null; + 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); + }); + return ResponseData.success(securityScoreDTOs); } /** @@ -303,9 +375,13 @@ public Object SecurityFrequency(@RequestBody SecurityFrequencyDTO securityFrequencyDTO) { String year = securityFrequencyDTO.getYear(); String month = securityFrequencyDTO.getMonth(); - Integer quantity = caseInfoMapper.selectCountByMonth(year, month); - securityFrequencyDTO.setQuantity(quantity); - return ResponseData.success(securityFrequencyDTO); + if(!StringUtils.isEmpty(year) && StringUtils.isEmpty(month)){ + Integer quantity = caseInfoMapper.selectCountByMonth(year, month); + securityFrequencyDTO.setQuantity(quantity); + return ResponseData.success(securityFrequencyDTO); + } + List list = caseInfoMapper.selectPreMonthCount(); + return ResponseData.success(list); } } 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 ae4d770..f4f075c 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 @@ -1,20 +1,25 @@ package com.casic.missiles.modular.controller.cockpit; +import cn.hutool.core.date.DateUnit; import cn.hutool.core.date.DateUtil; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.casic.missiles.model.response.ResponseData; -import com.casic.missiles.modular.dao.AttendanceInfoMapper; -import com.casic.missiles.modular.dao.CaseInfoMapper; -import com.casic.missiles.modular.dao.HazardLevelMapper; -import com.casic.missiles.modular.dao.StaffInfoMapper; +import com.casic.missiles.modular.dao.*; +import com.casic.missiles.modular.dto.DeviceRepairLogDTO; +import com.casic.missiles.modular.dto.DeviceRepairRequest; import com.casic.missiles.modular.dto.statistics.*; +import com.casic.missiles.modular.enums.SecurityEventType; +import com.casic.missiles.modular.model.CaseCategoryLevel; import com.casic.missiles.modular.model.CaseHazardLevel; +import com.casic.missiles.modular.model.CaseInfo; import com.casic.missiles.modular.model.StaffInfo; +import com.casic.missiles.modular.service.DeviceInfoService; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.util.CollectionUtils; import org.springframework.web.bind.annotation.*; +import java.math.BigDecimal; import java.text.NumberFormat; import java.util.*; import java.util.stream.Collectors; @@ -40,6 +45,12 @@ @Autowired private HazardLevelMapper hazardLevelMapper; + @Autowired + private CategoryLevelMapper categoryLevelMapper; + + @Autowired + private DeviceInfoService deviceInfoService; + /** * 安防事件时域频次统计,每月的每天安防事件个数(原方案) * 月维度:展示每个月的每天的数据 @@ -89,15 +100,17 @@ List monthList = caseInfoMapper.selectPreMonthCountByYear(year); Map> collect = monthList.stream().collect(Collectors.groupingBy(PreMonthOrWeekCaseDTO::getHazardLevelCode)); HashMap strAvgMap = new HashMap<>(); + List resultList = new ArrayList<>(); for (String key : collect.keySet()) { List preMonthOrWeekCaseDTOS = collect.get(key); int sum = preMonthOrWeekCaseDTOS.stream().mapToInt(PreMonthOrWeekCaseDTO::getQuantity).sum(); //若年份是本年,则使用个安防级别数量/当前月份数 //若不是本年,除数为12 MonthAndWeekDTO monthAndWeekDTO = new MonthAndWeekDTO(); + String hazardName = hazardLevelMapper.selectHazardNameByCode(key); + monthAndWeekDTO.setLevelName(hazardName); if(year.equals(String.valueOf(DateUtil.thisYear()))){ monthAndWeekDTO.setMonthQuantity(sum / DateUtil.thisMonth()); -// monthAndWeekDTO.setLevelName(); strAvgMap.put(key, monthAndWeekDTO); }else{ monthAndWeekDTO.setMonthQuantity(sum / 12); @@ -113,27 +126,37 @@ if(year.equals(String.valueOf(DateUtil.thisYear()))){ if(!Objects.isNull(strAvgMap.get(key))){ MonthAndWeekDTO monthAndWeekDTO = strAvgMap.get(key); + String hazardName = hazardLevelMapper.selectHazardNameByCode(key); + monthAndWeekDTO.setLevelName(hazardName); monthAndWeekDTO.setWeekQuantity(sum / DateUtil.thisWeekOfYear()); strAvgMap.put(key, monthAndWeekDTO); }else{ MonthAndWeekDTO monthAndWeekDTO = new MonthAndWeekDTO(); + String hazardName = hazardLevelMapper.selectHazardNameByCode(key); + monthAndWeekDTO.setLevelName(hazardName); monthAndWeekDTO.setWeekQuantity(sum / DateUtil.thisWeekOfYear()); strAvgMap.put(key, monthAndWeekDTO); } }else{ if(!Objects.isNull(strAvgMap.get(key))){ MonthAndWeekDTO monthAndWeekDTO = strAvgMap.get(key); + String hazardName = hazardLevelMapper.selectHazardNameByCode(key); + monthAndWeekDTO.setLevelName(hazardName); monthAndWeekDTO.setWeekQuantity(sum / 52); strAvgMap.put(key, monthAndWeekDTO); }else{ MonthAndWeekDTO monthAndWeekDTO = new MonthAndWeekDTO(); + String hazardName = hazardLevelMapper.selectHazardNameByCode(key); + monthAndWeekDTO.setLevelName(hazardName); monthAndWeekDTO.setWeekQuantity(sum / 52); strAvgMap.put(key, monthAndWeekDTO); } } } - avgMonthAndWeekGroupDTO.setMap(strAvgMap); - return ResponseData.success(avgMonthAndWeekGroupDTO); + strAvgMap.keySet().forEach(key -> { + resultList.add(strAvgMap.get(key)); + }); + return ResponseData.success(resultList); } /** @@ -181,12 +204,178 @@ } /** - * 员工考勤人数变化,功能待定 + * 员工考勤人数变化,统计当天(横坐标为时)及近7天(横坐标为天)的考勤人数变化,只要发生一次考勤识别,次数的基数就正常增加(没有上班下班区分) */ + @PostMapping("/staff/attendanceNumber/{dimension}") + @ResponseBody + public Object attendanceNumber(@PathVariable("dimension") String dimension) { + List attendanceNumberDTOs = null; + List> resultList = new ArrayList<>(); + if("week".equals(dimension)){ + //近7天数据按天分组统计 + attendanceNumberDTOs = attendanceInfoMapper.getCountForWeek(); + }else if("day".equals(dimension)) { + //今天数据按小时分组统计 + attendanceNumberDTOs = attendanceInfoMapper.getCountForDay(); + } + if(CollectionUtils.isEmpty(attendanceNumberDTOs)){ + return ResponseData.error("该查询条件下,无员工出勤数据!"); + } + Map> collect = attendanceNumberDTOs.stream().collect(Collectors.groupingBy(AttendanceNumberDTO::getDate)); + collect.keySet().forEach(key -> { + List attendanceNumberDTOS = collect.get(key); + AttendanceNumberDTO attendanceNumberDTO = attendanceNumberDTOS.get(0); + AttendanceNumberDTO attendanceNumberDTO2 = attendanceNumberDTOS.get(1); + Map resultMap = new HashMap<>(); + resultMap.put(attendanceNumberDTO.getStaffType(), attendanceNumberDTO.getQuantity()); + resultMap.put(attendanceNumberDTO2.getStaffType(), attendanceNumberDTO2.getQuantity()); + resultMap.put("staticTime", attendanceNumberDTO.getDate()); + resultList.add(resultMap); + }); + return ResponseData.success(resultList); + } /** - * 近30天/近一周安保人员到岗排行 + * 早晚高峰区域安防评估 */ + @PostMapping("/security/assessment/{dimension}") + @ResponseBody + public Object securityAssessment(@PathVariable("dimension") String dimension) { + //查询各危险级别权重、各类别权重,放入map,避免循环中多次查数据库 + HashMap hazardScoreMap = new HashMap<>(); + List caseHazardLevelList = hazardLevelMapper.getCaseHazardLevelList(null); + caseHazardLevelList.forEach(hazardLevel -> { + hazardScoreMap.put(hazardLevel.getCode(), hazardLevel.getWeight()); + }); + HashMap categoryScoreMap = new HashMap<>(); + List categoryLevelList = categoryLevelMapper.getCaseCategoryLevelList(null); + categoryLevelList.forEach(categoryLevel -> { + categoryScoreMap.put(categoryLevel.getCode(), categoryLevel.getWeight()); + }); + HashMap hashMap = new HashMap<>(); + if("week".equals(dimension)){ + //近7天早晚高峰数据 + List caseInfos = caseInfoMapper.selectListBySevenDay(); + //按时间(天)进行分组 + caseInfos.forEach(caseInfo -> { + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); + Double score = Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + String[] array = caseInfo.getHappenTime().split(" "); + String dayTime = array[0]; + BigDecimal preScore; + if(hashMap.containsKey(dayTime)){ + Double aDouble = hashMap.get(dayTime); + preScore = new BigDecimal(aDouble.toString()); + + }else{ + preScore = new BigDecimal("100.0"); + } + BigDecimal nowScore = new BigDecimal(score.toString()); + hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); + }); + return ResponseData.success(hashMap); + }else if("day".equals(dimension)) { + //今天数据按小时分组统计 + List caseInfos = caseInfoMapper.selectListByToday(); + caseInfos.forEach(caseInfo -> { + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); + Double score = Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + String[] array = caseInfo.getHappenTime().split(":"); + String dayTime = array[0]; + BigDecimal preScore; + if(hashMap.containsKey(dayTime)){ + Double aDouble = hashMap.get(dayTime); + preScore = new BigDecimal(aDouble.toString()); + + }else{ + preScore = new BigDecimal("100.0"); + } + BigDecimal nowScore = new BigDecimal(score.toString()); + hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); + }); + return ResponseData.success(hashMap); + } + return null; + } + + /** + * 重点区域安防事态评估,统计重点区域6:00-23:00按小时分组数据 + */ + @GetMapping("/security/keyAreaStatistic") + @ResponseBody + public Object keyAreaStatistic() { + //查询各危险级别权重、各类别权重,放入map,避免循环中多次查数据库 + HashMap hazardScoreMap = new HashMap<>(); + List caseHazardLevelList = hazardLevelMapper.getCaseHazardLevelList(null); + caseHazardLevelList.forEach(hazardLevel -> { + hazardScoreMap.put(hazardLevel.getCode(), hazardLevel.getWeight()); + }); + HashMap categoryScoreMap = new HashMap<>(); + List categoryLevelList = categoryLevelMapper.getCaseCategoryLevelList(null); + categoryLevelList.forEach(categoryLevel -> { + categoryScoreMap.put(categoryLevel.getCode(), categoryLevel.getWeight()); + }); + HashMap hashMap = new HashMap<>(); + //今天数据按小时分组统计 + List caseInfos = caseInfoMapper.selectListByToday2(); + caseInfos.forEach(caseInfo -> { + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); + Double score = Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + String[] array = caseInfo.getHappenTime().split(":"); + String dayTime = array[0]; + BigDecimal preScore; + if(hashMap.containsKey(dayTime)){ + Double aDouble = hashMap.get(dayTime); + preScore = new BigDecimal(aDouble.toString()); + + }else{ + preScore = new BigDecimal("100.0"); + } + BigDecimal nowScore = new BigDecimal(score.toString()); + hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); + }); + return ResponseData.success(hashMap); + } + + /** + * 安防机动支援力量调配响应评估,根据事件已解决状态及已解决时间-发送时间,按时间(小时)分组统计 + */ + @GetMapping("/security/responseAssess") + @ResponseBody + public Object responseAssess() { + //查询各危险级别权重、各类别权重,放入map,避免循环中多次查数据库 + HashMap hazardScoreMap = new HashMap<>(); + List caseHazardLevelList = hazardLevelMapper.getCaseHazardLevelList(null); + caseHazardLevelList.forEach(hazardLevel -> { + hazardScoreMap.put(hazardLevel.getCode(), hazardLevel.getWeight()); + }); + HashMap hashMap = new HashMap<>(); + //今天数据按小时分组统计 + List caseInfos = caseInfoMapper.selectListByToday3(); + caseInfos.forEach(caseInfo -> { + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + //扣分=事件级别权重*未解决小时数 + Date updateTime = DateUtil.parse(caseInfo.getUpdateTime()); + Date happenTime = DateUtil.parse(caseInfo.getHappenTime()); + long between = DateUtil.between(updateTime, happenTime, DateUnit.HOUR); + Double score = Double.valueOf(hazardWeight)*between; + String[] array = caseInfo.getHappenTime().split(":"); + String dayTime = array[0]; + BigDecimal preScore; + if(hashMap.containsKey(dayTime)){ + Double aDouble = hashMap.get(dayTime); + preScore = new BigDecimal(aDouble.toString()); + }else{ + preScore = new BigDecimal("100.0"); + } + BigDecimal nowScore = new BigDecimal(score.toString()); + hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); + }); + return ResponseData.success(hashMap); + } /** * 重点区域威胁事件类型统计,优先级2,统计近7天和近30天 @@ -224,7 +413,34 @@ } /** - * 设备状态计算系数和评判,优先级3,需确认设备恢复时间是否可以获取 + * 近30天/近一周安保人员到岗排行 */ + + /** + * 安保等级评估,发生离岗事件减1分 + */ + @GetMapping("/security/levelAssess") + @ResponseBody + public Object securityLevelAssess() { + //今天数据按小时分组统计 + List resultList = caseInfoMapper.selectListByType(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); + resultList.forEach(result -> { + BigDecimal deScore = new BigDecimal(result.getQuantity()); + BigDecimal preScore = new BigDecimal("100.0"); + result.setScore(preScore.subtract(deScore).doubleValue()); + }); + return ResponseData.success(resultList); + } + + /** + * 设备状态计算系数和评判,即设备维修管理查询(不分页) + */ + @PostMapping("/device/repairList") + @ResponseBody + public Object repairList(@RequestBody DeviceRepairRequest deviceRepairRequest) { + List deviceRepairLogDTOS = deviceInfoService.deviceRepairListPage(deviceRepairRequest); + return ResponseData.success(deviceRepairLogDTOS); + } + } 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 fbf8ab6..c71a15a 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 @@ -1,13 +1,12 @@ package com.casic.missiles.modular.controller.hik; +import cn.hutool.core.date.DateTime; +import cn.hutool.core.date.DateUtil; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.casic.missiles.model.response.ResponseData; import com.casic.missiles.modular.dao.HikFaceGroupInfoMapper; -import com.casic.missiles.modular.dto.hik.EventSubscribeRequest; -import com.casic.missiles.modular.dto.hik.FaceGroupAdditionRequest; -import com.casic.missiles.modular.dto.hik.HikRecvEvent; -import com.casic.missiles.modular.dto.hik.OrgBatchAdd; +import com.casic.missiles.modular.dto.hik.*; import com.casic.missiles.modular.enums.HikUri; import com.casic.missiles.modular.enums.SecurityEventType; import com.casic.missiles.modular.model.CaseInfo; @@ -18,16 +17,20 @@ import com.casic.missiles.modular.util.CaseInfoFactoryUtil; import com.casic.missiles.modular.util.HikUtil; import com.casic.missiles.modular.util.ThreadPoolUtil; +import com.casic.missiles.modular.util.WebSocket; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; -import org.springframework.web.bind.annotation.*; +import org.springframework.util.CollectionUtils; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.RestController; -import java.net.InetAddress; -import java.net.UnknownHostException; import java.util.ArrayList; +import java.util.Iterator; import java.util.List; import java.util.Objects; @@ -38,7 +41,6 @@ */ @Slf4j @RestController -@RequestMapping("/hik") public class HikController { @Autowired @@ -53,28 +55,37 @@ @Autowired private HikService hikService; + @Autowired + private HikFaceGroupInfoMapper hikFaceGroupInfoMapper; + + @Autowired + private WebSocket webSocket; + @Value("${server.port}") private int serverPort; - @Autowired - private HikFaceGroupInfoMapper hikFaceGroupInfoMapper; /** * 海康事件订阅 */ - @PostMapping("/event/subscribe") + @PostMapping("/hik/event/subscribe") @ResponseBody - public Object eventSubscribe() throws UnknownHostException { + public Object eventSubscribe() { EventSubscribeRequest eventSubscribeRequest = new EventSubscribeRequest(); ArrayList list = new ArrayList<>(); list.add(SecurityEventType.DEVICE_OFFLINE); + list.add(SecurityEventType.DEVICE_ONLINE); list.add(SecurityEventType.KEY_PERSONNEL_IDENTIFY_EVENT); list.add(SecurityEventType.MONITORING_POINT_OFFLINE); + list.add(SecurityEventType.MONITORING_POINT_ONLINE); list.add(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); list.add(SecurityEventType.PERSONNEL_GATHER_EVENT); - InetAddress localHost = InetAddress.getLocalHost(); + list.add(SecurityEventType.VISITOR_REGISTER); + list.add(SecurityEventType.VISITOR_CHECKOUT); + list.add(SecurityEventType.HIGH_ALTITUDE_PARABOLIC); +// InetAddress localHost = InetAddress.getLocalHost(); eventSubscribeRequest.setEventTypes(list); - eventSubscribeRequest.setEventDest("https://" + localHost + ":" + serverPort + "/eventRcv"); + eventSubscribeRequest.setEventDest("http://" + "192.168.10.6" + ":" + serverPort + "/eventRcv"); //订阅类型,0-订阅原始事件,1-联动事件,2-原始事件和联动事件,不填使用默认值0 eventSubscribeRequest.setSubType(0); /** @@ -92,19 +103,25 @@ } /** + * 查询事件订阅信息 + */ + @PostMapping("/hik/event/query") + @ResponseBody + public Object eventQuery() { + String result = HikUtil.hikApi(HikUri.EVENT_INFO, ""); + return result; + } + + /** * 海康事件接收 */ @PostMapping("/eventRcv") @ResponseBody public Object eventRcv(@RequestBody HikRecvEvent hikRecvEvent) { //1、接收所需事件类型 - Long eventType = hikRecvEvent.getEventType(); + Number eventType = hikRecvEvent.getEventType(); log.info("接收到安防事件类型为:{}", eventType); CaseInfo caseInfo = caseInfoFactoryUtil.getCaseInfo(eventType); - //接收到不关心事件直接返回 - if(Objects.isNull(caseInfo)){ - return ResponseData.success(); - } //2、不同事件不同处理,caseInfoFactoryUtil已设置好事件基础定义信息 // 再为事件添加状态、设备编码、设备名称、位置、区域、时间 // 异步处理事件 @@ -114,19 +131,23 @@ caseHandle(hikRecvEvent, eventType, caseInfo); } })); +// caseHandle(hikRecvEvent, eventType, caseInfo); - return null; + return ResponseData.success(); } - private void caseHandle(HikRecvEvent hikRecvEvent, Long eventType, CaseInfo caseInfo) { + private void caseHandle(HikRecvEvent hikRecvEvent, Number eventType, CaseInfo caseInfo) { JSONArray eventArray = hikRecvEvent.getEventArray(); List caseInfos = new ArrayList<>(); - while (eventArray.stream().iterator().hasNext()) { + Iterator iterator = eventArray.iterator(); + while (iterator.hasNext()) { CaseInfo caseInfo1 = new CaseInfo(); - BeanUtils.copyProperties(caseInfo, caseInfo1); - JSONObject event = (JSONObject) eventArray.stream().iterator().next(); + if(!Objects.isNull(caseInfo)){ + BeanUtils.copyProperties(caseInfo, caseInfo1); + } + JSONObject event = (JSONObject) iterator.next(); //5种事件进行不同处理 - if(SecurityEventType.KEY_PERSONNEL_IDENTIFY_EVENT == eventType){ + if (SecurityEventType.KEY_PERSONNEL_IDENTIFY_EVENT.equals(eventType)) { //判断所属人脸分组 JSONObject data = (JSONObject) event.get("data"); JSONObject faceRecognitionResult = (JSONObject) data.get("faceRecognitionResult"); @@ -142,52 +163,101 @@ if (faceGroupCode.equals(blackListGroup.getFaceGroupCode())) { //黑名单分组处理 caseInfo1 = hikService.blackListHandle(event, caseInfo1); - }else if(faceGroupCode.equals(propertyPersonnelGroup.getFaceGroupCode())){ + } else if (faceGroupCode.equals(propertyPersonnelGroup.getFaceGroupCode())) { //考勤分组处理-物业人员,添加到考勤表 hikService.propertyAttendanceHandle(event); - }else if(faceGroupCode.equals(securityPersonnelGroup.getFaceGroupCode())){ + } else if (faceGroupCode.equals(securityPersonnelGroup.getFaceGroupCode())) { //考勤分组处理-安保人员,添加到考勤表 hikService.securityPersonnelHandle(event); - }else { + } else { return; } - }else if(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT == eventType){ + } else if (SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT.equals(eventType)) { //离岗事件处理 caseInfo1 = hikService.demobilizedHandle(event, caseInfo1); - }else if(SecurityEventType.PERSONNEL_GATHER_EVENT == eventType){ + } else if (SecurityEventType.PERSONNEL_GATHER_EVENT.equals(eventType)) { //人员聚集事件处理 caseInfo1 = hikService.personGatherHandle(event, caseInfo1); - }else if(SecurityEventType.MONITORING_POINT_OFFLINE == eventType){ + } else if (SecurityEventType.MONITORING_POINT_OFFLINE.equals(eventType)) { //监控点离线事件处理 caseInfo1 = hikService.monitorPointOfflineHandle(event, caseInfo1); - }else if(SecurityEventType.DEVICE_OFFLINE == eventType){ + } else if (SecurityEventType.MONITORING_POINT_ONLINE.equals(eventType)) { + //监控点上线事件处理 + hikService.monitorPointOnlineHandle(event); + } else if (SecurityEventType.DEVICE_OFFLINE.equals(eventType)) { //装置离线事件处理 caseInfo1 = hikService.deviceOfflineHandle(event, caseInfo1); - }else if(SecurityEventType.VISITOR_REGISTER == eventType){ + } else if (SecurityEventType.DEVICE_ONLINE.equals(eventType)) { + //装置上线处理 + hikService.deviceOnlineHandle(event); + } else if (SecurityEventType.VISITOR_REGISTER.equals(eventType)) { //记录访客登记记录,添加到访客记录表 hikService.visitorRegisterHandler(event); - }else if(SecurityEventType.VISITOR_CHECKOUT == eventType){ + } else if (SecurityEventType.VISITOR_CHECKOUT.equals(eventType)) { //记录访客签离记录 hikService.visitorCheckOutHandler(event); } - if(!Objects.isNull(caseInfo1) && !StringUtils.isEmpty(caseInfo1.getHappenTime())){ + if (!Objects.isNull(caseInfo1) && !StringUtils.isEmpty(caseInfo1.getHappenTime())) { caseInfos.add(caseInfo1); } } //3、安防事件入库 - if(!caseInfoService.insertCaseInfoBatch(caseInfos)){ - log.error("安防事件批量入库异常"); + if (!CollectionUtils.isEmpty(caseInfos) && !caseInfoService.insertCaseInfoBatch(caseInfos)) { + log.error("安防事件批量入库异常!"); } // TODO: 2022/8/15 webSocket推送 + if (CollectionUtils.isEmpty(caseInfos)) { + log.info("webSocket事件推送"); + webSocket.sendAllMessage(JSONObject.toJSONString(caseInfos)); + } return; } /** + * 以图搜图,前端用于轨迹追踪 + */ + @PostMapping("/hik/search/picture") + @ResponseBody + public Object searchPictures(@RequestBody SearchPicturesRequest searchPicturesRequest) { + DateTime startDateTime = DateUtil.parse(searchPicturesRequest.getStartTime()); + DateTime endDateTime = DateUtil.parse(searchPicturesRequest.getEndTime()); + String startTime = DateUtil.format(startDateTime, "yyyy-MM-dd'T'HH:mm:ss.SSSXXX"); + String endTime = DateUtil.format(endDateTime, "yyyy-MM-dd'T'HH:mm:ss.SSSXXX"); + searchPicturesRequest.setStartTime(startTime); + searchPicturesRequest.setEndTime(endTime); + String body = JSONObject.toJSONString(searchPicturesRequest); + String resultStr = HikUtil.hikApi(HikUri.SEARCH_PICTURES, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (!"0".equals(resultJson.get("code"))) { + log.error("请求海康,以图搜图失败,海康response:{}", resultStr); + return ResponseData.error("以图搜图失败"); + } + return ResponseData.success(resultJson); + } + + + /** + * 海康事件取消订阅 + */ + @PostMapping("/hik/event/cancel") + @ResponseBody + public Object eventCancelSubscribe(@RequestBody CancelSubscribeRequest cancelSubscribeRequest) { + String body = JSONObject.toJSONString(cancelSubscribeRequest); + String resultStr = HikUtil.hikApi(HikUri.EVENT_CANCEL, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (!"0".equals(resultJson.get("code"))) { + log.error("请求海康,取消订阅失败,海康response:{}", resultStr); + return ResponseData.error("取消订阅失败"); + } + return ResponseData.success(resultJson); + } + + /** * 单个添加海康人脸分组 * api->hik单个添加人脸分组api->response->mysql */ - @PostMapping("/faceGroup/single/add") + @PostMapping("/hik/faceGroup/single/add") @ResponseBody public Object faceGroupAddition(@RequestBody FaceGroupAdditionRequest faceGroupAdditionRequest) { String body = JSONObject.toJSONString(faceGroupAdditionRequest); @@ -212,7 +282,7 @@ * 批量添加海康组织 * api->hik批量添加组织api->response */ - @PostMapping("/org/batch/add") + @PostMapping("/hik/org/batch/add") @ResponseBody public Object orgBatchAdd(@RequestBody List orgBatchAddRequest) { String body = JSONObject.toJSONString(orgBatchAddRequest); @@ -232,4 +302,62 @@ return ResponseData.error("批量添加组织失败"); } + /** + * 获取人员列表 + */ + @PostMapping("/hik/person/personList") + @ResponseBody + public Object personList() { + PersonListRequest request = new PersonListRequest(); + request.setPageNo(1); + request.setPageSize(100); + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi("/api/resource/v2/person/personList", body); + return resultStr; + } + + /** + * 获取组织列表 + */ + @PostMapping("/hik/org/orgList") + @ResponseBody + public Object orgList() { + PersonListRequest request = new PersonListRequest(); + request.setPageNo(1); + request.setPageSize(100); + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi("/api/resource/v1/org/orgList", body); + return resultStr; + } + + /** + * 查询访客权限下载记录 + */ + @PostMapping("/hik/auth/result") + @ResponseBody + public Object authResult() { + PersonListRequest request = new PersonListRequest(); + request.setPageNo(1); + request.setPageSize(100); + request.setOrderId("ba101db6246711edaea66f7939a13638"); + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi("/api/visitor/v1/auth/result", body); + return resultStr; + } + + /** + * 人脸图片获取 + */ + @PostMapping("/hik/face/picture") + @ResponseBody + public Object facePicture() { + FaceRequest request = new FaceRequest(); +// List list = new ArrayList<>(); +// list.add(""); + request.setCertificateNum("wanggong"); + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi("/api/frs/v1/face", body); + return resultStr; + } + } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/AssetInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/AssetInfoMapper.java index 4f64e83..c0684ee 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/AssetInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/AssetInfoMapper.java @@ -17,6 +17,6 @@ @Mapper public interface AssetInfoMapper extends BaseMapper { - List getAssetInfoListPage(@Param("page") Page page, AssetInfoRequest assetInfoRequest); + List getAssetInfoListPage(@Param("page") Page page, @Param("assetInfoRequest") AssetInfoRequest assetInfoRequest); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/AttendanceInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/AttendanceInfoMapper.java index f9e793e..ec87e46 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/AttendanceInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/AttendanceInfoMapper.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.statistics.AttendanceNumberDTO; import com.casic.missiles.modular.dto.statistics.AttendanceRatioDTO; import com.casic.missiles.modular.model.AttendanceInfo; import org.apache.ibatis.annotations.Mapper; @@ -17,7 +18,7 @@ */ @Mapper public interface AttendanceInfoMapper extends BaseMapper { - List getAttendanceInfoListPage(@Param("page") Page page, StaffInfoRequest attendanceInfoRequest); + List getAttendanceInfoListPage(@Param("page") Page page, @Param("attendanceInfoRequest") StaffInfoRequest attendanceInfoRequest); AttendanceInfo selectByCodeAndDate(@Param("staffCode") String staffCode); @@ -26,4 +27,8 @@ List getCountByTypeAndDateForMonth(@Param("staffType")String staffType); List getCountByTypeAndDateForYear(@Param("staffType")String staffType); + + List getCountForWeek(); + + List getCountForDay(); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java index ce94b8f..6137a7d 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java @@ -17,5 +17,5 @@ @Mapper public interface BlackInfoMapper extends BaseMapper { - List getBlackInfoListPage(@Param("page") Page page, BlackInfoRequest blackInfoRequest); + List getBlackInfoListPage(@Param("page") Page page, @Param("blackInfoRequest") BlackInfoRequest blackInfoRequest); } 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 efda6b3..50aaa6f 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 @@ -20,7 +20,7 @@ List getCaseInfoListPage(@Param("page") Page page, @Param("caseInfoRequest") CaseInfoRequest caseInfoRequest); - int updateStatusById(CaseInfoRequest caseInfoRequest); + int updateStatusById(@Param("caseInfoRequest") CaseInfoRequest caseInfoRequest); List selectByLevelAndMonth(@Param("year") String year); @@ -47,4 +47,20 @@ List selectPreWeekCountByThirtyDay(); List selectPreDayCountBySevenDay(); + + Integer selectDemobilizedCount(@Param("eventType") Number personnelDemobilizedEvent); + + List selectPreMonthCount(); + + List selectListBySevenDay(); + + List selectListByToday(); + + List selectListByToday2(); + + List selectListByToday3(); + + List selectListByType(@Param("eventType") Number eventType); + + List selectDemobilizedCountByHour(@Param("eventType") Number eventType); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/CategoryLevelMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/CategoryLevelMapper.java index 52fc714..afe1650 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/CategoryLevelMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/CategoryLevelMapper.java @@ -17,9 +17,9 @@ @Mapper public interface CategoryLevelMapper extends BaseMapper { - List getCaseCategoryLevelListPage(@Param("page") Page page, CategoryLevelRequest categoryLevelRequest); + List getCaseCategoryLevelListPage(@Param("page") Page page, @Param("categoryLevelRequest") CategoryLevelRequest categoryLevelRequest); - List getCaseCategoryLevelList(CategoryLevelRequest categoryLevelRequest); + List getCaseCategoryLevelList(@Param("categoryLevelRequest") CategoryLevelRequest categoryLevelRequest); CaseCategoryLevel getCaseCategoryLevel(@Param("categoryLevelCode") String categoryLevelCode); 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 66353b1..2555a09 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 @@ -19,7 +19,7 @@ @Mapper public interface DeviceInfoMapper extends BaseMapper { - List getDeviceInfoListPage(@Param("page") Page page, DeviceInfoRequest deviceInfoRequest); + List getDeviceInfoListPage(@Param("page") Page page, @Param("deviceInfoRequest") DeviceInfoRequest deviceInfoRequest); List getDeviceInfoList(@Param("deviceInfoRequest") DeviceInfoRequest deviceInfoRequest); @@ -27,6 +27,8 @@ DeviceInfo getByIndexCode(@Param("srcIndex") String srcIndex); + DeviceInfo getByIp(@Param("ip") String ip); + List selectIndexCodesByCodes(@Param("deviceCodes") List deviceCodes); List selectByType(@Param("devType") String devType); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java index 41dd0af..5bfaf63 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java @@ -5,6 +5,7 @@ import com.casic.missiles.modular.dto.DeviceRepairRequest; import com.casic.missiles.modular.model.DeviceRepairLog; import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; import java.util.List; @@ -16,7 +17,7 @@ @Mapper public interface DeviceRepairLogMapper extends BaseMapper { - List getDeviceRepairListPage(Page page, DeviceRepairRequest deviceRepairRequest); + List getDeviceRepairListPage(@Param("page") Page page, @Param("deviceRepairRequest")DeviceRepairRequest deviceRepairRequest); - List getDeviceRepairList(DeviceRepairRequest deviceRepairRequest); + List getDeviceRepairList(@Param("deviceRepairRequest") DeviceRepairRequest deviceRepairRequest); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java index 9035c47..4823ac1 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java @@ -18,7 +18,7 @@ @Mapper public interface FireEquipInfoMapper extends BaseMapper { - List getFireEquipInfoListPage(@Param("page") Page page, FireEquipRequest fireEquipRequest); + List getFireEquipInfoListPage(@Param("page") Page page, @Param("fireEquipRequest") FireEquipRequest fireEquipRequest); FireEquipInfo getFireEquipInfo(@Param("equipCode") String equipCode); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/GateGroupMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/GateGroupMapper.java index d8c330d..977a427 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/GateGroupMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/GateGroupMapper.java @@ -17,7 +17,7 @@ */ @Mapper public interface GateGroupMapper extends BaseMapper { - List getGateGroupListPage(@Param("page") Page page, GateGroupRequest gateGroupRequest); + List getGateGroupListPage(@Param("page") Page page, @Param("gateGroupRequest") GateGroupRequest gateGroupRequest); GateGroup getGateGroupByName(@Param("groupName") String groupName); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/HazardLevelMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/HazardLevelMapper.java index 8957780..dcf47bb 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/HazardLevelMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/HazardLevelMapper.java @@ -17,11 +17,13 @@ @Mapper public interface HazardLevelMapper extends BaseMapper { - List getCaseHazardLevelListPage(@Param("page") Page page, HazardLevelRequest hazardLevelRequest); + List getCaseHazardLevelListPage(@Param("page") Page page, @Param("hazardLevelRequest") HazardLevelRequest hazardLevelRequest); - List getCaseHazardLevelList(HazardLevelRequest hazardLevelRequest); + List getCaseHazardLevelList(@Param("hazardLevelRequest") HazardLevelRequest hazardLevelRequest); CaseHazardLevel getCaseHazardLevel(@Param("hazardLevelCode") String hazardLevelCode); List selectHazardName(); + + String selectHazardNameByCode(@Param("hazardLevelCode") String hazardLevelCode); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/HikCaseDefineMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/HikCaseDefineMapper.java index 0dc47d1..f162fef 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/HikCaseDefineMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/HikCaseDefineMapper.java @@ -12,5 +12,5 @@ */ @Mapper public interface HikCaseDefineMapper extends BaseMapper { - HikCaseDefine getHikCaseDefine(@Param("caseTypeCode") Long caseTypeCode); + HikCaseDefine getHikCaseDefine(@Param("caseTypeCode") Number caseTypeCode); } 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 f8a674c..fe5afc2 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 @@ -17,11 +17,13 @@ @Mapper public interface StaffInfoMapper extends BaseMapper { - List getStaffInfoListPage(@Param("page") Page page, StaffInfoRequest staffInfoRequest); + List getStaffInfoListPage(@Param("page") Page page, @Param("staffInfoRequest") StaffInfoRequest staffInfoRequest); StaffInfo selectByCode(@Param("staffCode") String staffCode); - List getStaffInfoList(StaffInfoRequest staffInfoRequest); + List getStaffInfoList(@Param("staffInfoRequest") StaffInfoRequest staffInfoRequest); - List selectBatchCodes(List list); + List selectBatchCodes(@Param("list") List list); + + int updateByCodeForCard(@Param("staffCode") String staffCode, @Param("cardNo") String cardNo); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitInfoMapper.java index b1217c5..6c52542 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitInfoMapper.java @@ -16,7 +16,7 @@ */ @Mapper public interface VisitInfoMapper extends BaseMapper { - List getVisitInfoListPage(@Param("page") Page page, VisitorRequest visitorRequest); + List getVisitInfoListPage(@Param("page") Page page, @Param("visitorRequest") VisitorRequest visitorRequest); VisitInfo selectByOrderId(@Param("orderId") String orderId); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitorApplyMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitorApplyMapper.java index c09f3c0..6ea55bd 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitorApplyMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitorApplyMapper.java @@ -18,7 +18,7 @@ @Mapper public interface VisitorApplyMapper extends BaseMapper { - List getVisitorApplyListPage(@Param("page") Page page, VisitorApplyRequest visitorApplyRequest); + List getVisitorApplyListPage(@Param("page") Page page, @Param("visitorApplyRequest") VisitorApplyRequest visitorApplyRequest); List selectByVisitReason(); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/AttendanceInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/AttendanceInfoMapper.xml index b2ece71..f8bdd6e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/AttendanceInfoMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/AttendanceInfoMapper.xml @@ -43,7 +43,8 @@ and staff_type = #{staffType} - and YEARWEEK(date_format(atte_date, '%Y-%m-%d'), 1) = YEARWEEK(now(),1); + AND DATE_SUB(CURDATE(), INTERVAL 7 DAY) <= DATE(atte_date) + GROUP BY DATE_FORMAT(atte_date, '%Y-%m-%d') @@ -69,4 +70,20 @@ GROUP BY DATE_FORMAT(atte_date, '%Y-%m') + + + \ No newline at end of file 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 2b6953f..06ec0a8 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 @@ -28,7 +28,9 @@ @@ -87,7 +89,8 @@ SELECT hazard_level_code as levelCode, count(id) as quantity FROM bus_case_info WHERE hazard_level_code is not null - AND DATE_SUB(CURDATE(), INTERVAL 7 DAY) <= date(happen_time); + AND is_key_area = 1 + AND DATE_SUB(CURDATE(), INTERVAL 7 DAY) <= date(happen_time) GROUP BY hazard_level_code @@ -95,7 +98,8 @@ SELECT hazard_level_code as levelCode, count(id) as quantity FROM bus_case_info WHERE hazard_level_code is not null - AND DATE_SUB(CURDATE(), INTERVAL 30 DAY) <= date(happen_time); + AND is_key_area = 1 + AND DATE_SUB(CURDATE(), INTERVAL 30 DAY) <= date(happen_time) GROUP BY hazard_level_code @@ -122,4 +126,71 @@ AND hazard_level_code is not null GROUP BY DATE_FORMAT(happen_time,'%Y-%m-%d') + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/CategoryLevelMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/CategoryLevelMapper.xml index 4670b1f..1d25cbd 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/CategoryLevelMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/CategoryLevelMapper.xml @@ -20,11 +20,11 @@ SELECT * FROM bus_case_category_level WHERE 1=1 - - and code = #{code} + + and code = #{categoryLevelRequest.code} - - and name = #{name} + + and name = #{categoryLevelRequest.name} ORDER by create_time DESC 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 9b66fd8..bfd84b7 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 @@ -98,4 +98,10 @@ #{item} + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceRepairLogMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceRepairLogMapper.xml index 078ed3c..cf1a481 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceRepairLogMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceRepairLogMapper.xml @@ -22,14 +22,14 @@ SELECT * FROM bus_device_repair_log WHERE 1=1 - - and device_code = #{devCode} + + and device_code = #{deviceRepairRequest.devCode} - - and device_name = #{devName} + + and device_name = #{deviceRepairRequest.devName} - - and DATE_FORMAT(create_time,"%y%m%d") = DATE_FORMAT(#{createTime},"%y%m%d") + + and DATE_FORMAT(create_time,"%y%m%d") = DATE_FORMAT(#{deviceRepairRequest.createTime},"%y%m%d") ORDER by create_time DESC diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/HazardLevelMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/HazardLevelMapper.xml index f16f2b9..458322b 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/HazardLevelMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/HazardLevelMapper.xml @@ -20,11 +20,11 @@ SELECT * FROM bus_case_hazard_level WHERE 1=1 - - and code = #{code} + + and code = #{hazardLevelRequest.code} - - and name = #{name} + + and name = #{hazardLevelRequest.name} ORDER by create_time DESC @@ -42,4 +42,10 @@ SELECT name FROM bus_case_hazard_level + + \ 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 557237e..b6a183a 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 @@ -50,4 +50,10 @@ + + + UPDATE bus_staff_info + SET card_no = #{cardNo} + WHERE staff_code = #{staffCode} + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitInfoMapper.xml index 84aa84f..230529a 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitInfoMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitInfoMapper.xml @@ -27,5 +27,6 @@ SELECT * FROM bus_visit_info WHERE order_id = #{orderId} and DATE_FORMAT(in_time,'%Y-%m-%d') = CURRENT_DATE + limit 1 \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/BlackPictureRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/BlackPictureRequest.java new file mode 100644 index 0000000..fc92701 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/BlackPictureRequest.java @@ -0,0 +1,14 @@ +package com.casic.missiles.modular.dto; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/29 19:26 + */ +@Data +public class BlackPictureRequest { + private String picUri; + private String serverIndexCode; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/CancelSubscribeRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/CancelSubscribeRequest.java new file mode 100644 index 0000000..e2d390a --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/CancelSubscribeRequest.java @@ -0,0 +1,15 @@ +package com.casic.missiles.modular.dto.hik; + +import lombok.Data; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/24 15:14 + */ +@Data +public class CancelSubscribeRequest { + private List eventTypes; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/CardInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/CardInfo.java new file mode 100644 index 0000000..341457d --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/CardInfo.java @@ -0,0 +1,24 @@ +package com.casic.missiles.modular.dto.hik; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/26 16:08 + */ +@Data +public class CardInfo { + //卡号,8~20个字符,支持数字和大写字母 + private String cardNo; + //人员ID,员工工号 + private String personId; + //人员所属组织IndexCode + private String orgIndexCode; + //卡片类型,默认是1:IC卡 + //1:IC卡 + //2:CPU卡 + //3:远距离卡 + //4:MIFARE卡 + private Number cardType; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/FaceRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/FaceRequest.java new file mode 100644 index 0000000..edc04bf --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/FaceRequest.java @@ -0,0 +1,16 @@ +package com.casic.missiles.modular.dto.hik; + +import lombok.Data; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/25 16:53 + */ +@Data +public class FaceRequest { + private String certificateNum; + private List indexCodes; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/HikRecvEvent.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/HikRecvEvent.java index a3e9845..1b2b2b1 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/HikRecvEvent.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/HikRecvEvent.java @@ -28,12 +28,12 @@ /** * 事件类型,用于判断所需接收到的事件类型 */ - public Long getEventType(){ + public Number getEventType(){ JSONObject jsonObject = (JSONObject)JSONObject.toJSON(params); //事件类别对应SecurityEventTypeEnum JSONArray eventTypeArray = (JSONArray)jsonObject.get("events"); JSONObject eventJsonObject = (JSONObject)JSONObject.toJSON(eventTypeArray.get(0)); - Long eventType = (Long) eventJsonObject.get("eventType"); + Number eventType = (Number) eventJsonObject.get("eventType"); return eventType; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonBatchDeleteRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonBatchDeleteRequest.java index 027d31d..9751929 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonBatchDeleteRequest.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonBatchDeleteRequest.java @@ -12,4 +12,6 @@ @Data public class PersonBatchDeleteRequest { private List personIds; + //删除人脸接口使用 + private String faceId; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonInfoRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonInfoRequest.java new file mode 100644 index 0000000..05dc9e1 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonInfoRequest.java @@ -0,0 +1,20 @@ +package com.casic.missiles.modular.dto.hik; + +import lombok.Data; + +import java.util.List; + +/** + * @Description: 获取员工照片请求实体 + * @Author: wangpeng + * @Date: 2022/8/25 16:53 + */ +@Data +public class PersonInfoRequest { + //获取员工详细信息使用 + private String paramName; + private List paramValue; + //获取照片使用 + private String picUri; + private String serverIndexCode; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonListRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonListRequest.java new file mode 100644 index 0000000..3f7149b --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonListRequest.java @@ -0,0 +1,16 @@ +package com.casic.missiles.modular.dto.hik; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/25 16:53 + */ +@Data +public class PersonListRequest { + private Number pageNo; + private Number pageSize; + + private String orderId; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/SearchPicturesRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/SearchPicturesRequest.java new file mode 100644 index 0000000..0a95966 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/SearchPicturesRequest.java @@ -0,0 +1,24 @@ +package com.casic.missiles.modular.dto.hik; + +import lombok.Data; + +import java.util.List; + +/** + * @Description: 以图搜图请求 + * @Author: wangpeng + * @Date: 2022/8/29 10:46 + */ +@Data +public class SearchPicturesRequest { + private String facePicBinaryData; + private String facePicUrl; + private List cameraIndexCodes; + private String startTime; + private String endTime; + //指定搜图的最小相似度,最小为1,最大为100 + private String minSimilarity; + private Number age; + //male-男性,female-女性 + private String sex; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/StaffCardRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/StaffCardRequest.java new file mode 100644 index 0000000..4052e6d --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/StaffCardRequest.java @@ -0,0 +1,20 @@ +package com.casic.missiles.modular.dto.hik; + +import lombok.Data; + +import java.util.List; + +/** + * @Description: 人员开卡请求实体 + * @Author: wangpeng + * @Date: 2022/8/26 16:05 + */ +@Data +public class StaffCardRequest { + //卡片开始有效时间,时间格式:yyyy-MM-dd + private String startDate; + //卡片截止有效时间,时间格式:yyyy-MM-dd,不能大于2037年12月31日 + private String endDate; + //cardList,待开卡列表,最大支持50张卡 + private List cardList; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/VisitorInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/VisitorInfo.java index 73aa316..b99f301 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/VisitorInfo.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/VisitorInfo.java @@ -14,7 +14,7 @@ //访客性别 //1: 男 //2: 女 - private String gender; + private Integer gender; //联系电话建议填写手机号码 private String phoneNo; //证件类型 diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/ApplyReasonGroupDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/ApplyReasonGroupDTO.java index 514f382..786143e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/ApplyReasonGroupDTO.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/ApplyReasonGroupDTO.java @@ -13,4 +13,6 @@ private String visitReason; //访问人数 private Integer quantity; + //占比 + private String ratio; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/AttendanceNumberDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/AttendanceNumberDTO.java new file mode 100644 index 0000000..a494321 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/AttendanceNumberDTO.java @@ -0,0 +1,24 @@ +package com.casic.missiles.modular.dto.statistics; + +import com.fasterxml.jackson.annotation.JsonIgnore; +import lombok.Data; + +/** + * @Description: 出勤人数统计实体 + * @Author: wangpeng + * @Date: 2022/8/31 19:24 + */ +@Data +public class AttendanceNumberDTO { + //日期维度,周、今日,入参 + @JsonIgnore + private String dateDimension; + + //日期,具体天/小时,出参 + private String date; + //出勤人数 + private String quantity; + //员工类型 + private String staffType; + +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/AvgMonthAndWeekGroupDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/AvgMonthAndWeekGroupDTO.java index 4366916..331a9a9 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/AvgMonthAndWeekGroupDTO.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/AvgMonthAndWeekGroupDTO.java @@ -2,8 +2,6 @@ import lombok.Data; -import java.util.Map; - /** * @Description: 平均每月和每周的数据实体 * @Author: wangpeng @@ -13,6 +11,4 @@ public class AvgMonthAndWeekGroupDTO { //入参 private String year; - //出参,key:事件类型,value:周和月数据平均值 - private Map map; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/GateStatusGroupResponse.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/GateStatusGroupResponse.java new file mode 100644 index 0000000..d16f4e5 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/GateStatusGroupResponse.java @@ -0,0 +1,16 @@ +package com.casic.missiles.modular.dto.statistics; + +import lombok.Data; + +/** + * @Description: 闸机/摄像机统计响应实体 + * @Author: wangpeng + * @Date: 2022/8/30 14:22 + */ +@Data +public class GateStatusGroupResponse { + //设备状态 + private String status; + //占比 + private String ratio; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/MonthAndWeekDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/MonthAndWeekDTO.java index 7482b2a..284115a 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/MonthAndWeekDTO.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/MonthAndWeekDTO.java @@ -9,7 +9,7 @@ */ @Data public class MonthAndWeekDTO { -// private String levelName; + private String levelName; private Integer monthQuantity; private Integer weekQuantity; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/OnDutyRatioDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/OnDutyRatioDTO.java new file mode 100644 index 0000000..4f6a65d --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/OnDutyRatioDTO.java @@ -0,0 +1,15 @@ +package com.casic.missiles.modular.dto.statistics; + +import lombok.Data; + +/** + * @Description: 在岗率统计实体 + * @Author: wangpeng + * @Date: 2022/9/2 21:24 + */ +@Data +public class OnDutyRatioDTO { + private String date; + private String quantity; + private String ratio; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/SecurityLevelAssessDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/SecurityLevelAssessDTO.java new file mode 100644 index 0000000..40a0738 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/SecurityLevelAssessDTO.java @@ -0,0 +1,15 @@ +package com.casic.missiles.modular.dto.statistics; + +import lombok.Data; + +/** + * @Description: 出勤人数统计实体 + * @Author: wangpeng + * @Date: 2022/8/31 19:24 + */ +@Data +public class SecurityLevelAssessDTO { + private String date; + private String quantity; + private Double score; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/SecurityScoreDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/SecurityScoreDTO.java index 304d169..f7bd4a2 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/SecurityScoreDTO.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/SecurityScoreDTO.java @@ -14,5 +14,5 @@ //楼层,出参 private String area; //评分,出参 - private String score; + private Double score; } 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 6a30786..e5e613d 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 @@ -8,6 +8,10 @@ public interface HikUri { //事件订阅 String EVENT_SUBSCRIBE = "/api/eventService/v1/eventSubscriptionByEventTypes"; + //事件订阅信息查询 + String EVENT_INFO = "/api/eventService/v1/eventSubscriptionView"; + //事件订阅取消 + String EVENT_CANCEL = "/api/eventService/v1/eventUnSubscriptionByEventTypes"; //预约免登记 String APPOINTMENT_FREE_REGISTER = "/api/visitor/v1/appointment/registration"; //修改访客预约 @@ -32,8 +36,18 @@ String PERSON_SINGLE_UPDATE = "/api/resource/v1/person/single/update"; //批量删除人员 String PERSON_BATCH_DELETE = "/api/resource/v1/person/batch/delete"; + //根据人脸Id删除人脸 + String PERSON_SINGLE_DELETE = "/api/resource/v1/face/single/delete"; //门禁点反控 String DOOR_CONTROL = "/api/acs/v1/door/doControl"; //查询海康门禁点事件v2 String DOOR_EVENTS = "/api/acs/v2/door/events"; + //批量开卡 + String CARD_BINDING = "/api/cis/v1/card/binding"; + //提取人员照片 + String PERSON_PICTURE = "/api/resource/v1/person/picture"; + //根据人员唯一字段获取人员详细信息 + String PERSON_INFO = "/api/resource/v1/person/condition/personInfo"; + //以图搜图 + String SEARCH_PICTURES = "/api/frs/v1/application/captureSearch"; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/enums/SecurityEventType.java b/casic-server/src/main/java/com/casic/missiles/modular/enums/SecurityEventType.java index d51034c..42eacf8 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/enums/SecurityEventType.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/enums/SecurityEventType.java @@ -14,18 +14,27 @@ Number PERSONNEL_GATHER_EVENT = 131593; //监控点离线事件 Number MONITORING_POINT_OFFLINE = 889196545; + //监控点上线事件 + Number MONITORING_POINT_ONLINE = 889196546; //装置离线 Number DEVICE_OFFLINE = 199710; + //装置连线 + Number DEVICE_ONLINE = 199711; //访客登记 Number VISITOR_REGISTER = 1392513025; //访客签离 Number VISITOR_CHECKOUT = 1392513026; + //高空抛物 + Number HIGH_ALTITUDE_PARABOLIC = 930335; + //下面两个查询海康门禁点事件使用 //合法卡比对通过 Number CARD_COMPARE_PASS = 198914; //人脸认证通过 Number FACE_COMPARE_PASS = 196893; + + // //正常开门 // Number NORMAL_OPENING = 198913; // //按钮开门 @@ -46,7 +55,6 @@ // Number FIREWORKS_DETECTION = 192514; // //陌生人识别事件 // Number STRANGER_RECOGNITION = 1644171265; -// //高空抛物 -// Number HIGH_ALTITUDE_PARABOLIC = 930335; + } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/job/CockpitJob.java b/casic-server/src/main/java/com/casic/missiles/modular/job/CockpitJob.java index 7490a27..85dd016 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/job/CockpitJob.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/job/CockpitJob.java @@ -79,14 +79,6 @@ } }); } - } - /** - * 机动力量实时在岗率,在岗人数除以总应在岗人数,功能待定 - */ -// @Scheduled(cron = "0 0/1 * * * ?") - public void BeOnDutyRatio() { - - } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/service/HikCaseDefineService.java b/casic-server/src/main/java/com/casic/missiles/modular/service/HikCaseDefineService.java index d9bb3a9..18e2936 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/service/HikCaseDefineService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/service/HikCaseDefineService.java @@ -9,5 +9,5 @@ * @Date: 2022/7/21 17:20 */ public interface HikCaseDefineService extends IService { - HikCaseDefine getHikCaseDefine(Long caseTypeCode); + HikCaseDefine getHikCaseDefine(Number caseTypeCode); } 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 dd24101..bcc3b5d 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 @@ -18,6 +18,8 @@ CaseInfo monitorPointOfflineHandle(JSONObject event, CaseInfo caseInfo); + void monitorPointOnlineHandle(JSONObject event); + CaseInfo deviceOfflineHandle(JSONObject event, CaseInfo caseInfo); void propertyAttendanceHandle(JSONObject event); @@ -27,4 +29,6 @@ void visitorRegisterHandler(JSONObject event); void visitorCheckOutHandler(JSONObject event); + + void deviceOnlineHandle(JSONObject event); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/BlackListController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/BlackListController.java index a27f9f8..0c06661 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/BlackListController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/BlackListController.java @@ -1,13 +1,18 @@ package com.casic.missiles.modular.controller; +import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.base.controller.ExportController; import com.casic.missiles.core.page.PageFactory; import com.casic.missiles.model.response.ResponseData; import com.casic.missiles.modular.dto.BlackInfoRequest; +import com.casic.missiles.modular.dto.BlackPictureRequest; +import com.casic.missiles.modular.dto.hik.PersonInfoRequest; +import com.casic.missiles.modular.enums.HikUri; import com.casic.missiles.modular.enums.OperateTypeEnum; import com.casic.missiles.modular.model.BlackInfo; import com.casic.missiles.modular.service.BlackInfoService; +import com.casic.missiles.modular.util.HikUtil; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; @@ -56,4 +61,22 @@ return null; } + /** + * 黑名单人员照片 + */ + @PostMapping("/personPicture") + @ResponseBody + public Object personPicture(@RequestBody BlackPictureRequest blackPictureRequest){ + //获取照片 + String picUri = blackPictureRequest.getPicUri(); + String serverIndexCode = blackPictureRequest.getServerIndexCode(); + PersonInfoRequest picRequest = new PersonInfoRequest(); + picRequest.setPicUri(picUri); + picRequest.setServerIndexCode(serverIndexCode); + String reBody = JSONObject.toJSONString(picRequest); + //重定向地址获取 + String url = HikUtil.hikApiFor302(HikUri.PERSON_PICTURE, reBody); + return ResponseData.success(url); + } + } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/DeviceController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/DeviceController.java index e1c4eba..666bbee 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/DeviceController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/DeviceController.java @@ -107,7 +107,7 @@ } /** - * 设备维修管理查询(分页),需计算MTTR=总维修时间/故障次数 + * 设备状态计算与评判/设备维修管理查询(分页),需计算MTTR=总维修时间/故障次数 */ @PostMapping("/repair/listPage") @ResponseBody @@ -211,7 +211,7 @@ //需根据设备编号获取到对应的门禁点唯一标识 doorControlRequest.setDoorIndexCodes(indexCodes); doorControlRequest.setControlType(Integer.valueOf(gateGroupDTO.getStatus())); - String body = JSONObject.toJSONString(deviceCodes); + String body = JSONObject.toJSONString(doorControlRequest); String resultStr = HikUtil.hikApi(HikUri.DOOR_CONTROL, body); JSONObject resultJson = (JSONObject)JSONObject.parse(resultStr); if (!"0".equals(resultJson.get("code"))) { diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/StaffController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/StaffController.java index b58ccab..704093c 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/StaffController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/StaffController.java @@ -2,15 +2,21 @@ import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.util.StrUtil; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.base.controller.ExportController; import com.casic.missiles.core.page.PageFactory; import com.casic.missiles.model.response.ErrorResponseData; import com.casic.missiles.model.response.ResponseData; import com.casic.missiles.modular.dto.StaffInfoRequest; +import com.casic.missiles.modular.dto.hik.PersonInfoRequest; +import com.casic.missiles.modular.dto.hik.StaffCardRequest; +import com.casic.missiles.modular.enums.HikUri; import com.casic.missiles.modular.enums.OperateTypeEnum; import com.casic.missiles.modular.model.StaffInfo; import com.casic.missiles.modular.service.StaffInfoService; +import com.casic.missiles.modular.util.HikUtil; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; @@ -110,4 +116,60 @@ } return ResponseData.success(); } + + /** + * 批量开卡,添加人员之后调用,若在一个接口中添加人员成功开卡失败则第二次添加时会有问题 + */ + @PostMapping("/cardBinding") + @ResponseBody + public Object cardBinding(@RequestBody StaffCardRequest staffCardRequest) { + String body = JSONObject.toJSONString(staffCardRequest); + String resultStr = HikUtil.hikApi(HikUri.CARD_BINDING, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (!"0".equals(resultJson.get("code"))) { + log.error("请求海康,批量开卡失败,海康response:{}", resultStr); + return ResponseData.error("批量开卡失败"); + } + //保存卡号 + if(staffInfoService.saveCardInfo(staffCardRequest) > 0){ + return ResponseData.success(); + } + return ResponseData.error("批量开卡失败"); + } + + /** + * 获取员工照片,海康存储 + */ + @PostMapping("/personPicture/{staffCode}") + @ResponseBody + public Object personPicture(@PathVariable("staffCode") String staffCode){ + //获取员工详细信息,含图片服务器、uri + PersonInfoRequest request = new PersonInfoRequest(); + List list = new ArrayList<>(); + list.add(staffCode); + request.setParamName("personId"); + request.setParamValue(list); + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi(HikUri.PERSON_INFO, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (!"0".equals(resultJson.get("code"))) { + log.error("请求海康,根据人员唯一字段获取人员详细信息失败,海康response:{}", resultStr); + return ResponseData.error("获取员工照片失败"); + } + //获取照片 + JSONObject data = (JSONObject) resultJson.get("data"); + JSONArray dataArray = (JSONArray) data.get("list"); + JSONObject jsonObject = (JSONObject) dataArray.get(0); + JSONArray personPhoto = (JSONArray) jsonObject.get("personPhoto"); + JSONObject photo = (JSONObject) personPhoto.get(0); + String picUri = photo.getString("picUri"); + String serverIndexCode = photo.getString("serverIndexCode"); + PersonInfoRequest picRequest = new PersonInfoRequest(); + picRequest.setPicUri(picUri); + picRequest.setServerIndexCode(serverIndexCode); + String reBody = JSONObject.toJSONString(picRequest); + //重定向地址获取 + String url = HikUtil.hikApiFor302(HikUri.PERSON_PICTURE, reBody); + return ResponseData.success(url); + } } 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 4a07dd9..7b1dcf6 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 @@ -16,6 +16,7 @@ import com.casic.missiles.modular.redis.key.CacheKeys; import com.casic.missiles.modular.service.CockpitService; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.util.CollectionUtils; import org.springframework.web.bind.annotation.*; @@ -24,10 +25,7 @@ import java.text.NumberFormat; import java.time.LocalDateTime; import java.time.temporal.ChronoUnit; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.util.*; import java.util.stream.Collectors; /** @@ -73,6 +71,9 @@ private StatisticNumberMapper numberMapper; @Autowired + private HazardLevelMapper hazardLevelMapper; + + @Autowired private AccessGroupConfig accessGroupConfig; /** @@ -104,8 +105,24 @@ public Object buildingNumberPerHour(){ //当天按小时分组的人数 List list = numberMapper.selectListByTime(); - Map> collect = list.stream().collect(Collectors.groupingBy(BuildingNumberDTO::getStatisticPosition)); - return ResponseData.success(collect); + Map> collect = list.stream().collect(Collectors.groupingBy(BuildingNumberDTO::getStatisticTime)); + //定时任务中已将每小时三栋楼人数存到数据库 + //将一期主楼和录制楼人数合并,二期单算 + List> resultList = new ArrayList<>(); + collect.keySet().forEach(key -> { + List buildingNumberDTOS = collect.get(key); + BuildingNumberDTO mainBuildingOne = buildingNumberDTOS.get(0); + BuildingNumberDTO mainBuildingTwo = buildingNumberDTOS.get(1); + BuildingNumberDTO recordingBuilding = buildingNumberDTOS.get(2); + HashMap resultMap = new HashMap<>(); + Integer oneQuantity = Integer.valueOf(mainBuildingOne.getStatisticQuantity()); + Integer recordingQuantity = Integer.valueOf(recordingBuilding.getStatisticQuantity()); + resultMap.put("staticTime", mainBuildingOne.getStatisticTime()); + resultMap.put(mainBuildingOne.getStatisticPositionName()+"、"+recordingBuilding.getStatisticPositionName(), String.valueOf(oneQuantity+recordingQuantity)); + resultMap.put(mainBuildingTwo.getStatisticPositionName(), mainBuildingTwo.getStatisticQuantity()); + resultList.add(resultMap); + }); + return ResponseData.success(resultList); } /** @@ -151,12 +168,11 @@ public Object securityNumber() { QueryWrapper wrapper = new QueryWrapper<>(); wrapper.eq("staff_type", 2); + // TODO: 2022/9/2 后续使用产品确定的每天出勤的安保人员的数量 Integer total = staffInfoMapper.selectCount(wrapper); - //当日离岗事件个数 - QueryWrapper wrapper1 = new QueryWrapper<>(); - wrapper1.eq("hik_event_type", SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); - wrapper1.apply("date_format(now(),'%Y-%m-%d') = date_format(happen_time,'%Y-%m-%d')"); - Integer leave = caseInfoMapper.selectCount(wrapper1); + //当日离岗事件按设备去重后的个数 + // TODO: 2022/9/2 目前相当于24小时内的计算,之后看需要可改成自定义小时数计算离岗率,即离岗+6小时内仅一次离岗则恢复为100%,多次则累加离岗次数计算离岗率 + Integer leave = caseInfoMapper.selectDemobilizedCount(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); NumberFormat numberFormat = NumberFormat.getInstance(); // 设置精确到小数点后2位 numberFormat.setMaximumFractionDigits(2); @@ -179,7 +195,6 @@ @ResponseBody public Object visitorApplyDetail() { List reasonGroup = applyMapper.selectByVisitReason(); - HashMap resultMap = new HashMap<>(); NumberFormat numberFormat = NumberFormat.getInstance(); // 设置精确到小数点后2位 numberFormat.setMaximumFractionDigits(2); @@ -187,12 +202,17 @@ if(0 == sum){ return ResponseData.success(); } + List resultList = new ArrayList<>(); reasonGroup.forEach(group -> { String reasonName = dictService.getDictNameByCode(SecurityEventDict.VISIT_REASON, group.getVisitReason()); String result = numberFormat.format((float) group.getQuantity() / (float) sum * 100); - resultMap.put(reasonName, result+"%"); + ApplyReasonGroupDTO applyReasonGroupDTO = new ApplyReasonGroupDTO(); + applyReasonGroupDTO.setQuantity(group.getQuantity()); + applyReasonGroupDTO.setVisitReason(reasonName); + applyReasonGroupDTO.setRatio(result+"%"); + resultList.add(applyReasonGroupDTO); }); - return ResponseData.success(resultMap); + return ResponseData.success(resultList); } /** @@ -247,6 +267,32 @@ } /** + * 机动力量实时在岗率,在岗人数除以总应在岗人数,用离岗+6小时内恢复为100%,6小时外再计算 + */ + @GetMapping("/staff/beOnDutyRatio") + @ResponseBody + public Object beOnDutyRatio() { + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("staff_type", 2); + // TODO: 2022/9/2 后续使用产品确定的每天出勤的安保人员的数量 + Integer total = staffInfoMapper.selectCount(wrapper); + if(0 == total){ + return ResponseData.success(null); + } + //当日离岗事件按设备去重后的个数 + // TODO: 2022/9/2 目前相当于24小时内的计算,之后看需要可改成自定义小时数计算离岗率,即离岗+6小时内仅一次离岗则恢复为100%,多次则累加离岗次数计算离岗率 + List onDutyRatioDTOS = caseInfoMapper.selectDemobilizedCountByHour(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); + onDutyRatioDTOS.forEach(dto -> { + NumberFormat numberFormat = NumberFormat.getInstance(); + // 设置精确到小数点后2位 + numberFormat.setMaximumFractionDigits(2); + String result = numberFormat.format(100 - Float.valueOf(dto.getQuantity()) / (float) total * 100); + dto.setRatio(result+"%"); + }); + return ResponseData.success(onDutyRatioDTOS); + } + + /** * 闸机速通门统计-设备状态分组计算数量,devType传闸机字典key * 视频频监控摄像机统计-设备状态分组计算数量,devType传摄像头字典key */ @@ -262,12 +308,17 @@ if(sum <= 0){ return ResponseData.error("无该类设备信息"); } + List resultList = new ArrayList<>(); gateStatusGroup.forEach(group -> { String devStatus = dictService.getDictNameByCode(SecurityEventDict.DEVICE_STATUS, group.getStatus()); String result = numberFormat.format((float) group.getQuantity() / (float) sum * 100); - resultMap.put(devStatus, result+"%"); + GateStatusGroupResponse gateStatusGroupResponse = new GateStatusGroupResponse(); + gateStatusGroupResponse.setStatus(devStatus); + gateStatusGroupResponse.setRatio(result+"%"); + resultList.add(gateStatusGroupResponse); }); - resultMap.put("总", sum); + resultMap.put("total", sum); + resultMap.put("list", resultList); return ResponseData.success(resultMap); } @@ -282,17 +333,38 @@ String position = securityScoreDTO.getPosition(); List caseInfos = caseInfoMapper.selectByPosition(position); //查询各危险级别权重、各类别权重,放入map,避免循环中多次查数据库 - + HashMap hazardScoreMap = new HashMap<>(); + List caseHazardLevelList = hazardLevelMapper.getCaseHazardLevelList(null); + caseHazardLevelList.forEach(hazardLevel -> { + hazardScoreMap.put(hazardLevel.getCode(), hazardLevel.getWeight()); + }); + HashMap categoryScoreMap = new HashMap<>(); + List categoryLevelList = categoryLevelMapper.getCaseCategoryLevelList(null); + categoryLevelList.forEach(categoryLevel -> { + categoryScoreMap.put(categoryLevel.getCode(), categoryLevel.getWeight()); + }); + //事件按楼层分组,计算 List securityScoreDTOs = new ArrayList<>(); caseInfos.forEach(caseInfo -> { SecurityScoreDTO securityScoreDTO1 = new SecurityScoreDTO(); + securityScoreDTO1.setPosition(caseInfo.getPosition()); securityScoreDTO1.setArea(caseInfo.getArea()); - // TODO: 2022/8/4 楼层评分计算根据产品定义调整 -// caseInfo.get -// securityScoreDTO1.setScore(); + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); + Double score = 100 - Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + securityScoreDTO1.setScore(score); + securityScoreDTOs.add(securityScoreDTO1); }); - - return null; + 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); + }); + return ResponseData.success(securityScoreDTOs); } /** @@ -303,9 +375,13 @@ public Object SecurityFrequency(@RequestBody SecurityFrequencyDTO securityFrequencyDTO) { String year = securityFrequencyDTO.getYear(); String month = securityFrequencyDTO.getMonth(); - Integer quantity = caseInfoMapper.selectCountByMonth(year, month); - securityFrequencyDTO.setQuantity(quantity); - return ResponseData.success(securityFrequencyDTO); + if(!StringUtils.isEmpty(year) && StringUtils.isEmpty(month)){ + Integer quantity = caseInfoMapper.selectCountByMonth(year, month); + securityFrequencyDTO.setQuantity(quantity); + return ResponseData.success(securityFrequencyDTO); + } + List list = caseInfoMapper.selectPreMonthCount(); + return ResponseData.success(list); } } 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 ae4d770..f4f075c 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 @@ -1,20 +1,25 @@ package com.casic.missiles.modular.controller.cockpit; +import cn.hutool.core.date.DateUnit; import cn.hutool.core.date.DateUtil; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.casic.missiles.model.response.ResponseData; -import com.casic.missiles.modular.dao.AttendanceInfoMapper; -import com.casic.missiles.modular.dao.CaseInfoMapper; -import com.casic.missiles.modular.dao.HazardLevelMapper; -import com.casic.missiles.modular.dao.StaffInfoMapper; +import com.casic.missiles.modular.dao.*; +import com.casic.missiles.modular.dto.DeviceRepairLogDTO; +import com.casic.missiles.modular.dto.DeviceRepairRequest; import com.casic.missiles.modular.dto.statistics.*; +import com.casic.missiles.modular.enums.SecurityEventType; +import com.casic.missiles.modular.model.CaseCategoryLevel; import com.casic.missiles.modular.model.CaseHazardLevel; +import com.casic.missiles.modular.model.CaseInfo; import com.casic.missiles.modular.model.StaffInfo; +import com.casic.missiles.modular.service.DeviceInfoService; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.util.CollectionUtils; import org.springframework.web.bind.annotation.*; +import java.math.BigDecimal; import java.text.NumberFormat; import java.util.*; import java.util.stream.Collectors; @@ -40,6 +45,12 @@ @Autowired private HazardLevelMapper hazardLevelMapper; + @Autowired + private CategoryLevelMapper categoryLevelMapper; + + @Autowired + private DeviceInfoService deviceInfoService; + /** * 安防事件时域频次统计,每月的每天安防事件个数(原方案) * 月维度:展示每个月的每天的数据 @@ -89,15 +100,17 @@ List monthList = caseInfoMapper.selectPreMonthCountByYear(year); Map> collect = monthList.stream().collect(Collectors.groupingBy(PreMonthOrWeekCaseDTO::getHazardLevelCode)); HashMap strAvgMap = new HashMap<>(); + List resultList = new ArrayList<>(); for (String key : collect.keySet()) { List preMonthOrWeekCaseDTOS = collect.get(key); int sum = preMonthOrWeekCaseDTOS.stream().mapToInt(PreMonthOrWeekCaseDTO::getQuantity).sum(); //若年份是本年,则使用个安防级别数量/当前月份数 //若不是本年,除数为12 MonthAndWeekDTO monthAndWeekDTO = new MonthAndWeekDTO(); + String hazardName = hazardLevelMapper.selectHazardNameByCode(key); + monthAndWeekDTO.setLevelName(hazardName); if(year.equals(String.valueOf(DateUtil.thisYear()))){ monthAndWeekDTO.setMonthQuantity(sum / DateUtil.thisMonth()); -// monthAndWeekDTO.setLevelName(); strAvgMap.put(key, monthAndWeekDTO); }else{ monthAndWeekDTO.setMonthQuantity(sum / 12); @@ -113,27 +126,37 @@ if(year.equals(String.valueOf(DateUtil.thisYear()))){ if(!Objects.isNull(strAvgMap.get(key))){ MonthAndWeekDTO monthAndWeekDTO = strAvgMap.get(key); + String hazardName = hazardLevelMapper.selectHazardNameByCode(key); + monthAndWeekDTO.setLevelName(hazardName); monthAndWeekDTO.setWeekQuantity(sum / DateUtil.thisWeekOfYear()); strAvgMap.put(key, monthAndWeekDTO); }else{ MonthAndWeekDTO monthAndWeekDTO = new MonthAndWeekDTO(); + String hazardName = hazardLevelMapper.selectHazardNameByCode(key); + monthAndWeekDTO.setLevelName(hazardName); monthAndWeekDTO.setWeekQuantity(sum / DateUtil.thisWeekOfYear()); strAvgMap.put(key, monthAndWeekDTO); } }else{ if(!Objects.isNull(strAvgMap.get(key))){ MonthAndWeekDTO monthAndWeekDTO = strAvgMap.get(key); + String hazardName = hazardLevelMapper.selectHazardNameByCode(key); + monthAndWeekDTO.setLevelName(hazardName); monthAndWeekDTO.setWeekQuantity(sum / 52); strAvgMap.put(key, monthAndWeekDTO); }else{ MonthAndWeekDTO monthAndWeekDTO = new MonthAndWeekDTO(); + String hazardName = hazardLevelMapper.selectHazardNameByCode(key); + monthAndWeekDTO.setLevelName(hazardName); monthAndWeekDTO.setWeekQuantity(sum / 52); strAvgMap.put(key, monthAndWeekDTO); } } } - avgMonthAndWeekGroupDTO.setMap(strAvgMap); - return ResponseData.success(avgMonthAndWeekGroupDTO); + strAvgMap.keySet().forEach(key -> { + resultList.add(strAvgMap.get(key)); + }); + return ResponseData.success(resultList); } /** @@ -181,12 +204,178 @@ } /** - * 员工考勤人数变化,功能待定 + * 员工考勤人数变化,统计当天(横坐标为时)及近7天(横坐标为天)的考勤人数变化,只要发生一次考勤识别,次数的基数就正常增加(没有上班下班区分) */ + @PostMapping("/staff/attendanceNumber/{dimension}") + @ResponseBody + public Object attendanceNumber(@PathVariable("dimension") String dimension) { + List attendanceNumberDTOs = null; + List> resultList = new ArrayList<>(); + if("week".equals(dimension)){ + //近7天数据按天分组统计 + attendanceNumberDTOs = attendanceInfoMapper.getCountForWeek(); + }else if("day".equals(dimension)) { + //今天数据按小时分组统计 + attendanceNumberDTOs = attendanceInfoMapper.getCountForDay(); + } + if(CollectionUtils.isEmpty(attendanceNumberDTOs)){ + return ResponseData.error("该查询条件下,无员工出勤数据!"); + } + Map> collect = attendanceNumberDTOs.stream().collect(Collectors.groupingBy(AttendanceNumberDTO::getDate)); + collect.keySet().forEach(key -> { + List attendanceNumberDTOS = collect.get(key); + AttendanceNumberDTO attendanceNumberDTO = attendanceNumberDTOS.get(0); + AttendanceNumberDTO attendanceNumberDTO2 = attendanceNumberDTOS.get(1); + Map resultMap = new HashMap<>(); + resultMap.put(attendanceNumberDTO.getStaffType(), attendanceNumberDTO.getQuantity()); + resultMap.put(attendanceNumberDTO2.getStaffType(), attendanceNumberDTO2.getQuantity()); + resultMap.put("staticTime", attendanceNumberDTO.getDate()); + resultList.add(resultMap); + }); + return ResponseData.success(resultList); + } /** - * 近30天/近一周安保人员到岗排行 + * 早晚高峰区域安防评估 */ + @PostMapping("/security/assessment/{dimension}") + @ResponseBody + public Object securityAssessment(@PathVariable("dimension") String dimension) { + //查询各危险级别权重、各类别权重,放入map,避免循环中多次查数据库 + HashMap hazardScoreMap = new HashMap<>(); + List caseHazardLevelList = hazardLevelMapper.getCaseHazardLevelList(null); + caseHazardLevelList.forEach(hazardLevel -> { + hazardScoreMap.put(hazardLevel.getCode(), hazardLevel.getWeight()); + }); + HashMap categoryScoreMap = new HashMap<>(); + List categoryLevelList = categoryLevelMapper.getCaseCategoryLevelList(null); + categoryLevelList.forEach(categoryLevel -> { + categoryScoreMap.put(categoryLevel.getCode(), categoryLevel.getWeight()); + }); + HashMap hashMap = new HashMap<>(); + if("week".equals(dimension)){ + //近7天早晚高峰数据 + List caseInfos = caseInfoMapper.selectListBySevenDay(); + //按时间(天)进行分组 + caseInfos.forEach(caseInfo -> { + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); + Double score = Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + String[] array = caseInfo.getHappenTime().split(" "); + String dayTime = array[0]; + BigDecimal preScore; + if(hashMap.containsKey(dayTime)){ + Double aDouble = hashMap.get(dayTime); + preScore = new BigDecimal(aDouble.toString()); + + }else{ + preScore = new BigDecimal("100.0"); + } + BigDecimal nowScore = new BigDecimal(score.toString()); + hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); + }); + return ResponseData.success(hashMap); + }else if("day".equals(dimension)) { + //今天数据按小时分组统计 + List caseInfos = caseInfoMapper.selectListByToday(); + caseInfos.forEach(caseInfo -> { + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); + Double score = Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + String[] array = caseInfo.getHappenTime().split(":"); + String dayTime = array[0]; + BigDecimal preScore; + if(hashMap.containsKey(dayTime)){ + Double aDouble = hashMap.get(dayTime); + preScore = new BigDecimal(aDouble.toString()); + + }else{ + preScore = new BigDecimal("100.0"); + } + BigDecimal nowScore = new BigDecimal(score.toString()); + hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); + }); + return ResponseData.success(hashMap); + } + return null; + } + + /** + * 重点区域安防事态评估,统计重点区域6:00-23:00按小时分组数据 + */ + @GetMapping("/security/keyAreaStatistic") + @ResponseBody + public Object keyAreaStatistic() { + //查询各危险级别权重、各类别权重,放入map,避免循环中多次查数据库 + HashMap hazardScoreMap = new HashMap<>(); + List caseHazardLevelList = hazardLevelMapper.getCaseHazardLevelList(null); + caseHazardLevelList.forEach(hazardLevel -> { + hazardScoreMap.put(hazardLevel.getCode(), hazardLevel.getWeight()); + }); + HashMap categoryScoreMap = new HashMap<>(); + List categoryLevelList = categoryLevelMapper.getCaseCategoryLevelList(null); + categoryLevelList.forEach(categoryLevel -> { + categoryScoreMap.put(categoryLevel.getCode(), categoryLevel.getWeight()); + }); + HashMap hashMap = new HashMap<>(); + //今天数据按小时分组统计 + List caseInfos = caseInfoMapper.selectListByToday2(); + caseInfos.forEach(caseInfo -> { + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); + Double score = Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + String[] array = caseInfo.getHappenTime().split(":"); + String dayTime = array[0]; + BigDecimal preScore; + if(hashMap.containsKey(dayTime)){ + Double aDouble = hashMap.get(dayTime); + preScore = new BigDecimal(aDouble.toString()); + + }else{ + preScore = new BigDecimal("100.0"); + } + BigDecimal nowScore = new BigDecimal(score.toString()); + hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); + }); + return ResponseData.success(hashMap); + } + + /** + * 安防机动支援力量调配响应评估,根据事件已解决状态及已解决时间-发送时间,按时间(小时)分组统计 + */ + @GetMapping("/security/responseAssess") + @ResponseBody + public Object responseAssess() { + //查询各危险级别权重、各类别权重,放入map,避免循环中多次查数据库 + HashMap hazardScoreMap = new HashMap<>(); + List caseHazardLevelList = hazardLevelMapper.getCaseHazardLevelList(null); + caseHazardLevelList.forEach(hazardLevel -> { + hazardScoreMap.put(hazardLevel.getCode(), hazardLevel.getWeight()); + }); + HashMap hashMap = new HashMap<>(); + //今天数据按小时分组统计 + List caseInfos = caseInfoMapper.selectListByToday3(); + caseInfos.forEach(caseInfo -> { + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + //扣分=事件级别权重*未解决小时数 + Date updateTime = DateUtil.parse(caseInfo.getUpdateTime()); + Date happenTime = DateUtil.parse(caseInfo.getHappenTime()); + long between = DateUtil.between(updateTime, happenTime, DateUnit.HOUR); + Double score = Double.valueOf(hazardWeight)*between; + String[] array = caseInfo.getHappenTime().split(":"); + String dayTime = array[0]; + BigDecimal preScore; + if(hashMap.containsKey(dayTime)){ + Double aDouble = hashMap.get(dayTime); + preScore = new BigDecimal(aDouble.toString()); + }else{ + preScore = new BigDecimal("100.0"); + } + BigDecimal nowScore = new BigDecimal(score.toString()); + hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); + }); + return ResponseData.success(hashMap); + } /** * 重点区域威胁事件类型统计,优先级2,统计近7天和近30天 @@ -224,7 +413,34 @@ } /** - * 设备状态计算系数和评判,优先级3,需确认设备恢复时间是否可以获取 + * 近30天/近一周安保人员到岗排行 */ + + /** + * 安保等级评估,发生离岗事件减1分 + */ + @GetMapping("/security/levelAssess") + @ResponseBody + public Object securityLevelAssess() { + //今天数据按小时分组统计 + List resultList = caseInfoMapper.selectListByType(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); + resultList.forEach(result -> { + BigDecimal deScore = new BigDecimal(result.getQuantity()); + BigDecimal preScore = new BigDecimal("100.0"); + result.setScore(preScore.subtract(deScore).doubleValue()); + }); + return ResponseData.success(resultList); + } + + /** + * 设备状态计算系数和评判,即设备维修管理查询(不分页) + */ + @PostMapping("/device/repairList") + @ResponseBody + public Object repairList(@RequestBody DeviceRepairRequest deviceRepairRequest) { + List deviceRepairLogDTOS = deviceInfoService.deviceRepairListPage(deviceRepairRequest); + return ResponseData.success(deviceRepairLogDTOS); + } + } 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 fbf8ab6..c71a15a 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 @@ -1,13 +1,12 @@ package com.casic.missiles.modular.controller.hik; +import cn.hutool.core.date.DateTime; +import cn.hutool.core.date.DateUtil; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.casic.missiles.model.response.ResponseData; import com.casic.missiles.modular.dao.HikFaceGroupInfoMapper; -import com.casic.missiles.modular.dto.hik.EventSubscribeRequest; -import com.casic.missiles.modular.dto.hik.FaceGroupAdditionRequest; -import com.casic.missiles.modular.dto.hik.HikRecvEvent; -import com.casic.missiles.modular.dto.hik.OrgBatchAdd; +import com.casic.missiles.modular.dto.hik.*; import com.casic.missiles.modular.enums.HikUri; import com.casic.missiles.modular.enums.SecurityEventType; import com.casic.missiles.modular.model.CaseInfo; @@ -18,16 +17,20 @@ import com.casic.missiles.modular.util.CaseInfoFactoryUtil; import com.casic.missiles.modular.util.HikUtil; import com.casic.missiles.modular.util.ThreadPoolUtil; +import com.casic.missiles.modular.util.WebSocket; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; -import org.springframework.web.bind.annotation.*; +import org.springframework.util.CollectionUtils; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.RestController; -import java.net.InetAddress; -import java.net.UnknownHostException; import java.util.ArrayList; +import java.util.Iterator; import java.util.List; import java.util.Objects; @@ -38,7 +41,6 @@ */ @Slf4j @RestController -@RequestMapping("/hik") public class HikController { @Autowired @@ -53,28 +55,37 @@ @Autowired private HikService hikService; + @Autowired + private HikFaceGroupInfoMapper hikFaceGroupInfoMapper; + + @Autowired + private WebSocket webSocket; + @Value("${server.port}") private int serverPort; - @Autowired - private HikFaceGroupInfoMapper hikFaceGroupInfoMapper; /** * 海康事件订阅 */ - @PostMapping("/event/subscribe") + @PostMapping("/hik/event/subscribe") @ResponseBody - public Object eventSubscribe() throws UnknownHostException { + public Object eventSubscribe() { EventSubscribeRequest eventSubscribeRequest = new EventSubscribeRequest(); ArrayList list = new ArrayList<>(); list.add(SecurityEventType.DEVICE_OFFLINE); + list.add(SecurityEventType.DEVICE_ONLINE); list.add(SecurityEventType.KEY_PERSONNEL_IDENTIFY_EVENT); list.add(SecurityEventType.MONITORING_POINT_OFFLINE); + list.add(SecurityEventType.MONITORING_POINT_ONLINE); list.add(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); list.add(SecurityEventType.PERSONNEL_GATHER_EVENT); - InetAddress localHost = InetAddress.getLocalHost(); + list.add(SecurityEventType.VISITOR_REGISTER); + list.add(SecurityEventType.VISITOR_CHECKOUT); + list.add(SecurityEventType.HIGH_ALTITUDE_PARABOLIC); +// InetAddress localHost = InetAddress.getLocalHost(); eventSubscribeRequest.setEventTypes(list); - eventSubscribeRequest.setEventDest("https://" + localHost + ":" + serverPort + "/eventRcv"); + eventSubscribeRequest.setEventDest("http://" + "192.168.10.6" + ":" + serverPort + "/eventRcv"); //订阅类型,0-订阅原始事件,1-联动事件,2-原始事件和联动事件,不填使用默认值0 eventSubscribeRequest.setSubType(0); /** @@ -92,19 +103,25 @@ } /** + * 查询事件订阅信息 + */ + @PostMapping("/hik/event/query") + @ResponseBody + public Object eventQuery() { + String result = HikUtil.hikApi(HikUri.EVENT_INFO, ""); + return result; + } + + /** * 海康事件接收 */ @PostMapping("/eventRcv") @ResponseBody public Object eventRcv(@RequestBody HikRecvEvent hikRecvEvent) { //1、接收所需事件类型 - Long eventType = hikRecvEvent.getEventType(); + Number eventType = hikRecvEvent.getEventType(); log.info("接收到安防事件类型为:{}", eventType); CaseInfo caseInfo = caseInfoFactoryUtil.getCaseInfo(eventType); - //接收到不关心事件直接返回 - if(Objects.isNull(caseInfo)){ - return ResponseData.success(); - } //2、不同事件不同处理,caseInfoFactoryUtil已设置好事件基础定义信息 // 再为事件添加状态、设备编码、设备名称、位置、区域、时间 // 异步处理事件 @@ -114,19 +131,23 @@ caseHandle(hikRecvEvent, eventType, caseInfo); } })); +// caseHandle(hikRecvEvent, eventType, caseInfo); - return null; + return ResponseData.success(); } - private void caseHandle(HikRecvEvent hikRecvEvent, Long eventType, CaseInfo caseInfo) { + private void caseHandle(HikRecvEvent hikRecvEvent, Number eventType, CaseInfo caseInfo) { JSONArray eventArray = hikRecvEvent.getEventArray(); List caseInfos = new ArrayList<>(); - while (eventArray.stream().iterator().hasNext()) { + Iterator iterator = eventArray.iterator(); + while (iterator.hasNext()) { CaseInfo caseInfo1 = new CaseInfo(); - BeanUtils.copyProperties(caseInfo, caseInfo1); - JSONObject event = (JSONObject) eventArray.stream().iterator().next(); + if(!Objects.isNull(caseInfo)){ + BeanUtils.copyProperties(caseInfo, caseInfo1); + } + JSONObject event = (JSONObject) iterator.next(); //5种事件进行不同处理 - if(SecurityEventType.KEY_PERSONNEL_IDENTIFY_EVENT == eventType){ + if (SecurityEventType.KEY_PERSONNEL_IDENTIFY_EVENT.equals(eventType)) { //判断所属人脸分组 JSONObject data = (JSONObject) event.get("data"); JSONObject faceRecognitionResult = (JSONObject) data.get("faceRecognitionResult"); @@ -142,52 +163,101 @@ if (faceGroupCode.equals(blackListGroup.getFaceGroupCode())) { //黑名单分组处理 caseInfo1 = hikService.blackListHandle(event, caseInfo1); - }else if(faceGroupCode.equals(propertyPersonnelGroup.getFaceGroupCode())){ + } else if (faceGroupCode.equals(propertyPersonnelGroup.getFaceGroupCode())) { //考勤分组处理-物业人员,添加到考勤表 hikService.propertyAttendanceHandle(event); - }else if(faceGroupCode.equals(securityPersonnelGroup.getFaceGroupCode())){ + } else if (faceGroupCode.equals(securityPersonnelGroup.getFaceGroupCode())) { //考勤分组处理-安保人员,添加到考勤表 hikService.securityPersonnelHandle(event); - }else { + } else { return; } - }else if(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT == eventType){ + } else if (SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT.equals(eventType)) { //离岗事件处理 caseInfo1 = hikService.demobilizedHandle(event, caseInfo1); - }else if(SecurityEventType.PERSONNEL_GATHER_EVENT == eventType){ + } else if (SecurityEventType.PERSONNEL_GATHER_EVENT.equals(eventType)) { //人员聚集事件处理 caseInfo1 = hikService.personGatherHandle(event, caseInfo1); - }else if(SecurityEventType.MONITORING_POINT_OFFLINE == eventType){ + } else if (SecurityEventType.MONITORING_POINT_OFFLINE.equals(eventType)) { //监控点离线事件处理 caseInfo1 = hikService.monitorPointOfflineHandle(event, caseInfo1); - }else if(SecurityEventType.DEVICE_OFFLINE == eventType){ + } else if (SecurityEventType.MONITORING_POINT_ONLINE.equals(eventType)) { + //监控点上线事件处理 + hikService.monitorPointOnlineHandle(event); + } else if (SecurityEventType.DEVICE_OFFLINE.equals(eventType)) { //装置离线事件处理 caseInfo1 = hikService.deviceOfflineHandle(event, caseInfo1); - }else if(SecurityEventType.VISITOR_REGISTER == eventType){ + } else if (SecurityEventType.DEVICE_ONLINE.equals(eventType)) { + //装置上线处理 + hikService.deviceOnlineHandle(event); + } else if (SecurityEventType.VISITOR_REGISTER.equals(eventType)) { //记录访客登记记录,添加到访客记录表 hikService.visitorRegisterHandler(event); - }else if(SecurityEventType.VISITOR_CHECKOUT == eventType){ + } else if (SecurityEventType.VISITOR_CHECKOUT.equals(eventType)) { //记录访客签离记录 hikService.visitorCheckOutHandler(event); } - if(!Objects.isNull(caseInfo1) && !StringUtils.isEmpty(caseInfo1.getHappenTime())){ + if (!Objects.isNull(caseInfo1) && !StringUtils.isEmpty(caseInfo1.getHappenTime())) { caseInfos.add(caseInfo1); } } //3、安防事件入库 - if(!caseInfoService.insertCaseInfoBatch(caseInfos)){ - log.error("安防事件批量入库异常"); + if (!CollectionUtils.isEmpty(caseInfos) && !caseInfoService.insertCaseInfoBatch(caseInfos)) { + log.error("安防事件批量入库异常!"); } // TODO: 2022/8/15 webSocket推送 + if (CollectionUtils.isEmpty(caseInfos)) { + log.info("webSocket事件推送"); + webSocket.sendAllMessage(JSONObject.toJSONString(caseInfos)); + } return; } /** + * 以图搜图,前端用于轨迹追踪 + */ + @PostMapping("/hik/search/picture") + @ResponseBody + public Object searchPictures(@RequestBody SearchPicturesRequest searchPicturesRequest) { + DateTime startDateTime = DateUtil.parse(searchPicturesRequest.getStartTime()); + DateTime endDateTime = DateUtil.parse(searchPicturesRequest.getEndTime()); + String startTime = DateUtil.format(startDateTime, "yyyy-MM-dd'T'HH:mm:ss.SSSXXX"); + String endTime = DateUtil.format(endDateTime, "yyyy-MM-dd'T'HH:mm:ss.SSSXXX"); + searchPicturesRequest.setStartTime(startTime); + searchPicturesRequest.setEndTime(endTime); + String body = JSONObject.toJSONString(searchPicturesRequest); + String resultStr = HikUtil.hikApi(HikUri.SEARCH_PICTURES, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (!"0".equals(resultJson.get("code"))) { + log.error("请求海康,以图搜图失败,海康response:{}", resultStr); + return ResponseData.error("以图搜图失败"); + } + return ResponseData.success(resultJson); + } + + + /** + * 海康事件取消订阅 + */ + @PostMapping("/hik/event/cancel") + @ResponseBody + public Object eventCancelSubscribe(@RequestBody CancelSubscribeRequest cancelSubscribeRequest) { + String body = JSONObject.toJSONString(cancelSubscribeRequest); + String resultStr = HikUtil.hikApi(HikUri.EVENT_CANCEL, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (!"0".equals(resultJson.get("code"))) { + log.error("请求海康,取消订阅失败,海康response:{}", resultStr); + return ResponseData.error("取消订阅失败"); + } + return ResponseData.success(resultJson); + } + + /** * 单个添加海康人脸分组 * api->hik单个添加人脸分组api->response->mysql */ - @PostMapping("/faceGroup/single/add") + @PostMapping("/hik/faceGroup/single/add") @ResponseBody public Object faceGroupAddition(@RequestBody FaceGroupAdditionRequest faceGroupAdditionRequest) { String body = JSONObject.toJSONString(faceGroupAdditionRequest); @@ -212,7 +282,7 @@ * 批量添加海康组织 * api->hik批量添加组织api->response */ - @PostMapping("/org/batch/add") + @PostMapping("/hik/org/batch/add") @ResponseBody public Object orgBatchAdd(@RequestBody List orgBatchAddRequest) { String body = JSONObject.toJSONString(orgBatchAddRequest); @@ -232,4 +302,62 @@ return ResponseData.error("批量添加组织失败"); } + /** + * 获取人员列表 + */ + @PostMapping("/hik/person/personList") + @ResponseBody + public Object personList() { + PersonListRequest request = new PersonListRequest(); + request.setPageNo(1); + request.setPageSize(100); + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi("/api/resource/v2/person/personList", body); + return resultStr; + } + + /** + * 获取组织列表 + */ + @PostMapping("/hik/org/orgList") + @ResponseBody + public Object orgList() { + PersonListRequest request = new PersonListRequest(); + request.setPageNo(1); + request.setPageSize(100); + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi("/api/resource/v1/org/orgList", body); + return resultStr; + } + + /** + * 查询访客权限下载记录 + */ + @PostMapping("/hik/auth/result") + @ResponseBody + public Object authResult() { + PersonListRequest request = new PersonListRequest(); + request.setPageNo(1); + request.setPageSize(100); + request.setOrderId("ba101db6246711edaea66f7939a13638"); + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi("/api/visitor/v1/auth/result", body); + return resultStr; + } + + /** + * 人脸图片获取 + */ + @PostMapping("/hik/face/picture") + @ResponseBody + public Object facePicture() { + FaceRequest request = new FaceRequest(); +// List list = new ArrayList<>(); +// list.add(""); + request.setCertificateNum("wanggong"); + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi("/api/frs/v1/face", body); + return resultStr; + } + } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/AssetInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/AssetInfoMapper.java index 4f64e83..c0684ee 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/AssetInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/AssetInfoMapper.java @@ -17,6 +17,6 @@ @Mapper public interface AssetInfoMapper extends BaseMapper { - List getAssetInfoListPage(@Param("page") Page page, AssetInfoRequest assetInfoRequest); + List getAssetInfoListPage(@Param("page") Page page, @Param("assetInfoRequest") AssetInfoRequest assetInfoRequest); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/AttendanceInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/AttendanceInfoMapper.java index f9e793e..ec87e46 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/AttendanceInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/AttendanceInfoMapper.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.statistics.AttendanceNumberDTO; import com.casic.missiles.modular.dto.statistics.AttendanceRatioDTO; import com.casic.missiles.modular.model.AttendanceInfo; import org.apache.ibatis.annotations.Mapper; @@ -17,7 +18,7 @@ */ @Mapper public interface AttendanceInfoMapper extends BaseMapper { - List getAttendanceInfoListPage(@Param("page") Page page, StaffInfoRequest attendanceInfoRequest); + List getAttendanceInfoListPage(@Param("page") Page page, @Param("attendanceInfoRequest") StaffInfoRequest attendanceInfoRequest); AttendanceInfo selectByCodeAndDate(@Param("staffCode") String staffCode); @@ -26,4 +27,8 @@ List getCountByTypeAndDateForMonth(@Param("staffType")String staffType); List getCountByTypeAndDateForYear(@Param("staffType")String staffType); + + List getCountForWeek(); + + List getCountForDay(); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java index ce94b8f..6137a7d 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java @@ -17,5 +17,5 @@ @Mapper public interface BlackInfoMapper extends BaseMapper { - List getBlackInfoListPage(@Param("page") Page page, BlackInfoRequest blackInfoRequest); + List getBlackInfoListPage(@Param("page") Page page, @Param("blackInfoRequest") BlackInfoRequest blackInfoRequest); } 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 efda6b3..50aaa6f 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 @@ -20,7 +20,7 @@ List getCaseInfoListPage(@Param("page") Page page, @Param("caseInfoRequest") CaseInfoRequest caseInfoRequest); - int updateStatusById(CaseInfoRequest caseInfoRequest); + int updateStatusById(@Param("caseInfoRequest") CaseInfoRequest caseInfoRequest); List selectByLevelAndMonth(@Param("year") String year); @@ -47,4 +47,20 @@ List selectPreWeekCountByThirtyDay(); List selectPreDayCountBySevenDay(); + + Integer selectDemobilizedCount(@Param("eventType") Number personnelDemobilizedEvent); + + List selectPreMonthCount(); + + List selectListBySevenDay(); + + List selectListByToday(); + + List selectListByToday2(); + + List selectListByToday3(); + + List selectListByType(@Param("eventType") Number eventType); + + List selectDemobilizedCountByHour(@Param("eventType") Number eventType); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/CategoryLevelMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/CategoryLevelMapper.java index 52fc714..afe1650 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/CategoryLevelMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/CategoryLevelMapper.java @@ -17,9 +17,9 @@ @Mapper public interface CategoryLevelMapper extends BaseMapper { - List getCaseCategoryLevelListPage(@Param("page") Page page, CategoryLevelRequest categoryLevelRequest); + List getCaseCategoryLevelListPage(@Param("page") Page page, @Param("categoryLevelRequest") CategoryLevelRequest categoryLevelRequest); - List getCaseCategoryLevelList(CategoryLevelRequest categoryLevelRequest); + List getCaseCategoryLevelList(@Param("categoryLevelRequest") CategoryLevelRequest categoryLevelRequest); CaseCategoryLevel getCaseCategoryLevel(@Param("categoryLevelCode") String categoryLevelCode); 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 66353b1..2555a09 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 @@ -19,7 +19,7 @@ @Mapper public interface DeviceInfoMapper extends BaseMapper { - List getDeviceInfoListPage(@Param("page") Page page, DeviceInfoRequest deviceInfoRequest); + List getDeviceInfoListPage(@Param("page") Page page, @Param("deviceInfoRequest") DeviceInfoRequest deviceInfoRequest); List getDeviceInfoList(@Param("deviceInfoRequest") DeviceInfoRequest deviceInfoRequest); @@ -27,6 +27,8 @@ DeviceInfo getByIndexCode(@Param("srcIndex") String srcIndex); + DeviceInfo getByIp(@Param("ip") String ip); + List selectIndexCodesByCodes(@Param("deviceCodes") List deviceCodes); List selectByType(@Param("devType") String devType); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java index 41dd0af..5bfaf63 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java @@ -5,6 +5,7 @@ import com.casic.missiles.modular.dto.DeviceRepairRequest; import com.casic.missiles.modular.model.DeviceRepairLog; import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; import java.util.List; @@ -16,7 +17,7 @@ @Mapper public interface DeviceRepairLogMapper extends BaseMapper { - List getDeviceRepairListPage(Page page, DeviceRepairRequest deviceRepairRequest); + List getDeviceRepairListPage(@Param("page") Page page, @Param("deviceRepairRequest")DeviceRepairRequest deviceRepairRequest); - List getDeviceRepairList(DeviceRepairRequest deviceRepairRequest); + List getDeviceRepairList(@Param("deviceRepairRequest") DeviceRepairRequest deviceRepairRequest); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java index 9035c47..4823ac1 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java @@ -18,7 +18,7 @@ @Mapper public interface FireEquipInfoMapper extends BaseMapper { - List getFireEquipInfoListPage(@Param("page") Page page, FireEquipRequest fireEquipRequest); + List getFireEquipInfoListPage(@Param("page") Page page, @Param("fireEquipRequest") FireEquipRequest fireEquipRequest); FireEquipInfo getFireEquipInfo(@Param("equipCode") String equipCode); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/GateGroupMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/GateGroupMapper.java index d8c330d..977a427 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/GateGroupMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/GateGroupMapper.java @@ -17,7 +17,7 @@ */ @Mapper public interface GateGroupMapper extends BaseMapper { - List getGateGroupListPage(@Param("page") Page page, GateGroupRequest gateGroupRequest); + List getGateGroupListPage(@Param("page") Page page, @Param("gateGroupRequest") GateGroupRequest gateGroupRequest); GateGroup getGateGroupByName(@Param("groupName") String groupName); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/HazardLevelMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/HazardLevelMapper.java index 8957780..dcf47bb 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/HazardLevelMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/HazardLevelMapper.java @@ -17,11 +17,13 @@ @Mapper public interface HazardLevelMapper extends BaseMapper { - List getCaseHazardLevelListPage(@Param("page") Page page, HazardLevelRequest hazardLevelRequest); + List getCaseHazardLevelListPage(@Param("page") Page page, @Param("hazardLevelRequest") HazardLevelRequest hazardLevelRequest); - List getCaseHazardLevelList(HazardLevelRequest hazardLevelRequest); + List getCaseHazardLevelList(@Param("hazardLevelRequest") HazardLevelRequest hazardLevelRequest); CaseHazardLevel getCaseHazardLevel(@Param("hazardLevelCode") String hazardLevelCode); List selectHazardName(); + + String selectHazardNameByCode(@Param("hazardLevelCode") String hazardLevelCode); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/HikCaseDefineMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/HikCaseDefineMapper.java index 0dc47d1..f162fef 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/HikCaseDefineMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/HikCaseDefineMapper.java @@ -12,5 +12,5 @@ */ @Mapper public interface HikCaseDefineMapper extends BaseMapper { - HikCaseDefine getHikCaseDefine(@Param("caseTypeCode") Long caseTypeCode); + HikCaseDefine getHikCaseDefine(@Param("caseTypeCode") Number caseTypeCode); } 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 f8a674c..fe5afc2 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 @@ -17,11 +17,13 @@ @Mapper public interface StaffInfoMapper extends BaseMapper { - List getStaffInfoListPage(@Param("page") Page page, StaffInfoRequest staffInfoRequest); + List getStaffInfoListPage(@Param("page") Page page, @Param("staffInfoRequest") StaffInfoRequest staffInfoRequest); StaffInfo selectByCode(@Param("staffCode") String staffCode); - List getStaffInfoList(StaffInfoRequest staffInfoRequest); + List getStaffInfoList(@Param("staffInfoRequest") StaffInfoRequest staffInfoRequest); - List selectBatchCodes(List list); + List selectBatchCodes(@Param("list") List list); + + int updateByCodeForCard(@Param("staffCode") String staffCode, @Param("cardNo") String cardNo); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitInfoMapper.java index b1217c5..6c52542 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitInfoMapper.java @@ -16,7 +16,7 @@ */ @Mapper public interface VisitInfoMapper extends BaseMapper { - List getVisitInfoListPage(@Param("page") Page page, VisitorRequest visitorRequest); + List getVisitInfoListPage(@Param("page") Page page, @Param("visitorRequest") VisitorRequest visitorRequest); VisitInfo selectByOrderId(@Param("orderId") String orderId); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitorApplyMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitorApplyMapper.java index c09f3c0..6ea55bd 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitorApplyMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitorApplyMapper.java @@ -18,7 +18,7 @@ @Mapper public interface VisitorApplyMapper extends BaseMapper { - List getVisitorApplyListPage(@Param("page") Page page, VisitorApplyRequest visitorApplyRequest); + List getVisitorApplyListPage(@Param("page") Page page, @Param("visitorApplyRequest") VisitorApplyRequest visitorApplyRequest); List selectByVisitReason(); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/AttendanceInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/AttendanceInfoMapper.xml index b2ece71..f8bdd6e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/AttendanceInfoMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/AttendanceInfoMapper.xml @@ -43,7 +43,8 @@ and staff_type = #{staffType} - and YEARWEEK(date_format(atte_date, '%Y-%m-%d'), 1) = YEARWEEK(now(),1); + AND DATE_SUB(CURDATE(), INTERVAL 7 DAY) <= DATE(atte_date) + GROUP BY DATE_FORMAT(atte_date, '%Y-%m-%d') @@ -69,4 +70,20 @@ GROUP BY DATE_FORMAT(atte_date, '%Y-%m') + + + \ No newline at end of file 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 2b6953f..06ec0a8 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 @@ -28,7 +28,9 @@ @@ -87,7 +89,8 @@ SELECT hazard_level_code as levelCode, count(id) as quantity FROM bus_case_info WHERE hazard_level_code is not null - AND DATE_SUB(CURDATE(), INTERVAL 7 DAY) <= date(happen_time); + AND is_key_area = 1 + AND DATE_SUB(CURDATE(), INTERVAL 7 DAY) <= date(happen_time) GROUP BY hazard_level_code @@ -95,7 +98,8 @@ SELECT hazard_level_code as levelCode, count(id) as quantity FROM bus_case_info WHERE hazard_level_code is not null - AND DATE_SUB(CURDATE(), INTERVAL 30 DAY) <= date(happen_time); + AND is_key_area = 1 + AND DATE_SUB(CURDATE(), INTERVAL 30 DAY) <= date(happen_time) GROUP BY hazard_level_code @@ -122,4 +126,71 @@ AND hazard_level_code is not null GROUP BY DATE_FORMAT(happen_time,'%Y-%m-%d') + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/CategoryLevelMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/CategoryLevelMapper.xml index 4670b1f..1d25cbd 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/CategoryLevelMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/CategoryLevelMapper.xml @@ -20,11 +20,11 @@ SELECT * FROM bus_case_category_level WHERE 1=1 - - and code = #{code} + + and code = #{categoryLevelRequest.code} - - and name = #{name} + + and name = #{categoryLevelRequest.name} ORDER by create_time DESC 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 9b66fd8..bfd84b7 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 @@ -98,4 +98,10 @@ #{item} + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceRepairLogMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceRepairLogMapper.xml index 078ed3c..cf1a481 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceRepairLogMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceRepairLogMapper.xml @@ -22,14 +22,14 @@ SELECT * FROM bus_device_repair_log WHERE 1=1 - - and device_code = #{devCode} + + and device_code = #{deviceRepairRequest.devCode} - - and device_name = #{devName} + + and device_name = #{deviceRepairRequest.devName} - - and DATE_FORMAT(create_time,"%y%m%d") = DATE_FORMAT(#{createTime},"%y%m%d") + + and DATE_FORMAT(create_time,"%y%m%d") = DATE_FORMAT(#{deviceRepairRequest.createTime},"%y%m%d") ORDER by create_time DESC diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/HazardLevelMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/HazardLevelMapper.xml index f16f2b9..458322b 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/HazardLevelMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/HazardLevelMapper.xml @@ -20,11 +20,11 @@ SELECT * FROM bus_case_hazard_level WHERE 1=1 - - and code = #{code} + + and code = #{hazardLevelRequest.code} - - and name = #{name} + + and name = #{hazardLevelRequest.name} ORDER by create_time DESC @@ -42,4 +42,10 @@ SELECT name FROM bus_case_hazard_level + + \ 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 557237e..b6a183a 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 @@ -50,4 +50,10 @@ + + + UPDATE bus_staff_info + SET card_no = #{cardNo} + WHERE staff_code = #{staffCode} + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitInfoMapper.xml index 84aa84f..230529a 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitInfoMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitInfoMapper.xml @@ -27,5 +27,6 @@ SELECT * FROM bus_visit_info WHERE order_id = #{orderId} and DATE_FORMAT(in_time,'%Y-%m-%d') = CURRENT_DATE + limit 1 \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/BlackPictureRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/BlackPictureRequest.java new file mode 100644 index 0000000..fc92701 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/BlackPictureRequest.java @@ -0,0 +1,14 @@ +package com.casic.missiles.modular.dto; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/29 19:26 + */ +@Data +public class BlackPictureRequest { + private String picUri; + private String serverIndexCode; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/CancelSubscribeRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/CancelSubscribeRequest.java new file mode 100644 index 0000000..e2d390a --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/CancelSubscribeRequest.java @@ -0,0 +1,15 @@ +package com.casic.missiles.modular.dto.hik; + +import lombok.Data; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/24 15:14 + */ +@Data +public class CancelSubscribeRequest { + private List eventTypes; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/CardInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/CardInfo.java new file mode 100644 index 0000000..341457d --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/CardInfo.java @@ -0,0 +1,24 @@ +package com.casic.missiles.modular.dto.hik; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/26 16:08 + */ +@Data +public class CardInfo { + //卡号,8~20个字符,支持数字和大写字母 + private String cardNo; + //人员ID,员工工号 + private String personId; + //人员所属组织IndexCode + private String orgIndexCode; + //卡片类型,默认是1:IC卡 + //1:IC卡 + //2:CPU卡 + //3:远距离卡 + //4:MIFARE卡 + private Number cardType; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/FaceRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/FaceRequest.java new file mode 100644 index 0000000..edc04bf --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/FaceRequest.java @@ -0,0 +1,16 @@ +package com.casic.missiles.modular.dto.hik; + +import lombok.Data; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/25 16:53 + */ +@Data +public class FaceRequest { + private String certificateNum; + private List indexCodes; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/HikRecvEvent.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/HikRecvEvent.java index a3e9845..1b2b2b1 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/HikRecvEvent.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/HikRecvEvent.java @@ -28,12 +28,12 @@ /** * 事件类型,用于判断所需接收到的事件类型 */ - public Long getEventType(){ + public Number getEventType(){ JSONObject jsonObject = (JSONObject)JSONObject.toJSON(params); //事件类别对应SecurityEventTypeEnum JSONArray eventTypeArray = (JSONArray)jsonObject.get("events"); JSONObject eventJsonObject = (JSONObject)JSONObject.toJSON(eventTypeArray.get(0)); - Long eventType = (Long) eventJsonObject.get("eventType"); + Number eventType = (Number) eventJsonObject.get("eventType"); return eventType; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonBatchDeleteRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonBatchDeleteRequest.java index 027d31d..9751929 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonBatchDeleteRequest.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonBatchDeleteRequest.java @@ -12,4 +12,6 @@ @Data public class PersonBatchDeleteRequest { private List personIds; + //删除人脸接口使用 + private String faceId; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonInfoRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonInfoRequest.java new file mode 100644 index 0000000..05dc9e1 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonInfoRequest.java @@ -0,0 +1,20 @@ +package com.casic.missiles.modular.dto.hik; + +import lombok.Data; + +import java.util.List; + +/** + * @Description: 获取员工照片请求实体 + * @Author: wangpeng + * @Date: 2022/8/25 16:53 + */ +@Data +public class PersonInfoRequest { + //获取员工详细信息使用 + private String paramName; + private List paramValue; + //获取照片使用 + private String picUri; + private String serverIndexCode; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonListRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonListRequest.java new file mode 100644 index 0000000..3f7149b --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonListRequest.java @@ -0,0 +1,16 @@ +package com.casic.missiles.modular.dto.hik; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/25 16:53 + */ +@Data +public class PersonListRequest { + private Number pageNo; + private Number pageSize; + + private String orderId; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/SearchPicturesRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/SearchPicturesRequest.java new file mode 100644 index 0000000..0a95966 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/SearchPicturesRequest.java @@ -0,0 +1,24 @@ +package com.casic.missiles.modular.dto.hik; + +import lombok.Data; + +import java.util.List; + +/** + * @Description: 以图搜图请求 + * @Author: wangpeng + * @Date: 2022/8/29 10:46 + */ +@Data +public class SearchPicturesRequest { + private String facePicBinaryData; + private String facePicUrl; + private List cameraIndexCodes; + private String startTime; + private String endTime; + //指定搜图的最小相似度,最小为1,最大为100 + private String minSimilarity; + private Number age; + //male-男性,female-女性 + private String sex; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/StaffCardRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/StaffCardRequest.java new file mode 100644 index 0000000..4052e6d --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/StaffCardRequest.java @@ -0,0 +1,20 @@ +package com.casic.missiles.modular.dto.hik; + +import lombok.Data; + +import java.util.List; + +/** + * @Description: 人员开卡请求实体 + * @Author: wangpeng + * @Date: 2022/8/26 16:05 + */ +@Data +public class StaffCardRequest { + //卡片开始有效时间,时间格式:yyyy-MM-dd + private String startDate; + //卡片截止有效时间,时间格式:yyyy-MM-dd,不能大于2037年12月31日 + private String endDate; + //cardList,待开卡列表,最大支持50张卡 + private List cardList; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/VisitorInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/VisitorInfo.java index 73aa316..b99f301 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/VisitorInfo.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/VisitorInfo.java @@ -14,7 +14,7 @@ //访客性别 //1: 男 //2: 女 - private String gender; + private Integer gender; //联系电话建议填写手机号码 private String phoneNo; //证件类型 diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/ApplyReasonGroupDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/ApplyReasonGroupDTO.java index 514f382..786143e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/ApplyReasonGroupDTO.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/ApplyReasonGroupDTO.java @@ -13,4 +13,6 @@ private String visitReason; //访问人数 private Integer quantity; + //占比 + private String ratio; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/AttendanceNumberDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/AttendanceNumberDTO.java new file mode 100644 index 0000000..a494321 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/AttendanceNumberDTO.java @@ -0,0 +1,24 @@ +package com.casic.missiles.modular.dto.statistics; + +import com.fasterxml.jackson.annotation.JsonIgnore; +import lombok.Data; + +/** + * @Description: 出勤人数统计实体 + * @Author: wangpeng + * @Date: 2022/8/31 19:24 + */ +@Data +public class AttendanceNumberDTO { + //日期维度,周、今日,入参 + @JsonIgnore + private String dateDimension; + + //日期,具体天/小时,出参 + private String date; + //出勤人数 + private String quantity; + //员工类型 + private String staffType; + +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/AvgMonthAndWeekGroupDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/AvgMonthAndWeekGroupDTO.java index 4366916..331a9a9 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/AvgMonthAndWeekGroupDTO.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/AvgMonthAndWeekGroupDTO.java @@ -2,8 +2,6 @@ import lombok.Data; -import java.util.Map; - /** * @Description: 平均每月和每周的数据实体 * @Author: wangpeng @@ -13,6 +11,4 @@ public class AvgMonthAndWeekGroupDTO { //入参 private String year; - //出参,key:事件类型,value:周和月数据平均值 - private Map map; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/GateStatusGroupResponse.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/GateStatusGroupResponse.java new file mode 100644 index 0000000..d16f4e5 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/GateStatusGroupResponse.java @@ -0,0 +1,16 @@ +package com.casic.missiles.modular.dto.statistics; + +import lombok.Data; + +/** + * @Description: 闸机/摄像机统计响应实体 + * @Author: wangpeng + * @Date: 2022/8/30 14:22 + */ +@Data +public class GateStatusGroupResponse { + //设备状态 + private String status; + //占比 + private String ratio; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/MonthAndWeekDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/MonthAndWeekDTO.java index 7482b2a..284115a 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/MonthAndWeekDTO.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/MonthAndWeekDTO.java @@ -9,7 +9,7 @@ */ @Data public class MonthAndWeekDTO { -// private String levelName; + private String levelName; private Integer monthQuantity; private Integer weekQuantity; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/OnDutyRatioDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/OnDutyRatioDTO.java new file mode 100644 index 0000000..4f6a65d --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/OnDutyRatioDTO.java @@ -0,0 +1,15 @@ +package com.casic.missiles.modular.dto.statistics; + +import lombok.Data; + +/** + * @Description: 在岗率统计实体 + * @Author: wangpeng + * @Date: 2022/9/2 21:24 + */ +@Data +public class OnDutyRatioDTO { + private String date; + private String quantity; + private String ratio; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/SecurityLevelAssessDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/SecurityLevelAssessDTO.java new file mode 100644 index 0000000..40a0738 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/SecurityLevelAssessDTO.java @@ -0,0 +1,15 @@ +package com.casic.missiles.modular.dto.statistics; + +import lombok.Data; + +/** + * @Description: 出勤人数统计实体 + * @Author: wangpeng + * @Date: 2022/8/31 19:24 + */ +@Data +public class SecurityLevelAssessDTO { + private String date; + private String quantity; + private Double score; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/SecurityScoreDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/SecurityScoreDTO.java index 304d169..f7bd4a2 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/SecurityScoreDTO.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/SecurityScoreDTO.java @@ -14,5 +14,5 @@ //楼层,出参 private String area; //评分,出参 - private String score; + private Double score; } 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 6a30786..e5e613d 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 @@ -8,6 +8,10 @@ public interface HikUri { //事件订阅 String EVENT_SUBSCRIBE = "/api/eventService/v1/eventSubscriptionByEventTypes"; + //事件订阅信息查询 + String EVENT_INFO = "/api/eventService/v1/eventSubscriptionView"; + //事件订阅取消 + String EVENT_CANCEL = "/api/eventService/v1/eventUnSubscriptionByEventTypes"; //预约免登记 String APPOINTMENT_FREE_REGISTER = "/api/visitor/v1/appointment/registration"; //修改访客预约 @@ -32,8 +36,18 @@ String PERSON_SINGLE_UPDATE = "/api/resource/v1/person/single/update"; //批量删除人员 String PERSON_BATCH_DELETE = "/api/resource/v1/person/batch/delete"; + //根据人脸Id删除人脸 + String PERSON_SINGLE_DELETE = "/api/resource/v1/face/single/delete"; //门禁点反控 String DOOR_CONTROL = "/api/acs/v1/door/doControl"; //查询海康门禁点事件v2 String DOOR_EVENTS = "/api/acs/v2/door/events"; + //批量开卡 + String CARD_BINDING = "/api/cis/v1/card/binding"; + //提取人员照片 + String PERSON_PICTURE = "/api/resource/v1/person/picture"; + //根据人员唯一字段获取人员详细信息 + String PERSON_INFO = "/api/resource/v1/person/condition/personInfo"; + //以图搜图 + String SEARCH_PICTURES = "/api/frs/v1/application/captureSearch"; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/enums/SecurityEventType.java b/casic-server/src/main/java/com/casic/missiles/modular/enums/SecurityEventType.java index d51034c..42eacf8 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/enums/SecurityEventType.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/enums/SecurityEventType.java @@ -14,18 +14,27 @@ Number PERSONNEL_GATHER_EVENT = 131593; //监控点离线事件 Number MONITORING_POINT_OFFLINE = 889196545; + //监控点上线事件 + Number MONITORING_POINT_ONLINE = 889196546; //装置离线 Number DEVICE_OFFLINE = 199710; + //装置连线 + Number DEVICE_ONLINE = 199711; //访客登记 Number VISITOR_REGISTER = 1392513025; //访客签离 Number VISITOR_CHECKOUT = 1392513026; + //高空抛物 + Number HIGH_ALTITUDE_PARABOLIC = 930335; + //下面两个查询海康门禁点事件使用 //合法卡比对通过 Number CARD_COMPARE_PASS = 198914; //人脸认证通过 Number FACE_COMPARE_PASS = 196893; + + // //正常开门 // Number NORMAL_OPENING = 198913; // //按钮开门 @@ -46,7 +55,6 @@ // Number FIREWORKS_DETECTION = 192514; // //陌生人识别事件 // Number STRANGER_RECOGNITION = 1644171265; -// //高空抛物 -// Number HIGH_ALTITUDE_PARABOLIC = 930335; + } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/job/CockpitJob.java b/casic-server/src/main/java/com/casic/missiles/modular/job/CockpitJob.java index 7490a27..85dd016 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/job/CockpitJob.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/job/CockpitJob.java @@ -79,14 +79,6 @@ } }); } - } - /** - * 机动力量实时在岗率,在岗人数除以总应在岗人数,功能待定 - */ -// @Scheduled(cron = "0 0/1 * * * ?") - public void BeOnDutyRatio() { - - } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/service/HikCaseDefineService.java b/casic-server/src/main/java/com/casic/missiles/modular/service/HikCaseDefineService.java index d9bb3a9..18e2936 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/service/HikCaseDefineService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/service/HikCaseDefineService.java @@ -9,5 +9,5 @@ * @Date: 2022/7/21 17:20 */ public interface HikCaseDefineService extends IService { - HikCaseDefine getHikCaseDefine(Long caseTypeCode); + HikCaseDefine getHikCaseDefine(Number caseTypeCode); } 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 dd24101..bcc3b5d 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 @@ -18,6 +18,8 @@ CaseInfo monitorPointOfflineHandle(JSONObject event, CaseInfo caseInfo); + void monitorPointOnlineHandle(JSONObject event); + CaseInfo deviceOfflineHandle(JSONObject event, CaseInfo caseInfo); void propertyAttendanceHandle(JSONObject event); @@ -27,4 +29,6 @@ void visitorRegisterHandler(JSONObject event); void visitorCheckOutHandler(JSONObject event); + + void deviceOnlineHandle(JSONObject event); } 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 e55c016..01870bd 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.StaffCardRequest; import com.casic.missiles.modular.model.StaffInfo; import java.util.List; @@ -28,4 +29,6 @@ StaffInfo selectStaffInfoByCode(StaffInfo staffInfo); List staffInfoList(StaffInfoRequest staffInfoRequest); + + int saveCardInfo(StaffCardRequest staffCardRequest); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/BlackListController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/BlackListController.java index a27f9f8..0c06661 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/BlackListController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/BlackListController.java @@ -1,13 +1,18 @@ package com.casic.missiles.modular.controller; +import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.base.controller.ExportController; import com.casic.missiles.core.page.PageFactory; import com.casic.missiles.model.response.ResponseData; import com.casic.missiles.modular.dto.BlackInfoRequest; +import com.casic.missiles.modular.dto.BlackPictureRequest; +import com.casic.missiles.modular.dto.hik.PersonInfoRequest; +import com.casic.missiles.modular.enums.HikUri; import com.casic.missiles.modular.enums.OperateTypeEnum; import com.casic.missiles.modular.model.BlackInfo; import com.casic.missiles.modular.service.BlackInfoService; +import com.casic.missiles.modular.util.HikUtil; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; @@ -56,4 +61,22 @@ return null; } + /** + * 黑名单人员照片 + */ + @PostMapping("/personPicture") + @ResponseBody + public Object personPicture(@RequestBody BlackPictureRequest blackPictureRequest){ + //获取照片 + String picUri = blackPictureRequest.getPicUri(); + String serverIndexCode = blackPictureRequest.getServerIndexCode(); + PersonInfoRequest picRequest = new PersonInfoRequest(); + picRequest.setPicUri(picUri); + picRequest.setServerIndexCode(serverIndexCode); + String reBody = JSONObject.toJSONString(picRequest); + //重定向地址获取 + String url = HikUtil.hikApiFor302(HikUri.PERSON_PICTURE, reBody); + return ResponseData.success(url); + } + } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/DeviceController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/DeviceController.java index e1c4eba..666bbee 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/DeviceController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/DeviceController.java @@ -107,7 +107,7 @@ } /** - * 设备维修管理查询(分页),需计算MTTR=总维修时间/故障次数 + * 设备状态计算与评判/设备维修管理查询(分页),需计算MTTR=总维修时间/故障次数 */ @PostMapping("/repair/listPage") @ResponseBody @@ -211,7 +211,7 @@ //需根据设备编号获取到对应的门禁点唯一标识 doorControlRequest.setDoorIndexCodes(indexCodes); doorControlRequest.setControlType(Integer.valueOf(gateGroupDTO.getStatus())); - String body = JSONObject.toJSONString(deviceCodes); + String body = JSONObject.toJSONString(doorControlRequest); String resultStr = HikUtil.hikApi(HikUri.DOOR_CONTROL, body); JSONObject resultJson = (JSONObject)JSONObject.parse(resultStr); if (!"0".equals(resultJson.get("code"))) { diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/StaffController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/StaffController.java index b58ccab..704093c 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/StaffController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/StaffController.java @@ -2,15 +2,21 @@ import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.util.StrUtil; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.base.controller.ExportController; import com.casic.missiles.core.page.PageFactory; import com.casic.missiles.model.response.ErrorResponseData; import com.casic.missiles.model.response.ResponseData; import com.casic.missiles.modular.dto.StaffInfoRequest; +import com.casic.missiles.modular.dto.hik.PersonInfoRequest; +import com.casic.missiles.modular.dto.hik.StaffCardRequest; +import com.casic.missiles.modular.enums.HikUri; import com.casic.missiles.modular.enums.OperateTypeEnum; import com.casic.missiles.modular.model.StaffInfo; import com.casic.missiles.modular.service.StaffInfoService; +import com.casic.missiles.modular.util.HikUtil; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; @@ -110,4 +116,60 @@ } return ResponseData.success(); } + + /** + * 批量开卡,添加人员之后调用,若在一个接口中添加人员成功开卡失败则第二次添加时会有问题 + */ + @PostMapping("/cardBinding") + @ResponseBody + public Object cardBinding(@RequestBody StaffCardRequest staffCardRequest) { + String body = JSONObject.toJSONString(staffCardRequest); + String resultStr = HikUtil.hikApi(HikUri.CARD_BINDING, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (!"0".equals(resultJson.get("code"))) { + log.error("请求海康,批量开卡失败,海康response:{}", resultStr); + return ResponseData.error("批量开卡失败"); + } + //保存卡号 + if(staffInfoService.saveCardInfo(staffCardRequest) > 0){ + return ResponseData.success(); + } + return ResponseData.error("批量开卡失败"); + } + + /** + * 获取员工照片,海康存储 + */ + @PostMapping("/personPicture/{staffCode}") + @ResponseBody + public Object personPicture(@PathVariable("staffCode") String staffCode){ + //获取员工详细信息,含图片服务器、uri + PersonInfoRequest request = new PersonInfoRequest(); + List list = new ArrayList<>(); + list.add(staffCode); + request.setParamName("personId"); + request.setParamValue(list); + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi(HikUri.PERSON_INFO, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (!"0".equals(resultJson.get("code"))) { + log.error("请求海康,根据人员唯一字段获取人员详细信息失败,海康response:{}", resultStr); + return ResponseData.error("获取员工照片失败"); + } + //获取照片 + JSONObject data = (JSONObject) resultJson.get("data"); + JSONArray dataArray = (JSONArray) data.get("list"); + JSONObject jsonObject = (JSONObject) dataArray.get(0); + JSONArray personPhoto = (JSONArray) jsonObject.get("personPhoto"); + JSONObject photo = (JSONObject) personPhoto.get(0); + String picUri = photo.getString("picUri"); + String serverIndexCode = photo.getString("serverIndexCode"); + PersonInfoRequest picRequest = new PersonInfoRequest(); + picRequest.setPicUri(picUri); + picRequest.setServerIndexCode(serverIndexCode); + String reBody = JSONObject.toJSONString(picRequest); + //重定向地址获取 + String url = HikUtil.hikApiFor302(HikUri.PERSON_PICTURE, reBody); + return ResponseData.success(url); + } } 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 4a07dd9..7b1dcf6 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 @@ -16,6 +16,7 @@ import com.casic.missiles.modular.redis.key.CacheKeys; import com.casic.missiles.modular.service.CockpitService; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.util.CollectionUtils; import org.springframework.web.bind.annotation.*; @@ -24,10 +25,7 @@ import java.text.NumberFormat; import java.time.LocalDateTime; import java.time.temporal.ChronoUnit; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.util.*; import java.util.stream.Collectors; /** @@ -73,6 +71,9 @@ private StatisticNumberMapper numberMapper; @Autowired + private HazardLevelMapper hazardLevelMapper; + + @Autowired private AccessGroupConfig accessGroupConfig; /** @@ -104,8 +105,24 @@ public Object buildingNumberPerHour(){ //当天按小时分组的人数 List list = numberMapper.selectListByTime(); - Map> collect = list.stream().collect(Collectors.groupingBy(BuildingNumberDTO::getStatisticPosition)); - return ResponseData.success(collect); + Map> collect = list.stream().collect(Collectors.groupingBy(BuildingNumberDTO::getStatisticTime)); + //定时任务中已将每小时三栋楼人数存到数据库 + //将一期主楼和录制楼人数合并,二期单算 + List> resultList = new ArrayList<>(); + collect.keySet().forEach(key -> { + List buildingNumberDTOS = collect.get(key); + BuildingNumberDTO mainBuildingOne = buildingNumberDTOS.get(0); + BuildingNumberDTO mainBuildingTwo = buildingNumberDTOS.get(1); + BuildingNumberDTO recordingBuilding = buildingNumberDTOS.get(2); + HashMap resultMap = new HashMap<>(); + Integer oneQuantity = Integer.valueOf(mainBuildingOne.getStatisticQuantity()); + Integer recordingQuantity = Integer.valueOf(recordingBuilding.getStatisticQuantity()); + resultMap.put("staticTime", mainBuildingOne.getStatisticTime()); + resultMap.put(mainBuildingOne.getStatisticPositionName()+"、"+recordingBuilding.getStatisticPositionName(), String.valueOf(oneQuantity+recordingQuantity)); + resultMap.put(mainBuildingTwo.getStatisticPositionName(), mainBuildingTwo.getStatisticQuantity()); + resultList.add(resultMap); + }); + return ResponseData.success(resultList); } /** @@ -151,12 +168,11 @@ public Object securityNumber() { QueryWrapper wrapper = new QueryWrapper<>(); wrapper.eq("staff_type", 2); + // TODO: 2022/9/2 后续使用产品确定的每天出勤的安保人员的数量 Integer total = staffInfoMapper.selectCount(wrapper); - //当日离岗事件个数 - QueryWrapper wrapper1 = new QueryWrapper<>(); - wrapper1.eq("hik_event_type", SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); - wrapper1.apply("date_format(now(),'%Y-%m-%d') = date_format(happen_time,'%Y-%m-%d')"); - Integer leave = caseInfoMapper.selectCount(wrapper1); + //当日离岗事件按设备去重后的个数 + // TODO: 2022/9/2 目前相当于24小时内的计算,之后看需要可改成自定义小时数计算离岗率,即离岗+6小时内仅一次离岗则恢复为100%,多次则累加离岗次数计算离岗率 + Integer leave = caseInfoMapper.selectDemobilizedCount(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); NumberFormat numberFormat = NumberFormat.getInstance(); // 设置精确到小数点后2位 numberFormat.setMaximumFractionDigits(2); @@ -179,7 +195,6 @@ @ResponseBody public Object visitorApplyDetail() { List reasonGroup = applyMapper.selectByVisitReason(); - HashMap resultMap = new HashMap<>(); NumberFormat numberFormat = NumberFormat.getInstance(); // 设置精确到小数点后2位 numberFormat.setMaximumFractionDigits(2); @@ -187,12 +202,17 @@ if(0 == sum){ return ResponseData.success(); } + List resultList = new ArrayList<>(); reasonGroup.forEach(group -> { String reasonName = dictService.getDictNameByCode(SecurityEventDict.VISIT_REASON, group.getVisitReason()); String result = numberFormat.format((float) group.getQuantity() / (float) sum * 100); - resultMap.put(reasonName, result+"%"); + ApplyReasonGroupDTO applyReasonGroupDTO = new ApplyReasonGroupDTO(); + applyReasonGroupDTO.setQuantity(group.getQuantity()); + applyReasonGroupDTO.setVisitReason(reasonName); + applyReasonGroupDTO.setRatio(result+"%"); + resultList.add(applyReasonGroupDTO); }); - return ResponseData.success(resultMap); + return ResponseData.success(resultList); } /** @@ -247,6 +267,32 @@ } /** + * 机动力量实时在岗率,在岗人数除以总应在岗人数,用离岗+6小时内恢复为100%,6小时外再计算 + */ + @GetMapping("/staff/beOnDutyRatio") + @ResponseBody + public Object beOnDutyRatio() { + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("staff_type", 2); + // TODO: 2022/9/2 后续使用产品确定的每天出勤的安保人员的数量 + Integer total = staffInfoMapper.selectCount(wrapper); + if(0 == total){ + return ResponseData.success(null); + } + //当日离岗事件按设备去重后的个数 + // TODO: 2022/9/2 目前相当于24小时内的计算,之后看需要可改成自定义小时数计算离岗率,即离岗+6小时内仅一次离岗则恢复为100%,多次则累加离岗次数计算离岗率 + List onDutyRatioDTOS = caseInfoMapper.selectDemobilizedCountByHour(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); + onDutyRatioDTOS.forEach(dto -> { + NumberFormat numberFormat = NumberFormat.getInstance(); + // 设置精确到小数点后2位 + numberFormat.setMaximumFractionDigits(2); + String result = numberFormat.format(100 - Float.valueOf(dto.getQuantity()) / (float) total * 100); + dto.setRatio(result+"%"); + }); + return ResponseData.success(onDutyRatioDTOS); + } + + /** * 闸机速通门统计-设备状态分组计算数量,devType传闸机字典key * 视频频监控摄像机统计-设备状态分组计算数量,devType传摄像头字典key */ @@ -262,12 +308,17 @@ if(sum <= 0){ return ResponseData.error("无该类设备信息"); } + List resultList = new ArrayList<>(); gateStatusGroup.forEach(group -> { String devStatus = dictService.getDictNameByCode(SecurityEventDict.DEVICE_STATUS, group.getStatus()); String result = numberFormat.format((float) group.getQuantity() / (float) sum * 100); - resultMap.put(devStatus, result+"%"); + GateStatusGroupResponse gateStatusGroupResponse = new GateStatusGroupResponse(); + gateStatusGroupResponse.setStatus(devStatus); + gateStatusGroupResponse.setRatio(result+"%"); + resultList.add(gateStatusGroupResponse); }); - resultMap.put("总", sum); + resultMap.put("total", sum); + resultMap.put("list", resultList); return ResponseData.success(resultMap); } @@ -282,17 +333,38 @@ String position = securityScoreDTO.getPosition(); List caseInfos = caseInfoMapper.selectByPosition(position); //查询各危险级别权重、各类别权重,放入map,避免循环中多次查数据库 - + HashMap hazardScoreMap = new HashMap<>(); + List caseHazardLevelList = hazardLevelMapper.getCaseHazardLevelList(null); + caseHazardLevelList.forEach(hazardLevel -> { + hazardScoreMap.put(hazardLevel.getCode(), hazardLevel.getWeight()); + }); + HashMap categoryScoreMap = new HashMap<>(); + List categoryLevelList = categoryLevelMapper.getCaseCategoryLevelList(null); + categoryLevelList.forEach(categoryLevel -> { + categoryScoreMap.put(categoryLevel.getCode(), categoryLevel.getWeight()); + }); + //事件按楼层分组,计算 List securityScoreDTOs = new ArrayList<>(); caseInfos.forEach(caseInfo -> { SecurityScoreDTO securityScoreDTO1 = new SecurityScoreDTO(); + securityScoreDTO1.setPosition(caseInfo.getPosition()); securityScoreDTO1.setArea(caseInfo.getArea()); - // TODO: 2022/8/4 楼层评分计算根据产品定义调整 -// caseInfo.get -// securityScoreDTO1.setScore(); + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); + Double score = 100 - Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + securityScoreDTO1.setScore(score); + securityScoreDTOs.add(securityScoreDTO1); }); - - return null; + 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); + }); + return ResponseData.success(securityScoreDTOs); } /** @@ -303,9 +375,13 @@ public Object SecurityFrequency(@RequestBody SecurityFrequencyDTO securityFrequencyDTO) { String year = securityFrequencyDTO.getYear(); String month = securityFrequencyDTO.getMonth(); - Integer quantity = caseInfoMapper.selectCountByMonth(year, month); - securityFrequencyDTO.setQuantity(quantity); - return ResponseData.success(securityFrequencyDTO); + if(!StringUtils.isEmpty(year) && StringUtils.isEmpty(month)){ + Integer quantity = caseInfoMapper.selectCountByMonth(year, month); + securityFrequencyDTO.setQuantity(quantity); + return ResponseData.success(securityFrequencyDTO); + } + List list = caseInfoMapper.selectPreMonthCount(); + return ResponseData.success(list); } } 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 ae4d770..f4f075c 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 @@ -1,20 +1,25 @@ package com.casic.missiles.modular.controller.cockpit; +import cn.hutool.core.date.DateUnit; import cn.hutool.core.date.DateUtil; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.casic.missiles.model.response.ResponseData; -import com.casic.missiles.modular.dao.AttendanceInfoMapper; -import com.casic.missiles.modular.dao.CaseInfoMapper; -import com.casic.missiles.modular.dao.HazardLevelMapper; -import com.casic.missiles.modular.dao.StaffInfoMapper; +import com.casic.missiles.modular.dao.*; +import com.casic.missiles.modular.dto.DeviceRepairLogDTO; +import com.casic.missiles.modular.dto.DeviceRepairRequest; import com.casic.missiles.modular.dto.statistics.*; +import com.casic.missiles.modular.enums.SecurityEventType; +import com.casic.missiles.modular.model.CaseCategoryLevel; import com.casic.missiles.modular.model.CaseHazardLevel; +import com.casic.missiles.modular.model.CaseInfo; import com.casic.missiles.modular.model.StaffInfo; +import com.casic.missiles.modular.service.DeviceInfoService; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.util.CollectionUtils; import org.springframework.web.bind.annotation.*; +import java.math.BigDecimal; import java.text.NumberFormat; import java.util.*; import java.util.stream.Collectors; @@ -40,6 +45,12 @@ @Autowired private HazardLevelMapper hazardLevelMapper; + @Autowired + private CategoryLevelMapper categoryLevelMapper; + + @Autowired + private DeviceInfoService deviceInfoService; + /** * 安防事件时域频次统计,每月的每天安防事件个数(原方案) * 月维度:展示每个月的每天的数据 @@ -89,15 +100,17 @@ List monthList = caseInfoMapper.selectPreMonthCountByYear(year); Map> collect = monthList.stream().collect(Collectors.groupingBy(PreMonthOrWeekCaseDTO::getHazardLevelCode)); HashMap strAvgMap = new HashMap<>(); + List resultList = new ArrayList<>(); for (String key : collect.keySet()) { List preMonthOrWeekCaseDTOS = collect.get(key); int sum = preMonthOrWeekCaseDTOS.stream().mapToInt(PreMonthOrWeekCaseDTO::getQuantity).sum(); //若年份是本年,则使用个安防级别数量/当前月份数 //若不是本年,除数为12 MonthAndWeekDTO monthAndWeekDTO = new MonthAndWeekDTO(); + String hazardName = hazardLevelMapper.selectHazardNameByCode(key); + monthAndWeekDTO.setLevelName(hazardName); if(year.equals(String.valueOf(DateUtil.thisYear()))){ monthAndWeekDTO.setMonthQuantity(sum / DateUtil.thisMonth()); -// monthAndWeekDTO.setLevelName(); strAvgMap.put(key, monthAndWeekDTO); }else{ monthAndWeekDTO.setMonthQuantity(sum / 12); @@ -113,27 +126,37 @@ if(year.equals(String.valueOf(DateUtil.thisYear()))){ if(!Objects.isNull(strAvgMap.get(key))){ MonthAndWeekDTO monthAndWeekDTO = strAvgMap.get(key); + String hazardName = hazardLevelMapper.selectHazardNameByCode(key); + monthAndWeekDTO.setLevelName(hazardName); monthAndWeekDTO.setWeekQuantity(sum / DateUtil.thisWeekOfYear()); strAvgMap.put(key, monthAndWeekDTO); }else{ MonthAndWeekDTO monthAndWeekDTO = new MonthAndWeekDTO(); + String hazardName = hazardLevelMapper.selectHazardNameByCode(key); + monthAndWeekDTO.setLevelName(hazardName); monthAndWeekDTO.setWeekQuantity(sum / DateUtil.thisWeekOfYear()); strAvgMap.put(key, monthAndWeekDTO); } }else{ if(!Objects.isNull(strAvgMap.get(key))){ MonthAndWeekDTO monthAndWeekDTO = strAvgMap.get(key); + String hazardName = hazardLevelMapper.selectHazardNameByCode(key); + monthAndWeekDTO.setLevelName(hazardName); monthAndWeekDTO.setWeekQuantity(sum / 52); strAvgMap.put(key, monthAndWeekDTO); }else{ MonthAndWeekDTO monthAndWeekDTO = new MonthAndWeekDTO(); + String hazardName = hazardLevelMapper.selectHazardNameByCode(key); + monthAndWeekDTO.setLevelName(hazardName); monthAndWeekDTO.setWeekQuantity(sum / 52); strAvgMap.put(key, monthAndWeekDTO); } } } - avgMonthAndWeekGroupDTO.setMap(strAvgMap); - return ResponseData.success(avgMonthAndWeekGroupDTO); + strAvgMap.keySet().forEach(key -> { + resultList.add(strAvgMap.get(key)); + }); + return ResponseData.success(resultList); } /** @@ -181,12 +204,178 @@ } /** - * 员工考勤人数变化,功能待定 + * 员工考勤人数变化,统计当天(横坐标为时)及近7天(横坐标为天)的考勤人数变化,只要发生一次考勤识别,次数的基数就正常增加(没有上班下班区分) */ + @PostMapping("/staff/attendanceNumber/{dimension}") + @ResponseBody + public Object attendanceNumber(@PathVariable("dimension") String dimension) { + List attendanceNumberDTOs = null; + List> resultList = new ArrayList<>(); + if("week".equals(dimension)){ + //近7天数据按天分组统计 + attendanceNumberDTOs = attendanceInfoMapper.getCountForWeek(); + }else if("day".equals(dimension)) { + //今天数据按小时分组统计 + attendanceNumberDTOs = attendanceInfoMapper.getCountForDay(); + } + if(CollectionUtils.isEmpty(attendanceNumberDTOs)){ + return ResponseData.error("该查询条件下,无员工出勤数据!"); + } + Map> collect = attendanceNumberDTOs.stream().collect(Collectors.groupingBy(AttendanceNumberDTO::getDate)); + collect.keySet().forEach(key -> { + List attendanceNumberDTOS = collect.get(key); + AttendanceNumberDTO attendanceNumberDTO = attendanceNumberDTOS.get(0); + AttendanceNumberDTO attendanceNumberDTO2 = attendanceNumberDTOS.get(1); + Map resultMap = new HashMap<>(); + resultMap.put(attendanceNumberDTO.getStaffType(), attendanceNumberDTO.getQuantity()); + resultMap.put(attendanceNumberDTO2.getStaffType(), attendanceNumberDTO2.getQuantity()); + resultMap.put("staticTime", attendanceNumberDTO.getDate()); + resultList.add(resultMap); + }); + return ResponseData.success(resultList); + } /** - * 近30天/近一周安保人员到岗排行 + * 早晚高峰区域安防评估 */ + @PostMapping("/security/assessment/{dimension}") + @ResponseBody + public Object securityAssessment(@PathVariable("dimension") String dimension) { + //查询各危险级别权重、各类别权重,放入map,避免循环中多次查数据库 + HashMap hazardScoreMap = new HashMap<>(); + List caseHazardLevelList = hazardLevelMapper.getCaseHazardLevelList(null); + caseHazardLevelList.forEach(hazardLevel -> { + hazardScoreMap.put(hazardLevel.getCode(), hazardLevel.getWeight()); + }); + HashMap categoryScoreMap = new HashMap<>(); + List categoryLevelList = categoryLevelMapper.getCaseCategoryLevelList(null); + categoryLevelList.forEach(categoryLevel -> { + categoryScoreMap.put(categoryLevel.getCode(), categoryLevel.getWeight()); + }); + HashMap hashMap = new HashMap<>(); + if("week".equals(dimension)){ + //近7天早晚高峰数据 + List caseInfos = caseInfoMapper.selectListBySevenDay(); + //按时间(天)进行分组 + caseInfos.forEach(caseInfo -> { + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); + Double score = Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + String[] array = caseInfo.getHappenTime().split(" "); + String dayTime = array[0]; + BigDecimal preScore; + if(hashMap.containsKey(dayTime)){ + Double aDouble = hashMap.get(dayTime); + preScore = new BigDecimal(aDouble.toString()); + + }else{ + preScore = new BigDecimal("100.0"); + } + BigDecimal nowScore = new BigDecimal(score.toString()); + hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); + }); + return ResponseData.success(hashMap); + }else if("day".equals(dimension)) { + //今天数据按小时分组统计 + List caseInfos = caseInfoMapper.selectListByToday(); + caseInfos.forEach(caseInfo -> { + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); + Double score = Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + String[] array = caseInfo.getHappenTime().split(":"); + String dayTime = array[0]; + BigDecimal preScore; + if(hashMap.containsKey(dayTime)){ + Double aDouble = hashMap.get(dayTime); + preScore = new BigDecimal(aDouble.toString()); + + }else{ + preScore = new BigDecimal("100.0"); + } + BigDecimal nowScore = new BigDecimal(score.toString()); + hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); + }); + return ResponseData.success(hashMap); + } + return null; + } + + /** + * 重点区域安防事态评估,统计重点区域6:00-23:00按小时分组数据 + */ + @GetMapping("/security/keyAreaStatistic") + @ResponseBody + public Object keyAreaStatistic() { + //查询各危险级别权重、各类别权重,放入map,避免循环中多次查数据库 + HashMap hazardScoreMap = new HashMap<>(); + List caseHazardLevelList = hazardLevelMapper.getCaseHazardLevelList(null); + caseHazardLevelList.forEach(hazardLevel -> { + hazardScoreMap.put(hazardLevel.getCode(), hazardLevel.getWeight()); + }); + HashMap categoryScoreMap = new HashMap<>(); + List categoryLevelList = categoryLevelMapper.getCaseCategoryLevelList(null); + categoryLevelList.forEach(categoryLevel -> { + categoryScoreMap.put(categoryLevel.getCode(), categoryLevel.getWeight()); + }); + HashMap hashMap = new HashMap<>(); + //今天数据按小时分组统计 + List caseInfos = caseInfoMapper.selectListByToday2(); + caseInfos.forEach(caseInfo -> { + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); + Double score = Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + String[] array = caseInfo.getHappenTime().split(":"); + String dayTime = array[0]; + BigDecimal preScore; + if(hashMap.containsKey(dayTime)){ + Double aDouble = hashMap.get(dayTime); + preScore = new BigDecimal(aDouble.toString()); + + }else{ + preScore = new BigDecimal("100.0"); + } + BigDecimal nowScore = new BigDecimal(score.toString()); + hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); + }); + return ResponseData.success(hashMap); + } + + /** + * 安防机动支援力量调配响应评估,根据事件已解决状态及已解决时间-发送时间,按时间(小时)分组统计 + */ + @GetMapping("/security/responseAssess") + @ResponseBody + public Object responseAssess() { + //查询各危险级别权重、各类别权重,放入map,避免循环中多次查数据库 + HashMap hazardScoreMap = new HashMap<>(); + List caseHazardLevelList = hazardLevelMapper.getCaseHazardLevelList(null); + caseHazardLevelList.forEach(hazardLevel -> { + hazardScoreMap.put(hazardLevel.getCode(), hazardLevel.getWeight()); + }); + HashMap hashMap = new HashMap<>(); + //今天数据按小时分组统计 + List caseInfos = caseInfoMapper.selectListByToday3(); + caseInfos.forEach(caseInfo -> { + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + //扣分=事件级别权重*未解决小时数 + Date updateTime = DateUtil.parse(caseInfo.getUpdateTime()); + Date happenTime = DateUtil.parse(caseInfo.getHappenTime()); + long between = DateUtil.between(updateTime, happenTime, DateUnit.HOUR); + Double score = Double.valueOf(hazardWeight)*between; + String[] array = caseInfo.getHappenTime().split(":"); + String dayTime = array[0]; + BigDecimal preScore; + if(hashMap.containsKey(dayTime)){ + Double aDouble = hashMap.get(dayTime); + preScore = new BigDecimal(aDouble.toString()); + }else{ + preScore = new BigDecimal("100.0"); + } + BigDecimal nowScore = new BigDecimal(score.toString()); + hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); + }); + return ResponseData.success(hashMap); + } /** * 重点区域威胁事件类型统计,优先级2,统计近7天和近30天 @@ -224,7 +413,34 @@ } /** - * 设备状态计算系数和评判,优先级3,需确认设备恢复时间是否可以获取 + * 近30天/近一周安保人员到岗排行 */ + + /** + * 安保等级评估,发生离岗事件减1分 + */ + @GetMapping("/security/levelAssess") + @ResponseBody + public Object securityLevelAssess() { + //今天数据按小时分组统计 + List resultList = caseInfoMapper.selectListByType(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); + resultList.forEach(result -> { + BigDecimal deScore = new BigDecimal(result.getQuantity()); + BigDecimal preScore = new BigDecimal("100.0"); + result.setScore(preScore.subtract(deScore).doubleValue()); + }); + return ResponseData.success(resultList); + } + + /** + * 设备状态计算系数和评判,即设备维修管理查询(不分页) + */ + @PostMapping("/device/repairList") + @ResponseBody + public Object repairList(@RequestBody DeviceRepairRequest deviceRepairRequest) { + List deviceRepairLogDTOS = deviceInfoService.deviceRepairListPage(deviceRepairRequest); + return ResponseData.success(deviceRepairLogDTOS); + } + } 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 fbf8ab6..c71a15a 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 @@ -1,13 +1,12 @@ package com.casic.missiles.modular.controller.hik; +import cn.hutool.core.date.DateTime; +import cn.hutool.core.date.DateUtil; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.casic.missiles.model.response.ResponseData; import com.casic.missiles.modular.dao.HikFaceGroupInfoMapper; -import com.casic.missiles.modular.dto.hik.EventSubscribeRequest; -import com.casic.missiles.modular.dto.hik.FaceGroupAdditionRequest; -import com.casic.missiles.modular.dto.hik.HikRecvEvent; -import com.casic.missiles.modular.dto.hik.OrgBatchAdd; +import com.casic.missiles.modular.dto.hik.*; import com.casic.missiles.modular.enums.HikUri; import com.casic.missiles.modular.enums.SecurityEventType; import com.casic.missiles.modular.model.CaseInfo; @@ -18,16 +17,20 @@ import com.casic.missiles.modular.util.CaseInfoFactoryUtil; import com.casic.missiles.modular.util.HikUtil; import com.casic.missiles.modular.util.ThreadPoolUtil; +import com.casic.missiles.modular.util.WebSocket; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; -import org.springframework.web.bind.annotation.*; +import org.springframework.util.CollectionUtils; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.RestController; -import java.net.InetAddress; -import java.net.UnknownHostException; import java.util.ArrayList; +import java.util.Iterator; import java.util.List; import java.util.Objects; @@ -38,7 +41,6 @@ */ @Slf4j @RestController -@RequestMapping("/hik") public class HikController { @Autowired @@ -53,28 +55,37 @@ @Autowired private HikService hikService; + @Autowired + private HikFaceGroupInfoMapper hikFaceGroupInfoMapper; + + @Autowired + private WebSocket webSocket; + @Value("${server.port}") private int serverPort; - @Autowired - private HikFaceGroupInfoMapper hikFaceGroupInfoMapper; /** * 海康事件订阅 */ - @PostMapping("/event/subscribe") + @PostMapping("/hik/event/subscribe") @ResponseBody - public Object eventSubscribe() throws UnknownHostException { + public Object eventSubscribe() { EventSubscribeRequest eventSubscribeRequest = new EventSubscribeRequest(); ArrayList list = new ArrayList<>(); list.add(SecurityEventType.DEVICE_OFFLINE); + list.add(SecurityEventType.DEVICE_ONLINE); list.add(SecurityEventType.KEY_PERSONNEL_IDENTIFY_EVENT); list.add(SecurityEventType.MONITORING_POINT_OFFLINE); + list.add(SecurityEventType.MONITORING_POINT_ONLINE); list.add(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); list.add(SecurityEventType.PERSONNEL_GATHER_EVENT); - InetAddress localHost = InetAddress.getLocalHost(); + list.add(SecurityEventType.VISITOR_REGISTER); + list.add(SecurityEventType.VISITOR_CHECKOUT); + list.add(SecurityEventType.HIGH_ALTITUDE_PARABOLIC); +// InetAddress localHost = InetAddress.getLocalHost(); eventSubscribeRequest.setEventTypes(list); - eventSubscribeRequest.setEventDest("https://" + localHost + ":" + serverPort + "/eventRcv"); + eventSubscribeRequest.setEventDest("http://" + "192.168.10.6" + ":" + serverPort + "/eventRcv"); //订阅类型,0-订阅原始事件,1-联动事件,2-原始事件和联动事件,不填使用默认值0 eventSubscribeRequest.setSubType(0); /** @@ -92,19 +103,25 @@ } /** + * 查询事件订阅信息 + */ + @PostMapping("/hik/event/query") + @ResponseBody + public Object eventQuery() { + String result = HikUtil.hikApi(HikUri.EVENT_INFO, ""); + return result; + } + + /** * 海康事件接收 */ @PostMapping("/eventRcv") @ResponseBody public Object eventRcv(@RequestBody HikRecvEvent hikRecvEvent) { //1、接收所需事件类型 - Long eventType = hikRecvEvent.getEventType(); + Number eventType = hikRecvEvent.getEventType(); log.info("接收到安防事件类型为:{}", eventType); CaseInfo caseInfo = caseInfoFactoryUtil.getCaseInfo(eventType); - //接收到不关心事件直接返回 - if(Objects.isNull(caseInfo)){ - return ResponseData.success(); - } //2、不同事件不同处理,caseInfoFactoryUtil已设置好事件基础定义信息 // 再为事件添加状态、设备编码、设备名称、位置、区域、时间 // 异步处理事件 @@ -114,19 +131,23 @@ caseHandle(hikRecvEvent, eventType, caseInfo); } })); +// caseHandle(hikRecvEvent, eventType, caseInfo); - return null; + return ResponseData.success(); } - private void caseHandle(HikRecvEvent hikRecvEvent, Long eventType, CaseInfo caseInfo) { + private void caseHandle(HikRecvEvent hikRecvEvent, Number eventType, CaseInfo caseInfo) { JSONArray eventArray = hikRecvEvent.getEventArray(); List caseInfos = new ArrayList<>(); - while (eventArray.stream().iterator().hasNext()) { + Iterator iterator = eventArray.iterator(); + while (iterator.hasNext()) { CaseInfo caseInfo1 = new CaseInfo(); - BeanUtils.copyProperties(caseInfo, caseInfo1); - JSONObject event = (JSONObject) eventArray.stream().iterator().next(); + if(!Objects.isNull(caseInfo)){ + BeanUtils.copyProperties(caseInfo, caseInfo1); + } + JSONObject event = (JSONObject) iterator.next(); //5种事件进行不同处理 - if(SecurityEventType.KEY_PERSONNEL_IDENTIFY_EVENT == eventType){ + if (SecurityEventType.KEY_PERSONNEL_IDENTIFY_EVENT.equals(eventType)) { //判断所属人脸分组 JSONObject data = (JSONObject) event.get("data"); JSONObject faceRecognitionResult = (JSONObject) data.get("faceRecognitionResult"); @@ -142,52 +163,101 @@ if (faceGroupCode.equals(blackListGroup.getFaceGroupCode())) { //黑名单分组处理 caseInfo1 = hikService.blackListHandle(event, caseInfo1); - }else if(faceGroupCode.equals(propertyPersonnelGroup.getFaceGroupCode())){ + } else if (faceGroupCode.equals(propertyPersonnelGroup.getFaceGroupCode())) { //考勤分组处理-物业人员,添加到考勤表 hikService.propertyAttendanceHandle(event); - }else if(faceGroupCode.equals(securityPersonnelGroup.getFaceGroupCode())){ + } else if (faceGroupCode.equals(securityPersonnelGroup.getFaceGroupCode())) { //考勤分组处理-安保人员,添加到考勤表 hikService.securityPersonnelHandle(event); - }else { + } else { return; } - }else if(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT == eventType){ + } else if (SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT.equals(eventType)) { //离岗事件处理 caseInfo1 = hikService.demobilizedHandle(event, caseInfo1); - }else if(SecurityEventType.PERSONNEL_GATHER_EVENT == eventType){ + } else if (SecurityEventType.PERSONNEL_GATHER_EVENT.equals(eventType)) { //人员聚集事件处理 caseInfo1 = hikService.personGatherHandle(event, caseInfo1); - }else if(SecurityEventType.MONITORING_POINT_OFFLINE == eventType){ + } else if (SecurityEventType.MONITORING_POINT_OFFLINE.equals(eventType)) { //监控点离线事件处理 caseInfo1 = hikService.monitorPointOfflineHandle(event, caseInfo1); - }else if(SecurityEventType.DEVICE_OFFLINE == eventType){ + } else if (SecurityEventType.MONITORING_POINT_ONLINE.equals(eventType)) { + //监控点上线事件处理 + hikService.monitorPointOnlineHandle(event); + } else if (SecurityEventType.DEVICE_OFFLINE.equals(eventType)) { //装置离线事件处理 caseInfo1 = hikService.deviceOfflineHandle(event, caseInfo1); - }else if(SecurityEventType.VISITOR_REGISTER == eventType){ + } else if (SecurityEventType.DEVICE_ONLINE.equals(eventType)) { + //装置上线处理 + hikService.deviceOnlineHandle(event); + } else if (SecurityEventType.VISITOR_REGISTER.equals(eventType)) { //记录访客登记记录,添加到访客记录表 hikService.visitorRegisterHandler(event); - }else if(SecurityEventType.VISITOR_CHECKOUT == eventType){ + } else if (SecurityEventType.VISITOR_CHECKOUT.equals(eventType)) { //记录访客签离记录 hikService.visitorCheckOutHandler(event); } - if(!Objects.isNull(caseInfo1) && !StringUtils.isEmpty(caseInfo1.getHappenTime())){ + if (!Objects.isNull(caseInfo1) && !StringUtils.isEmpty(caseInfo1.getHappenTime())) { caseInfos.add(caseInfo1); } } //3、安防事件入库 - if(!caseInfoService.insertCaseInfoBatch(caseInfos)){ - log.error("安防事件批量入库异常"); + if (!CollectionUtils.isEmpty(caseInfos) && !caseInfoService.insertCaseInfoBatch(caseInfos)) { + log.error("安防事件批量入库异常!"); } // TODO: 2022/8/15 webSocket推送 + if (CollectionUtils.isEmpty(caseInfos)) { + log.info("webSocket事件推送"); + webSocket.sendAllMessage(JSONObject.toJSONString(caseInfos)); + } return; } /** + * 以图搜图,前端用于轨迹追踪 + */ + @PostMapping("/hik/search/picture") + @ResponseBody + public Object searchPictures(@RequestBody SearchPicturesRequest searchPicturesRequest) { + DateTime startDateTime = DateUtil.parse(searchPicturesRequest.getStartTime()); + DateTime endDateTime = DateUtil.parse(searchPicturesRequest.getEndTime()); + String startTime = DateUtil.format(startDateTime, "yyyy-MM-dd'T'HH:mm:ss.SSSXXX"); + String endTime = DateUtil.format(endDateTime, "yyyy-MM-dd'T'HH:mm:ss.SSSXXX"); + searchPicturesRequest.setStartTime(startTime); + searchPicturesRequest.setEndTime(endTime); + String body = JSONObject.toJSONString(searchPicturesRequest); + String resultStr = HikUtil.hikApi(HikUri.SEARCH_PICTURES, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (!"0".equals(resultJson.get("code"))) { + log.error("请求海康,以图搜图失败,海康response:{}", resultStr); + return ResponseData.error("以图搜图失败"); + } + return ResponseData.success(resultJson); + } + + + /** + * 海康事件取消订阅 + */ + @PostMapping("/hik/event/cancel") + @ResponseBody + public Object eventCancelSubscribe(@RequestBody CancelSubscribeRequest cancelSubscribeRequest) { + String body = JSONObject.toJSONString(cancelSubscribeRequest); + String resultStr = HikUtil.hikApi(HikUri.EVENT_CANCEL, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (!"0".equals(resultJson.get("code"))) { + log.error("请求海康,取消订阅失败,海康response:{}", resultStr); + return ResponseData.error("取消订阅失败"); + } + return ResponseData.success(resultJson); + } + + /** * 单个添加海康人脸分组 * api->hik单个添加人脸分组api->response->mysql */ - @PostMapping("/faceGroup/single/add") + @PostMapping("/hik/faceGroup/single/add") @ResponseBody public Object faceGroupAddition(@RequestBody FaceGroupAdditionRequest faceGroupAdditionRequest) { String body = JSONObject.toJSONString(faceGroupAdditionRequest); @@ -212,7 +282,7 @@ * 批量添加海康组织 * api->hik批量添加组织api->response */ - @PostMapping("/org/batch/add") + @PostMapping("/hik/org/batch/add") @ResponseBody public Object orgBatchAdd(@RequestBody List orgBatchAddRequest) { String body = JSONObject.toJSONString(orgBatchAddRequest); @@ -232,4 +302,62 @@ return ResponseData.error("批量添加组织失败"); } + /** + * 获取人员列表 + */ + @PostMapping("/hik/person/personList") + @ResponseBody + public Object personList() { + PersonListRequest request = new PersonListRequest(); + request.setPageNo(1); + request.setPageSize(100); + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi("/api/resource/v2/person/personList", body); + return resultStr; + } + + /** + * 获取组织列表 + */ + @PostMapping("/hik/org/orgList") + @ResponseBody + public Object orgList() { + PersonListRequest request = new PersonListRequest(); + request.setPageNo(1); + request.setPageSize(100); + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi("/api/resource/v1/org/orgList", body); + return resultStr; + } + + /** + * 查询访客权限下载记录 + */ + @PostMapping("/hik/auth/result") + @ResponseBody + public Object authResult() { + PersonListRequest request = new PersonListRequest(); + request.setPageNo(1); + request.setPageSize(100); + request.setOrderId("ba101db6246711edaea66f7939a13638"); + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi("/api/visitor/v1/auth/result", body); + return resultStr; + } + + /** + * 人脸图片获取 + */ + @PostMapping("/hik/face/picture") + @ResponseBody + public Object facePicture() { + FaceRequest request = new FaceRequest(); +// List list = new ArrayList<>(); +// list.add(""); + request.setCertificateNum("wanggong"); + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi("/api/frs/v1/face", body); + return resultStr; + } + } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/AssetInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/AssetInfoMapper.java index 4f64e83..c0684ee 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/AssetInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/AssetInfoMapper.java @@ -17,6 +17,6 @@ @Mapper public interface AssetInfoMapper extends BaseMapper { - List getAssetInfoListPage(@Param("page") Page page, AssetInfoRequest assetInfoRequest); + List getAssetInfoListPage(@Param("page") Page page, @Param("assetInfoRequest") AssetInfoRequest assetInfoRequest); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/AttendanceInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/AttendanceInfoMapper.java index f9e793e..ec87e46 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/AttendanceInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/AttendanceInfoMapper.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.statistics.AttendanceNumberDTO; import com.casic.missiles.modular.dto.statistics.AttendanceRatioDTO; import com.casic.missiles.modular.model.AttendanceInfo; import org.apache.ibatis.annotations.Mapper; @@ -17,7 +18,7 @@ */ @Mapper public interface AttendanceInfoMapper extends BaseMapper { - List getAttendanceInfoListPage(@Param("page") Page page, StaffInfoRequest attendanceInfoRequest); + List getAttendanceInfoListPage(@Param("page") Page page, @Param("attendanceInfoRequest") StaffInfoRequest attendanceInfoRequest); AttendanceInfo selectByCodeAndDate(@Param("staffCode") String staffCode); @@ -26,4 +27,8 @@ List getCountByTypeAndDateForMonth(@Param("staffType")String staffType); List getCountByTypeAndDateForYear(@Param("staffType")String staffType); + + List getCountForWeek(); + + List getCountForDay(); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java index ce94b8f..6137a7d 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java @@ -17,5 +17,5 @@ @Mapper public interface BlackInfoMapper extends BaseMapper { - List getBlackInfoListPage(@Param("page") Page page, BlackInfoRequest blackInfoRequest); + List getBlackInfoListPage(@Param("page") Page page, @Param("blackInfoRequest") BlackInfoRequest blackInfoRequest); } 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 efda6b3..50aaa6f 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 @@ -20,7 +20,7 @@ List getCaseInfoListPage(@Param("page") Page page, @Param("caseInfoRequest") CaseInfoRequest caseInfoRequest); - int updateStatusById(CaseInfoRequest caseInfoRequest); + int updateStatusById(@Param("caseInfoRequest") CaseInfoRequest caseInfoRequest); List selectByLevelAndMonth(@Param("year") String year); @@ -47,4 +47,20 @@ List selectPreWeekCountByThirtyDay(); List selectPreDayCountBySevenDay(); + + Integer selectDemobilizedCount(@Param("eventType") Number personnelDemobilizedEvent); + + List selectPreMonthCount(); + + List selectListBySevenDay(); + + List selectListByToday(); + + List selectListByToday2(); + + List selectListByToday3(); + + List selectListByType(@Param("eventType") Number eventType); + + List selectDemobilizedCountByHour(@Param("eventType") Number eventType); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/CategoryLevelMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/CategoryLevelMapper.java index 52fc714..afe1650 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/CategoryLevelMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/CategoryLevelMapper.java @@ -17,9 +17,9 @@ @Mapper public interface CategoryLevelMapper extends BaseMapper { - List getCaseCategoryLevelListPage(@Param("page") Page page, CategoryLevelRequest categoryLevelRequest); + List getCaseCategoryLevelListPage(@Param("page") Page page, @Param("categoryLevelRequest") CategoryLevelRequest categoryLevelRequest); - List getCaseCategoryLevelList(CategoryLevelRequest categoryLevelRequest); + List getCaseCategoryLevelList(@Param("categoryLevelRequest") CategoryLevelRequest categoryLevelRequest); CaseCategoryLevel getCaseCategoryLevel(@Param("categoryLevelCode") String categoryLevelCode); 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 66353b1..2555a09 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 @@ -19,7 +19,7 @@ @Mapper public interface DeviceInfoMapper extends BaseMapper { - List getDeviceInfoListPage(@Param("page") Page page, DeviceInfoRequest deviceInfoRequest); + List getDeviceInfoListPage(@Param("page") Page page, @Param("deviceInfoRequest") DeviceInfoRequest deviceInfoRequest); List getDeviceInfoList(@Param("deviceInfoRequest") DeviceInfoRequest deviceInfoRequest); @@ -27,6 +27,8 @@ DeviceInfo getByIndexCode(@Param("srcIndex") String srcIndex); + DeviceInfo getByIp(@Param("ip") String ip); + List selectIndexCodesByCodes(@Param("deviceCodes") List deviceCodes); List selectByType(@Param("devType") String devType); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java index 41dd0af..5bfaf63 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java @@ -5,6 +5,7 @@ import com.casic.missiles.modular.dto.DeviceRepairRequest; import com.casic.missiles.modular.model.DeviceRepairLog; import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; import java.util.List; @@ -16,7 +17,7 @@ @Mapper public interface DeviceRepairLogMapper extends BaseMapper { - List getDeviceRepairListPage(Page page, DeviceRepairRequest deviceRepairRequest); + List getDeviceRepairListPage(@Param("page") Page page, @Param("deviceRepairRequest")DeviceRepairRequest deviceRepairRequest); - List getDeviceRepairList(DeviceRepairRequest deviceRepairRequest); + List getDeviceRepairList(@Param("deviceRepairRequest") DeviceRepairRequest deviceRepairRequest); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java index 9035c47..4823ac1 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java @@ -18,7 +18,7 @@ @Mapper public interface FireEquipInfoMapper extends BaseMapper { - List getFireEquipInfoListPage(@Param("page") Page page, FireEquipRequest fireEquipRequest); + List getFireEquipInfoListPage(@Param("page") Page page, @Param("fireEquipRequest") FireEquipRequest fireEquipRequest); FireEquipInfo getFireEquipInfo(@Param("equipCode") String equipCode); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/GateGroupMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/GateGroupMapper.java index d8c330d..977a427 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/GateGroupMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/GateGroupMapper.java @@ -17,7 +17,7 @@ */ @Mapper public interface GateGroupMapper extends BaseMapper { - List getGateGroupListPage(@Param("page") Page page, GateGroupRequest gateGroupRequest); + List getGateGroupListPage(@Param("page") Page page, @Param("gateGroupRequest") GateGroupRequest gateGroupRequest); GateGroup getGateGroupByName(@Param("groupName") String groupName); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/HazardLevelMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/HazardLevelMapper.java index 8957780..dcf47bb 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/HazardLevelMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/HazardLevelMapper.java @@ -17,11 +17,13 @@ @Mapper public interface HazardLevelMapper extends BaseMapper { - List getCaseHazardLevelListPage(@Param("page") Page page, HazardLevelRequest hazardLevelRequest); + List getCaseHazardLevelListPage(@Param("page") Page page, @Param("hazardLevelRequest") HazardLevelRequest hazardLevelRequest); - List getCaseHazardLevelList(HazardLevelRequest hazardLevelRequest); + List getCaseHazardLevelList(@Param("hazardLevelRequest") HazardLevelRequest hazardLevelRequest); CaseHazardLevel getCaseHazardLevel(@Param("hazardLevelCode") String hazardLevelCode); List selectHazardName(); + + String selectHazardNameByCode(@Param("hazardLevelCode") String hazardLevelCode); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/HikCaseDefineMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/HikCaseDefineMapper.java index 0dc47d1..f162fef 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/HikCaseDefineMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/HikCaseDefineMapper.java @@ -12,5 +12,5 @@ */ @Mapper public interface HikCaseDefineMapper extends BaseMapper { - HikCaseDefine getHikCaseDefine(@Param("caseTypeCode") Long caseTypeCode); + HikCaseDefine getHikCaseDefine(@Param("caseTypeCode") Number caseTypeCode); } 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 f8a674c..fe5afc2 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 @@ -17,11 +17,13 @@ @Mapper public interface StaffInfoMapper extends BaseMapper { - List getStaffInfoListPage(@Param("page") Page page, StaffInfoRequest staffInfoRequest); + List getStaffInfoListPage(@Param("page") Page page, @Param("staffInfoRequest") StaffInfoRequest staffInfoRequest); StaffInfo selectByCode(@Param("staffCode") String staffCode); - List getStaffInfoList(StaffInfoRequest staffInfoRequest); + List getStaffInfoList(@Param("staffInfoRequest") StaffInfoRequest staffInfoRequest); - List selectBatchCodes(List list); + List selectBatchCodes(@Param("list") List list); + + int updateByCodeForCard(@Param("staffCode") String staffCode, @Param("cardNo") String cardNo); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitInfoMapper.java index b1217c5..6c52542 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitInfoMapper.java @@ -16,7 +16,7 @@ */ @Mapper public interface VisitInfoMapper extends BaseMapper { - List getVisitInfoListPage(@Param("page") Page page, VisitorRequest visitorRequest); + List getVisitInfoListPage(@Param("page") Page page, @Param("visitorRequest") VisitorRequest visitorRequest); VisitInfo selectByOrderId(@Param("orderId") String orderId); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitorApplyMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitorApplyMapper.java index c09f3c0..6ea55bd 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitorApplyMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitorApplyMapper.java @@ -18,7 +18,7 @@ @Mapper public interface VisitorApplyMapper extends BaseMapper { - List getVisitorApplyListPage(@Param("page") Page page, VisitorApplyRequest visitorApplyRequest); + List getVisitorApplyListPage(@Param("page") Page page, @Param("visitorApplyRequest") VisitorApplyRequest visitorApplyRequest); List selectByVisitReason(); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/AttendanceInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/AttendanceInfoMapper.xml index b2ece71..f8bdd6e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/AttendanceInfoMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/AttendanceInfoMapper.xml @@ -43,7 +43,8 @@ and staff_type = #{staffType} - and YEARWEEK(date_format(atte_date, '%Y-%m-%d'), 1) = YEARWEEK(now(),1); + AND DATE_SUB(CURDATE(), INTERVAL 7 DAY) <= DATE(atte_date) + GROUP BY DATE_FORMAT(atte_date, '%Y-%m-%d') @@ -69,4 +70,20 @@ GROUP BY DATE_FORMAT(atte_date, '%Y-%m') + + + \ No newline at end of file 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 2b6953f..06ec0a8 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 @@ -28,7 +28,9 @@ @@ -87,7 +89,8 @@ SELECT hazard_level_code as levelCode, count(id) as quantity FROM bus_case_info WHERE hazard_level_code is not null - AND DATE_SUB(CURDATE(), INTERVAL 7 DAY) <= date(happen_time); + AND is_key_area = 1 + AND DATE_SUB(CURDATE(), INTERVAL 7 DAY) <= date(happen_time) GROUP BY hazard_level_code @@ -95,7 +98,8 @@ SELECT hazard_level_code as levelCode, count(id) as quantity FROM bus_case_info WHERE hazard_level_code is not null - AND DATE_SUB(CURDATE(), INTERVAL 30 DAY) <= date(happen_time); + AND is_key_area = 1 + AND DATE_SUB(CURDATE(), INTERVAL 30 DAY) <= date(happen_time) GROUP BY hazard_level_code @@ -122,4 +126,71 @@ AND hazard_level_code is not null GROUP BY DATE_FORMAT(happen_time,'%Y-%m-%d') + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/CategoryLevelMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/CategoryLevelMapper.xml index 4670b1f..1d25cbd 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/CategoryLevelMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/CategoryLevelMapper.xml @@ -20,11 +20,11 @@ SELECT * FROM bus_case_category_level WHERE 1=1 - - and code = #{code} + + and code = #{categoryLevelRequest.code} - - and name = #{name} + + and name = #{categoryLevelRequest.name} ORDER by create_time DESC 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 9b66fd8..bfd84b7 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 @@ -98,4 +98,10 @@ #{item} + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceRepairLogMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceRepairLogMapper.xml index 078ed3c..cf1a481 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceRepairLogMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceRepairLogMapper.xml @@ -22,14 +22,14 @@ SELECT * FROM bus_device_repair_log WHERE 1=1 - - and device_code = #{devCode} + + and device_code = #{deviceRepairRequest.devCode} - - and device_name = #{devName} + + and device_name = #{deviceRepairRequest.devName} - - and DATE_FORMAT(create_time,"%y%m%d") = DATE_FORMAT(#{createTime},"%y%m%d") + + and DATE_FORMAT(create_time,"%y%m%d") = DATE_FORMAT(#{deviceRepairRequest.createTime},"%y%m%d") ORDER by create_time DESC diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/HazardLevelMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/HazardLevelMapper.xml index f16f2b9..458322b 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/HazardLevelMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/HazardLevelMapper.xml @@ -20,11 +20,11 @@ SELECT * FROM bus_case_hazard_level WHERE 1=1 - - and code = #{code} + + and code = #{hazardLevelRequest.code} - - and name = #{name} + + and name = #{hazardLevelRequest.name} ORDER by create_time DESC @@ -42,4 +42,10 @@ SELECT name FROM bus_case_hazard_level + + \ 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 557237e..b6a183a 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 @@ -50,4 +50,10 @@ + + + UPDATE bus_staff_info + SET card_no = #{cardNo} + WHERE staff_code = #{staffCode} + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitInfoMapper.xml index 84aa84f..230529a 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitInfoMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitInfoMapper.xml @@ -27,5 +27,6 @@ SELECT * FROM bus_visit_info WHERE order_id = #{orderId} and DATE_FORMAT(in_time,'%Y-%m-%d') = CURRENT_DATE + limit 1 \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/BlackPictureRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/BlackPictureRequest.java new file mode 100644 index 0000000..fc92701 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/BlackPictureRequest.java @@ -0,0 +1,14 @@ +package com.casic.missiles.modular.dto; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/29 19:26 + */ +@Data +public class BlackPictureRequest { + private String picUri; + private String serverIndexCode; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/CancelSubscribeRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/CancelSubscribeRequest.java new file mode 100644 index 0000000..e2d390a --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/CancelSubscribeRequest.java @@ -0,0 +1,15 @@ +package com.casic.missiles.modular.dto.hik; + +import lombok.Data; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/24 15:14 + */ +@Data +public class CancelSubscribeRequest { + private List eventTypes; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/CardInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/CardInfo.java new file mode 100644 index 0000000..341457d --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/CardInfo.java @@ -0,0 +1,24 @@ +package com.casic.missiles.modular.dto.hik; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/26 16:08 + */ +@Data +public class CardInfo { + //卡号,8~20个字符,支持数字和大写字母 + private String cardNo; + //人员ID,员工工号 + private String personId; + //人员所属组织IndexCode + private String orgIndexCode; + //卡片类型,默认是1:IC卡 + //1:IC卡 + //2:CPU卡 + //3:远距离卡 + //4:MIFARE卡 + private Number cardType; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/FaceRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/FaceRequest.java new file mode 100644 index 0000000..edc04bf --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/FaceRequest.java @@ -0,0 +1,16 @@ +package com.casic.missiles.modular.dto.hik; + +import lombok.Data; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/25 16:53 + */ +@Data +public class FaceRequest { + private String certificateNum; + private List indexCodes; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/HikRecvEvent.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/HikRecvEvent.java index a3e9845..1b2b2b1 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/HikRecvEvent.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/HikRecvEvent.java @@ -28,12 +28,12 @@ /** * 事件类型,用于判断所需接收到的事件类型 */ - public Long getEventType(){ + public Number getEventType(){ JSONObject jsonObject = (JSONObject)JSONObject.toJSON(params); //事件类别对应SecurityEventTypeEnum JSONArray eventTypeArray = (JSONArray)jsonObject.get("events"); JSONObject eventJsonObject = (JSONObject)JSONObject.toJSON(eventTypeArray.get(0)); - Long eventType = (Long) eventJsonObject.get("eventType"); + Number eventType = (Number) eventJsonObject.get("eventType"); return eventType; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonBatchDeleteRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonBatchDeleteRequest.java index 027d31d..9751929 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonBatchDeleteRequest.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonBatchDeleteRequest.java @@ -12,4 +12,6 @@ @Data public class PersonBatchDeleteRequest { private List personIds; + //删除人脸接口使用 + private String faceId; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonInfoRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonInfoRequest.java new file mode 100644 index 0000000..05dc9e1 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonInfoRequest.java @@ -0,0 +1,20 @@ +package com.casic.missiles.modular.dto.hik; + +import lombok.Data; + +import java.util.List; + +/** + * @Description: 获取员工照片请求实体 + * @Author: wangpeng + * @Date: 2022/8/25 16:53 + */ +@Data +public class PersonInfoRequest { + //获取员工详细信息使用 + private String paramName; + private List paramValue; + //获取照片使用 + private String picUri; + private String serverIndexCode; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonListRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonListRequest.java new file mode 100644 index 0000000..3f7149b --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonListRequest.java @@ -0,0 +1,16 @@ +package com.casic.missiles.modular.dto.hik; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/25 16:53 + */ +@Data +public class PersonListRequest { + private Number pageNo; + private Number pageSize; + + private String orderId; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/SearchPicturesRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/SearchPicturesRequest.java new file mode 100644 index 0000000..0a95966 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/SearchPicturesRequest.java @@ -0,0 +1,24 @@ +package com.casic.missiles.modular.dto.hik; + +import lombok.Data; + +import java.util.List; + +/** + * @Description: 以图搜图请求 + * @Author: wangpeng + * @Date: 2022/8/29 10:46 + */ +@Data +public class SearchPicturesRequest { + private String facePicBinaryData; + private String facePicUrl; + private List cameraIndexCodes; + private String startTime; + private String endTime; + //指定搜图的最小相似度,最小为1,最大为100 + private String minSimilarity; + private Number age; + //male-男性,female-女性 + private String sex; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/StaffCardRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/StaffCardRequest.java new file mode 100644 index 0000000..4052e6d --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/StaffCardRequest.java @@ -0,0 +1,20 @@ +package com.casic.missiles.modular.dto.hik; + +import lombok.Data; + +import java.util.List; + +/** + * @Description: 人员开卡请求实体 + * @Author: wangpeng + * @Date: 2022/8/26 16:05 + */ +@Data +public class StaffCardRequest { + //卡片开始有效时间,时间格式:yyyy-MM-dd + private String startDate; + //卡片截止有效时间,时间格式:yyyy-MM-dd,不能大于2037年12月31日 + private String endDate; + //cardList,待开卡列表,最大支持50张卡 + private List cardList; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/VisitorInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/VisitorInfo.java index 73aa316..b99f301 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/VisitorInfo.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/VisitorInfo.java @@ -14,7 +14,7 @@ //访客性别 //1: 男 //2: 女 - private String gender; + private Integer gender; //联系电话建议填写手机号码 private String phoneNo; //证件类型 diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/ApplyReasonGroupDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/ApplyReasonGroupDTO.java index 514f382..786143e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/ApplyReasonGroupDTO.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/ApplyReasonGroupDTO.java @@ -13,4 +13,6 @@ private String visitReason; //访问人数 private Integer quantity; + //占比 + private String ratio; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/AttendanceNumberDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/AttendanceNumberDTO.java new file mode 100644 index 0000000..a494321 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/AttendanceNumberDTO.java @@ -0,0 +1,24 @@ +package com.casic.missiles.modular.dto.statistics; + +import com.fasterxml.jackson.annotation.JsonIgnore; +import lombok.Data; + +/** + * @Description: 出勤人数统计实体 + * @Author: wangpeng + * @Date: 2022/8/31 19:24 + */ +@Data +public class AttendanceNumberDTO { + //日期维度,周、今日,入参 + @JsonIgnore + private String dateDimension; + + //日期,具体天/小时,出参 + private String date; + //出勤人数 + private String quantity; + //员工类型 + private String staffType; + +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/AvgMonthAndWeekGroupDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/AvgMonthAndWeekGroupDTO.java index 4366916..331a9a9 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/AvgMonthAndWeekGroupDTO.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/AvgMonthAndWeekGroupDTO.java @@ -2,8 +2,6 @@ import lombok.Data; -import java.util.Map; - /** * @Description: 平均每月和每周的数据实体 * @Author: wangpeng @@ -13,6 +11,4 @@ public class AvgMonthAndWeekGroupDTO { //入参 private String year; - //出参,key:事件类型,value:周和月数据平均值 - private Map map; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/GateStatusGroupResponse.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/GateStatusGroupResponse.java new file mode 100644 index 0000000..d16f4e5 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/GateStatusGroupResponse.java @@ -0,0 +1,16 @@ +package com.casic.missiles.modular.dto.statistics; + +import lombok.Data; + +/** + * @Description: 闸机/摄像机统计响应实体 + * @Author: wangpeng + * @Date: 2022/8/30 14:22 + */ +@Data +public class GateStatusGroupResponse { + //设备状态 + private String status; + //占比 + private String ratio; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/MonthAndWeekDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/MonthAndWeekDTO.java index 7482b2a..284115a 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/MonthAndWeekDTO.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/MonthAndWeekDTO.java @@ -9,7 +9,7 @@ */ @Data public class MonthAndWeekDTO { -// private String levelName; + private String levelName; private Integer monthQuantity; private Integer weekQuantity; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/OnDutyRatioDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/OnDutyRatioDTO.java new file mode 100644 index 0000000..4f6a65d --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/OnDutyRatioDTO.java @@ -0,0 +1,15 @@ +package com.casic.missiles.modular.dto.statistics; + +import lombok.Data; + +/** + * @Description: 在岗率统计实体 + * @Author: wangpeng + * @Date: 2022/9/2 21:24 + */ +@Data +public class OnDutyRatioDTO { + private String date; + private String quantity; + private String ratio; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/SecurityLevelAssessDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/SecurityLevelAssessDTO.java new file mode 100644 index 0000000..40a0738 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/SecurityLevelAssessDTO.java @@ -0,0 +1,15 @@ +package com.casic.missiles.modular.dto.statistics; + +import lombok.Data; + +/** + * @Description: 出勤人数统计实体 + * @Author: wangpeng + * @Date: 2022/8/31 19:24 + */ +@Data +public class SecurityLevelAssessDTO { + private String date; + private String quantity; + private Double score; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/SecurityScoreDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/SecurityScoreDTO.java index 304d169..f7bd4a2 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/SecurityScoreDTO.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/SecurityScoreDTO.java @@ -14,5 +14,5 @@ //楼层,出参 private String area; //评分,出参 - private String score; + private Double score; } 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 6a30786..e5e613d 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 @@ -8,6 +8,10 @@ public interface HikUri { //事件订阅 String EVENT_SUBSCRIBE = "/api/eventService/v1/eventSubscriptionByEventTypes"; + //事件订阅信息查询 + String EVENT_INFO = "/api/eventService/v1/eventSubscriptionView"; + //事件订阅取消 + String EVENT_CANCEL = "/api/eventService/v1/eventUnSubscriptionByEventTypes"; //预约免登记 String APPOINTMENT_FREE_REGISTER = "/api/visitor/v1/appointment/registration"; //修改访客预约 @@ -32,8 +36,18 @@ String PERSON_SINGLE_UPDATE = "/api/resource/v1/person/single/update"; //批量删除人员 String PERSON_BATCH_DELETE = "/api/resource/v1/person/batch/delete"; + //根据人脸Id删除人脸 + String PERSON_SINGLE_DELETE = "/api/resource/v1/face/single/delete"; //门禁点反控 String DOOR_CONTROL = "/api/acs/v1/door/doControl"; //查询海康门禁点事件v2 String DOOR_EVENTS = "/api/acs/v2/door/events"; + //批量开卡 + String CARD_BINDING = "/api/cis/v1/card/binding"; + //提取人员照片 + String PERSON_PICTURE = "/api/resource/v1/person/picture"; + //根据人员唯一字段获取人员详细信息 + String PERSON_INFO = "/api/resource/v1/person/condition/personInfo"; + //以图搜图 + String SEARCH_PICTURES = "/api/frs/v1/application/captureSearch"; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/enums/SecurityEventType.java b/casic-server/src/main/java/com/casic/missiles/modular/enums/SecurityEventType.java index d51034c..42eacf8 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/enums/SecurityEventType.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/enums/SecurityEventType.java @@ -14,18 +14,27 @@ Number PERSONNEL_GATHER_EVENT = 131593; //监控点离线事件 Number MONITORING_POINT_OFFLINE = 889196545; + //监控点上线事件 + Number MONITORING_POINT_ONLINE = 889196546; //装置离线 Number DEVICE_OFFLINE = 199710; + //装置连线 + Number DEVICE_ONLINE = 199711; //访客登记 Number VISITOR_REGISTER = 1392513025; //访客签离 Number VISITOR_CHECKOUT = 1392513026; + //高空抛物 + Number HIGH_ALTITUDE_PARABOLIC = 930335; + //下面两个查询海康门禁点事件使用 //合法卡比对通过 Number CARD_COMPARE_PASS = 198914; //人脸认证通过 Number FACE_COMPARE_PASS = 196893; + + // //正常开门 // Number NORMAL_OPENING = 198913; // //按钮开门 @@ -46,7 +55,6 @@ // Number FIREWORKS_DETECTION = 192514; // //陌生人识别事件 // Number STRANGER_RECOGNITION = 1644171265; -// //高空抛物 -// Number HIGH_ALTITUDE_PARABOLIC = 930335; + } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/job/CockpitJob.java b/casic-server/src/main/java/com/casic/missiles/modular/job/CockpitJob.java index 7490a27..85dd016 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/job/CockpitJob.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/job/CockpitJob.java @@ -79,14 +79,6 @@ } }); } - } - /** - * 机动力量实时在岗率,在岗人数除以总应在岗人数,功能待定 - */ -// @Scheduled(cron = "0 0/1 * * * ?") - public void BeOnDutyRatio() { - - } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/service/HikCaseDefineService.java b/casic-server/src/main/java/com/casic/missiles/modular/service/HikCaseDefineService.java index d9bb3a9..18e2936 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/service/HikCaseDefineService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/service/HikCaseDefineService.java @@ -9,5 +9,5 @@ * @Date: 2022/7/21 17:20 */ public interface HikCaseDefineService extends IService { - HikCaseDefine getHikCaseDefine(Long caseTypeCode); + HikCaseDefine getHikCaseDefine(Number caseTypeCode); } 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 dd24101..bcc3b5d 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 @@ -18,6 +18,8 @@ CaseInfo monitorPointOfflineHandle(JSONObject event, CaseInfo caseInfo); + void monitorPointOnlineHandle(JSONObject event); + CaseInfo deviceOfflineHandle(JSONObject event, CaseInfo caseInfo); void propertyAttendanceHandle(JSONObject event); @@ -27,4 +29,6 @@ void visitorRegisterHandler(JSONObject event); void visitorCheckOutHandler(JSONObject event); + + void deviceOnlineHandle(JSONObject event); } 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 e55c016..01870bd 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.StaffCardRequest; import com.casic.missiles.modular.model.StaffInfo; import java.util.List; @@ -28,4 +29,6 @@ StaffInfo selectStaffInfoByCode(StaffInfo staffInfo); List staffInfoList(StaffInfoRequest staffInfoRequest); + + int saveCardInfo(StaffCardRequest staffCardRequest); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/service/impl/BlackInfoServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/service/impl/BlackInfoServiceImpl.java index 8f47b37..981b4cd 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/service/impl/BlackInfoServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/service/impl/BlackInfoServiceImpl.java @@ -17,7 +17,6 @@ import com.casic.missiles.modular.model.BlackInfo; import com.casic.missiles.modular.model.HikFaceGroupInfo; import com.casic.missiles.modular.service.BlackInfoService; -import com.casic.missiles.modular.system.service.ICasicFileService; import com.casic.missiles.modular.util.HikUtil; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; @@ -43,9 +42,6 @@ private HikFaceGroupInfoMapper hikFaceGroupInfoMapper; @Resource - private ICasicFileService fileService; - - @Resource private AbstractDictService dictService; @Override @@ -90,9 +86,6 @@ //设置海康人脸唯一标识、人脸分组唯一标识 blackInfo.setIndexCode(String.valueOf(dataJson.get("indexCode"))); blackInfo.setFaceGroupIndexCode(String.valueOf(dataJson.get("faceGroupIndexCode"))); - //保存图片到本地 - String picUrl = fileService.saveFile(blackInfo.getPicture()); - blackInfo.setPicture(picUrl); //插入数据库 if(blackInfoMapper.insert(blackInfo) > 0){ return ResponseData.success(); @@ -141,8 +134,6 @@ log.error("请求海康,单个修改人脸失败,海康response:{}", resultStr); return ResponseData.error("单个修改人脸失败"); } - String picUrl = fileService.saveFile(blackInfo.getPicture()); - blackInfo.setPicture(picUrl); if(blackInfoMapper.updateById(blackInfo) > 0){ return ResponseData.success(); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/BlackListController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/BlackListController.java index a27f9f8..0c06661 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/BlackListController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/BlackListController.java @@ -1,13 +1,18 @@ package com.casic.missiles.modular.controller; +import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.base.controller.ExportController; import com.casic.missiles.core.page.PageFactory; import com.casic.missiles.model.response.ResponseData; import com.casic.missiles.modular.dto.BlackInfoRequest; +import com.casic.missiles.modular.dto.BlackPictureRequest; +import com.casic.missiles.modular.dto.hik.PersonInfoRequest; +import com.casic.missiles.modular.enums.HikUri; import com.casic.missiles.modular.enums.OperateTypeEnum; import com.casic.missiles.modular.model.BlackInfo; import com.casic.missiles.modular.service.BlackInfoService; +import com.casic.missiles.modular.util.HikUtil; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; @@ -56,4 +61,22 @@ return null; } + /** + * 黑名单人员照片 + */ + @PostMapping("/personPicture") + @ResponseBody + public Object personPicture(@RequestBody BlackPictureRequest blackPictureRequest){ + //获取照片 + String picUri = blackPictureRequest.getPicUri(); + String serverIndexCode = blackPictureRequest.getServerIndexCode(); + PersonInfoRequest picRequest = new PersonInfoRequest(); + picRequest.setPicUri(picUri); + picRequest.setServerIndexCode(serverIndexCode); + String reBody = JSONObject.toJSONString(picRequest); + //重定向地址获取 + String url = HikUtil.hikApiFor302(HikUri.PERSON_PICTURE, reBody); + return ResponseData.success(url); + } + } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/DeviceController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/DeviceController.java index e1c4eba..666bbee 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/DeviceController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/DeviceController.java @@ -107,7 +107,7 @@ } /** - * 设备维修管理查询(分页),需计算MTTR=总维修时间/故障次数 + * 设备状态计算与评判/设备维修管理查询(分页),需计算MTTR=总维修时间/故障次数 */ @PostMapping("/repair/listPage") @ResponseBody @@ -211,7 +211,7 @@ //需根据设备编号获取到对应的门禁点唯一标识 doorControlRequest.setDoorIndexCodes(indexCodes); doorControlRequest.setControlType(Integer.valueOf(gateGroupDTO.getStatus())); - String body = JSONObject.toJSONString(deviceCodes); + String body = JSONObject.toJSONString(doorControlRequest); String resultStr = HikUtil.hikApi(HikUri.DOOR_CONTROL, body); JSONObject resultJson = (JSONObject)JSONObject.parse(resultStr); if (!"0".equals(resultJson.get("code"))) { diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/StaffController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/StaffController.java index b58ccab..704093c 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/StaffController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/StaffController.java @@ -2,15 +2,21 @@ import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.util.StrUtil; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.base.controller.ExportController; import com.casic.missiles.core.page.PageFactory; import com.casic.missiles.model.response.ErrorResponseData; import com.casic.missiles.model.response.ResponseData; import com.casic.missiles.modular.dto.StaffInfoRequest; +import com.casic.missiles.modular.dto.hik.PersonInfoRequest; +import com.casic.missiles.modular.dto.hik.StaffCardRequest; +import com.casic.missiles.modular.enums.HikUri; import com.casic.missiles.modular.enums.OperateTypeEnum; import com.casic.missiles.modular.model.StaffInfo; import com.casic.missiles.modular.service.StaffInfoService; +import com.casic.missiles.modular.util.HikUtil; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; @@ -110,4 +116,60 @@ } return ResponseData.success(); } + + /** + * 批量开卡,添加人员之后调用,若在一个接口中添加人员成功开卡失败则第二次添加时会有问题 + */ + @PostMapping("/cardBinding") + @ResponseBody + public Object cardBinding(@RequestBody StaffCardRequest staffCardRequest) { + String body = JSONObject.toJSONString(staffCardRequest); + String resultStr = HikUtil.hikApi(HikUri.CARD_BINDING, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (!"0".equals(resultJson.get("code"))) { + log.error("请求海康,批量开卡失败,海康response:{}", resultStr); + return ResponseData.error("批量开卡失败"); + } + //保存卡号 + if(staffInfoService.saveCardInfo(staffCardRequest) > 0){ + return ResponseData.success(); + } + return ResponseData.error("批量开卡失败"); + } + + /** + * 获取员工照片,海康存储 + */ + @PostMapping("/personPicture/{staffCode}") + @ResponseBody + public Object personPicture(@PathVariable("staffCode") String staffCode){ + //获取员工详细信息,含图片服务器、uri + PersonInfoRequest request = new PersonInfoRequest(); + List list = new ArrayList<>(); + list.add(staffCode); + request.setParamName("personId"); + request.setParamValue(list); + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi(HikUri.PERSON_INFO, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (!"0".equals(resultJson.get("code"))) { + log.error("请求海康,根据人员唯一字段获取人员详细信息失败,海康response:{}", resultStr); + return ResponseData.error("获取员工照片失败"); + } + //获取照片 + JSONObject data = (JSONObject) resultJson.get("data"); + JSONArray dataArray = (JSONArray) data.get("list"); + JSONObject jsonObject = (JSONObject) dataArray.get(0); + JSONArray personPhoto = (JSONArray) jsonObject.get("personPhoto"); + JSONObject photo = (JSONObject) personPhoto.get(0); + String picUri = photo.getString("picUri"); + String serverIndexCode = photo.getString("serverIndexCode"); + PersonInfoRequest picRequest = new PersonInfoRequest(); + picRequest.setPicUri(picUri); + picRequest.setServerIndexCode(serverIndexCode); + String reBody = JSONObject.toJSONString(picRequest); + //重定向地址获取 + String url = HikUtil.hikApiFor302(HikUri.PERSON_PICTURE, reBody); + return ResponseData.success(url); + } } 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 4a07dd9..7b1dcf6 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 @@ -16,6 +16,7 @@ import com.casic.missiles.modular.redis.key.CacheKeys; import com.casic.missiles.modular.service.CockpitService; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.util.CollectionUtils; import org.springframework.web.bind.annotation.*; @@ -24,10 +25,7 @@ import java.text.NumberFormat; import java.time.LocalDateTime; import java.time.temporal.ChronoUnit; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.util.*; import java.util.stream.Collectors; /** @@ -73,6 +71,9 @@ private StatisticNumberMapper numberMapper; @Autowired + private HazardLevelMapper hazardLevelMapper; + + @Autowired private AccessGroupConfig accessGroupConfig; /** @@ -104,8 +105,24 @@ public Object buildingNumberPerHour(){ //当天按小时分组的人数 List list = numberMapper.selectListByTime(); - Map> collect = list.stream().collect(Collectors.groupingBy(BuildingNumberDTO::getStatisticPosition)); - return ResponseData.success(collect); + Map> collect = list.stream().collect(Collectors.groupingBy(BuildingNumberDTO::getStatisticTime)); + //定时任务中已将每小时三栋楼人数存到数据库 + //将一期主楼和录制楼人数合并,二期单算 + List> resultList = new ArrayList<>(); + collect.keySet().forEach(key -> { + List buildingNumberDTOS = collect.get(key); + BuildingNumberDTO mainBuildingOne = buildingNumberDTOS.get(0); + BuildingNumberDTO mainBuildingTwo = buildingNumberDTOS.get(1); + BuildingNumberDTO recordingBuilding = buildingNumberDTOS.get(2); + HashMap resultMap = new HashMap<>(); + Integer oneQuantity = Integer.valueOf(mainBuildingOne.getStatisticQuantity()); + Integer recordingQuantity = Integer.valueOf(recordingBuilding.getStatisticQuantity()); + resultMap.put("staticTime", mainBuildingOne.getStatisticTime()); + resultMap.put(mainBuildingOne.getStatisticPositionName()+"、"+recordingBuilding.getStatisticPositionName(), String.valueOf(oneQuantity+recordingQuantity)); + resultMap.put(mainBuildingTwo.getStatisticPositionName(), mainBuildingTwo.getStatisticQuantity()); + resultList.add(resultMap); + }); + return ResponseData.success(resultList); } /** @@ -151,12 +168,11 @@ public Object securityNumber() { QueryWrapper wrapper = new QueryWrapper<>(); wrapper.eq("staff_type", 2); + // TODO: 2022/9/2 后续使用产品确定的每天出勤的安保人员的数量 Integer total = staffInfoMapper.selectCount(wrapper); - //当日离岗事件个数 - QueryWrapper wrapper1 = new QueryWrapper<>(); - wrapper1.eq("hik_event_type", SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); - wrapper1.apply("date_format(now(),'%Y-%m-%d') = date_format(happen_time,'%Y-%m-%d')"); - Integer leave = caseInfoMapper.selectCount(wrapper1); + //当日离岗事件按设备去重后的个数 + // TODO: 2022/9/2 目前相当于24小时内的计算,之后看需要可改成自定义小时数计算离岗率,即离岗+6小时内仅一次离岗则恢复为100%,多次则累加离岗次数计算离岗率 + Integer leave = caseInfoMapper.selectDemobilizedCount(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); NumberFormat numberFormat = NumberFormat.getInstance(); // 设置精确到小数点后2位 numberFormat.setMaximumFractionDigits(2); @@ -179,7 +195,6 @@ @ResponseBody public Object visitorApplyDetail() { List reasonGroup = applyMapper.selectByVisitReason(); - HashMap resultMap = new HashMap<>(); NumberFormat numberFormat = NumberFormat.getInstance(); // 设置精确到小数点后2位 numberFormat.setMaximumFractionDigits(2); @@ -187,12 +202,17 @@ if(0 == sum){ return ResponseData.success(); } + List resultList = new ArrayList<>(); reasonGroup.forEach(group -> { String reasonName = dictService.getDictNameByCode(SecurityEventDict.VISIT_REASON, group.getVisitReason()); String result = numberFormat.format((float) group.getQuantity() / (float) sum * 100); - resultMap.put(reasonName, result+"%"); + ApplyReasonGroupDTO applyReasonGroupDTO = new ApplyReasonGroupDTO(); + applyReasonGroupDTO.setQuantity(group.getQuantity()); + applyReasonGroupDTO.setVisitReason(reasonName); + applyReasonGroupDTO.setRatio(result+"%"); + resultList.add(applyReasonGroupDTO); }); - return ResponseData.success(resultMap); + return ResponseData.success(resultList); } /** @@ -247,6 +267,32 @@ } /** + * 机动力量实时在岗率,在岗人数除以总应在岗人数,用离岗+6小时内恢复为100%,6小时外再计算 + */ + @GetMapping("/staff/beOnDutyRatio") + @ResponseBody + public Object beOnDutyRatio() { + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("staff_type", 2); + // TODO: 2022/9/2 后续使用产品确定的每天出勤的安保人员的数量 + Integer total = staffInfoMapper.selectCount(wrapper); + if(0 == total){ + return ResponseData.success(null); + } + //当日离岗事件按设备去重后的个数 + // TODO: 2022/9/2 目前相当于24小时内的计算,之后看需要可改成自定义小时数计算离岗率,即离岗+6小时内仅一次离岗则恢复为100%,多次则累加离岗次数计算离岗率 + List onDutyRatioDTOS = caseInfoMapper.selectDemobilizedCountByHour(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); + onDutyRatioDTOS.forEach(dto -> { + NumberFormat numberFormat = NumberFormat.getInstance(); + // 设置精确到小数点后2位 + numberFormat.setMaximumFractionDigits(2); + String result = numberFormat.format(100 - Float.valueOf(dto.getQuantity()) / (float) total * 100); + dto.setRatio(result+"%"); + }); + return ResponseData.success(onDutyRatioDTOS); + } + + /** * 闸机速通门统计-设备状态分组计算数量,devType传闸机字典key * 视频频监控摄像机统计-设备状态分组计算数量,devType传摄像头字典key */ @@ -262,12 +308,17 @@ if(sum <= 0){ return ResponseData.error("无该类设备信息"); } + List resultList = new ArrayList<>(); gateStatusGroup.forEach(group -> { String devStatus = dictService.getDictNameByCode(SecurityEventDict.DEVICE_STATUS, group.getStatus()); String result = numberFormat.format((float) group.getQuantity() / (float) sum * 100); - resultMap.put(devStatus, result+"%"); + GateStatusGroupResponse gateStatusGroupResponse = new GateStatusGroupResponse(); + gateStatusGroupResponse.setStatus(devStatus); + gateStatusGroupResponse.setRatio(result+"%"); + resultList.add(gateStatusGroupResponse); }); - resultMap.put("总", sum); + resultMap.put("total", sum); + resultMap.put("list", resultList); return ResponseData.success(resultMap); } @@ -282,17 +333,38 @@ String position = securityScoreDTO.getPosition(); List caseInfos = caseInfoMapper.selectByPosition(position); //查询各危险级别权重、各类别权重,放入map,避免循环中多次查数据库 - + HashMap hazardScoreMap = new HashMap<>(); + List caseHazardLevelList = hazardLevelMapper.getCaseHazardLevelList(null); + caseHazardLevelList.forEach(hazardLevel -> { + hazardScoreMap.put(hazardLevel.getCode(), hazardLevel.getWeight()); + }); + HashMap categoryScoreMap = new HashMap<>(); + List categoryLevelList = categoryLevelMapper.getCaseCategoryLevelList(null); + categoryLevelList.forEach(categoryLevel -> { + categoryScoreMap.put(categoryLevel.getCode(), categoryLevel.getWeight()); + }); + //事件按楼层分组,计算 List securityScoreDTOs = new ArrayList<>(); caseInfos.forEach(caseInfo -> { SecurityScoreDTO securityScoreDTO1 = new SecurityScoreDTO(); + securityScoreDTO1.setPosition(caseInfo.getPosition()); securityScoreDTO1.setArea(caseInfo.getArea()); - // TODO: 2022/8/4 楼层评分计算根据产品定义调整 -// caseInfo.get -// securityScoreDTO1.setScore(); + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); + Double score = 100 - Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + securityScoreDTO1.setScore(score); + securityScoreDTOs.add(securityScoreDTO1); }); - - return null; + 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); + }); + return ResponseData.success(securityScoreDTOs); } /** @@ -303,9 +375,13 @@ public Object SecurityFrequency(@RequestBody SecurityFrequencyDTO securityFrequencyDTO) { String year = securityFrequencyDTO.getYear(); String month = securityFrequencyDTO.getMonth(); - Integer quantity = caseInfoMapper.selectCountByMonth(year, month); - securityFrequencyDTO.setQuantity(quantity); - return ResponseData.success(securityFrequencyDTO); + if(!StringUtils.isEmpty(year) && StringUtils.isEmpty(month)){ + Integer quantity = caseInfoMapper.selectCountByMonth(year, month); + securityFrequencyDTO.setQuantity(quantity); + return ResponseData.success(securityFrequencyDTO); + } + List list = caseInfoMapper.selectPreMonthCount(); + return ResponseData.success(list); } } 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 ae4d770..f4f075c 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 @@ -1,20 +1,25 @@ package com.casic.missiles.modular.controller.cockpit; +import cn.hutool.core.date.DateUnit; import cn.hutool.core.date.DateUtil; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.casic.missiles.model.response.ResponseData; -import com.casic.missiles.modular.dao.AttendanceInfoMapper; -import com.casic.missiles.modular.dao.CaseInfoMapper; -import com.casic.missiles.modular.dao.HazardLevelMapper; -import com.casic.missiles.modular.dao.StaffInfoMapper; +import com.casic.missiles.modular.dao.*; +import com.casic.missiles.modular.dto.DeviceRepairLogDTO; +import com.casic.missiles.modular.dto.DeviceRepairRequest; import com.casic.missiles.modular.dto.statistics.*; +import com.casic.missiles.modular.enums.SecurityEventType; +import com.casic.missiles.modular.model.CaseCategoryLevel; import com.casic.missiles.modular.model.CaseHazardLevel; +import com.casic.missiles.modular.model.CaseInfo; import com.casic.missiles.modular.model.StaffInfo; +import com.casic.missiles.modular.service.DeviceInfoService; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.util.CollectionUtils; import org.springframework.web.bind.annotation.*; +import java.math.BigDecimal; import java.text.NumberFormat; import java.util.*; import java.util.stream.Collectors; @@ -40,6 +45,12 @@ @Autowired private HazardLevelMapper hazardLevelMapper; + @Autowired + private CategoryLevelMapper categoryLevelMapper; + + @Autowired + private DeviceInfoService deviceInfoService; + /** * 安防事件时域频次统计,每月的每天安防事件个数(原方案) * 月维度:展示每个月的每天的数据 @@ -89,15 +100,17 @@ List monthList = caseInfoMapper.selectPreMonthCountByYear(year); Map> collect = monthList.stream().collect(Collectors.groupingBy(PreMonthOrWeekCaseDTO::getHazardLevelCode)); HashMap strAvgMap = new HashMap<>(); + List resultList = new ArrayList<>(); for (String key : collect.keySet()) { List preMonthOrWeekCaseDTOS = collect.get(key); int sum = preMonthOrWeekCaseDTOS.stream().mapToInt(PreMonthOrWeekCaseDTO::getQuantity).sum(); //若年份是本年,则使用个安防级别数量/当前月份数 //若不是本年,除数为12 MonthAndWeekDTO monthAndWeekDTO = new MonthAndWeekDTO(); + String hazardName = hazardLevelMapper.selectHazardNameByCode(key); + monthAndWeekDTO.setLevelName(hazardName); if(year.equals(String.valueOf(DateUtil.thisYear()))){ monthAndWeekDTO.setMonthQuantity(sum / DateUtil.thisMonth()); -// monthAndWeekDTO.setLevelName(); strAvgMap.put(key, monthAndWeekDTO); }else{ monthAndWeekDTO.setMonthQuantity(sum / 12); @@ -113,27 +126,37 @@ if(year.equals(String.valueOf(DateUtil.thisYear()))){ if(!Objects.isNull(strAvgMap.get(key))){ MonthAndWeekDTO monthAndWeekDTO = strAvgMap.get(key); + String hazardName = hazardLevelMapper.selectHazardNameByCode(key); + monthAndWeekDTO.setLevelName(hazardName); monthAndWeekDTO.setWeekQuantity(sum / DateUtil.thisWeekOfYear()); strAvgMap.put(key, monthAndWeekDTO); }else{ MonthAndWeekDTO monthAndWeekDTO = new MonthAndWeekDTO(); + String hazardName = hazardLevelMapper.selectHazardNameByCode(key); + monthAndWeekDTO.setLevelName(hazardName); monthAndWeekDTO.setWeekQuantity(sum / DateUtil.thisWeekOfYear()); strAvgMap.put(key, monthAndWeekDTO); } }else{ if(!Objects.isNull(strAvgMap.get(key))){ MonthAndWeekDTO monthAndWeekDTO = strAvgMap.get(key); + String hazardName = hazardLevelMapper.selectHazardNameByCode(key); + monthAndWeekDTO.setLevelName(hazardName); monthAndWeekDTO.setWeekQuantity(sum / 52); strAvgMap.put(key, monthAndWeekDTO); }else{ MonthAndWeekDTO monthAndWeekDTO = new MonthAndWeekDTO(); + String hazardName = hazardLevelMapper.selectHazardNameByCode(key); + monthAndWeekDTO.setLevelName(hazardName); monthAndWeekDTO.setWeekQuantity(sum / 52); strAvgMap.put(key, monthAndWeekDTO); } } } - avgMonthAndWeekGroupDTO.setMap(strAvgMap); - return ResponseData.success(avgMonthAndWeekGroupDTO); + strAvgMap.keySet().forEach(key -> { + resultList.add(strAvgMap.get(key)); + }); + return ResponseData.success(resultList); } /** @@ -181,12 +204,178 @@ } /** - * 员工考勤人数变化,功能待定 + * 员工考勤人数变化,统计当天(横坐标为时)及近7天(横坐标为天)的考勤人数变化,只要发生一次考勤识别,次数的基数就正常增加(没有上班下班区分) */ + @PostMapping("/staff/attendanceNumber/{dimension}") + @ResponseBody + public Object attendanceNumber(@PathVariable("dimension") String dimension) { + List attendanceNumberDTOs = null; + List> resultList = new ArrayList<>(); + if("week".equals(dimension)){ + //近7天数据按天分组统计 + attendanceNumberDTOs = attendanceInfoMapper.getCountForWeek(); + }else if("day".equals(dimension)) { + //今天数据按小时分组统计 + attendanceNumberDTOs = attendanceInfoMapper.getCountForDay(); + } + if(CollectionUtils.isEmpty(attendanceNumberDTOs)){ + return ResponseData.error("该查询条件下,无员工出勤数据!"); + } + Map> collect = attendanceNumberDTOs.stream().collect(Collectors.groupingBy(AttendanceNumberDTO::getDate)); + collect.keySet().forEach(key -> { + List attendanceNumberDTOS = collect.get(key); + AttendanceNumberDTO attendanceNumberDTO = attendanceNumberDTOS.get(0); + AttendanceNumberDTO attendanceNumberDTO2 = attendanceNumberDTOS.get(1); + Map resultMap = new HashMap<>(); + resultMap.put(attendanceNumberDTO.getStaffType(), attendanceNumberDTO.getQuantity()); + resultMap.put(attendanceNumberDTO2.getStaffType(), attendanceNumberDTO2.getQuantity()); + resultMap.put("staticTime", attendanceNumberDTO.getDate()); + resultList.add(resultMap); + }); + return ResponseData.success(resultList); + } /** - * 近30天/近一周安保人员到岗排行 + * 早晚高峰区域安防评估 */ + @PostMapping("/security/assessment/{dimension}") + @ResponseBody + public Object securityAssessment(@PathVariable("dimension") String dimension) { + //查询各危险级别权重、各类别权重,放入map,避免循环中多次查数据库 + HashMap hazardScoreMap = new HashMap<>(); + List caseHazardLevelList = hazardLevelMapper.getCaseHazardLevelList(null); + caseHazardLevelList.forEach(hazardLevel -> { + hazardScoreMap.put(hazardLevel.getCode(), hazardLevel.getWeight()); + }); + HashMap categoryScoreMap = new HashMap<>(); + List categoryLevelList = categoryLevelMapper.getCaseCategoryLevelList(null); + categoryLevelList.forEach(categoryLevel -> { + categoryScoreMap.put(categoryLevel.getCode(), categoryLevel.getWeight()); + }); + HashMap hashMap = new HashMap<>(); + if("week".equals(dimension)){ + //近7天早晚高峰数据 + List caseInfos = caseInfoMapper.selectListBySevenDay(); + //按时间(天)进行分组 + caseInfos.forEach(caseInfo -> { + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); + Double score = Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + String[] array = caseInfo.getHappenTime().split(" "); + String dayTime = array[0]; + BigDecimal preScore; + if(hashMap.containsKey(dayTime)){ + Double aDouble = hashMap.get(dayTime); + preScore = new BigDecimal(aDouble.toString()); + + }else{ + preScore = new BigDecimal("100.0"); + } + BigDecimal nowScore = new BigDecimal(score.toString()); + hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); + }); + return ResponseData.success(hashMap); + }else if("day".equals(dimension)) { + //今天数据按小时分组统计 + List caseInfos = caseInfoMapper.selectListByToday(); + caseInfos.forEach(caseInfo -> { + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); + Double score = Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + String[] array = caseInfo.getHappenTime().split(":"); + String dayTime = array[0]; + BigDecimal preScore; + if(hashMap.containsKey(dayTime)){ + Double aDouble = hashMap.get(dayTime); + preScore = new BigDecimal(aDouble.toString()); + + }else{ + preScore = new BigDecimal("100.0"); + } + BigDecimal nowScore = new BigDecimal(score.toString()); + hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); + }); + return ResponseData.success(hashMap); + } + return null; + } + + /** + * 重点区域安防事态评估,统计重点区域6:00-23:00按小时分组数据 + */ + @GetMapping("/security/keyAreaStatistic") + @ResponseBody + public Object keyAreaStatistic() { + //查询各危险级别权重、各类别权重,放入map,避免循环中多次查数据库 + HashMap hazardScoreMap = new HashMap<>(); + List caseHazardLevelList = hazardLevelMapper.getCaseHazardLevelList(null); + caseHazardLevelList.forEach(hazardLevel -> { + hazardScoreMap.put(hazardLevel.getCode(), hazardLevel.getWeight()); + }); + HashMap categoryScoreMap = new HashMap<>(); + List categoryLevelList = categoryLevelMapper.getCaseCategoryLevelList(null); + categoryLevelList.forEach(categoryLevel -> { + categoryScoreMap.put(categoryLevel.getCode(), categoryLevel.getWeight()); + }); + HashMap hashMap = new HashMap<>(); + //今天数据按小时分组统计 + List caseInfos = caseInfoMapper.selectListByToday2(); + caseInfos.forEach(caseInfo -> { + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); + Double score = Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + String[] array = caseInfo.getHappenTime().split(":"); + String dayTime = array[0]; + BigDecimal preScore; + if(hashMap.containsKey(dayTime)){ + Double aDouble = hashMap.get(dayTime); + preScore = new BigDecimal(aDouble.toString()); + + }else{ + preScore = new BigDecimal("100.0"); + } + BigDecimal nowScore = new BigDecimal(score.toString()); + hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); + }); + return ResponseData.success(hashMap); + } + + /** + * 安防机动支援力量调配响应评估,根据事件已解决状态及已解决时间-发送时间,按时间(小时)分组统计 + */ + @GetMapping("/security/responseAssess") + @ResponseBody + public Object responseAssess() { + //查询各危险级别权重、各类别权重,放入map,避免循环中多次查数据库 + HashMap hazardScoreMap = new HashMap<>(); + List caseHazardLevelList = hazardLevelMapper.getCaseHazardLevelList(null); + caseHazardLevelList.forEach(hazardLevel -> { + hazardScoreMap.put(hazardLevel.getCode(), hazardLevel.getWeight()); + }); + HashMap hashMap = new HashMap<>(); + //今天数据按小时分组统计 + List caseInfos = caseInfoMapper.selectListByToday3(); + caseInfos.forEach(caseInfo -> { + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + //扣分=事件级别权重*未解决小时数 + Date updateTime = DateUtil.parse(caseInfo.getUpdateTime()); + Date happenTime = DateUtil.parse(caseInfo.getHappenTime()); + long between = DateUtil.between(updateTime, happenTime, DateUnit.HOUR); + Double score = Double.valueOf(hazardWeight)*between; + String[] array = caseInfo.getHappenTime().split(":"); + String dayTime = array[0]; + BigDecimal preScore; + if(hashMap.containsKey(dayTime)){ + Double aDouble = hashMap.get(dayTime); + preScore = new BigDecimal(aDouble.toString()); + }else{ + preScore = new BigDecimal("100.0"); + } + BigDecimal nowScore = new BigDecimal(score.toString()); + hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); + }); + return ResponseData.success(hashMap); + } /** * 重点区域威胁事件类型统计,优先级2,统计近7天和近30天 @@ -224,7 +413,34 @@ } /** - * 设备状态计算系数和评判,优先级3,需确认设备恢复时间是否可以获取 + * 近30天/近一周安保人员到岗排行 */ + + /** + * 安保等级评估,发生离岗事件减1分 + */ + @GetMapping("/security/levelAssess") + @ResponseBody + public Object securityLevelAssess() { + //今天数据按小时分组统计 + List resultList = caseInfoMapper.selectListByType(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); + resultList.forEach(result -> { + BigDecimal deScore = new BigDecimal(result.getQuantity()); + BigDecimal preScore = new BigDecimal("100.0"); + result.setScore(preScore.subtract(deScore).doubleValue()); + }); + return ResponseData.success(resultList); + } + + /** + * 设备状态计算系数和评判,即设备维修管理查询(不分页) + */ + @PostMapping("/device/repairList") + @ResponseBody + public Object repairList(@RequestBody DeviceRepairRequest deviceRepairRequest) { + List deviceRepairLogDTOS = deviceInfoService.deviceRepairListPage(deviceRepairRequest); + return ResponseData.success(deviceRepairLogDTOS); + } + } 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 fbf8ab6..c71a15a 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 @@ -1,13 +1,12 @@ package com.casic.missiles.modular.controller.hik; +import cn.hutool.core.date.DateTime; +import cn.hutool.core.date.DateUtil; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.casic.missiles.model.response.ResponseData; import com.casic.missiles.modular.dao.HikFaceGroupInfoMapper; -import com.casic.missiles.modular.dto.hik.EventSubscribeRequest; -import com.casic.missiles.modular.dto.hik.FaceGroupAdditionRequest; -import com.casic.missiles.modular.dto.hik.HikRecvEvent; -import com.casic.missiles.modular.dto.hik.OrgBatchAdd; +import com.casic.missiles.modular.dto.hik.*; import com.casic.missiles.modular.enums.HikUri; import com.casic.missiles.modular.enums.SecurityEventType; import com.casic.missiles.modular.model.CaseInfo; @@ -18,16 +17,20 @@ import com.casic.missiles.modular.util.CaseInfoFactoryUtil; import com.casic.missiles.modular.util.HikUtil; import com.casic.missiles.modular.util.ThreadPoolUtil; +import com.casic.missiles.modular.util.WebSocket; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; -import org.springframework.web.bind.annotation.*; +import org.springframework.util.CollectionUtils; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.RestController; -import java.net.InetAddress; -import java.net.UnknownHostException; import java.util.ArrayList; +import java.util.Iterator; import java.util.List; import java.util.Objects; @@ -38,7 +41,6 @@ */ @Slf4j @RestController -@RequestMapping("/hik") public class HikController { @Autowired @@ -53,28 +55,37 @@ @Autowired private HikService hikService; + @Autowired + private HikFaceGroupInfoMapper hikFaceGroupInfoMapper; + + @Autowired + private WebSocket webSocket; + @Value("${server.port}") private int serverPort; - @Autowired - private HikFaceGroupInfoMapper hikFaceGroupInfoMapper; /** * 海康事件订阅 */ - @PostMapping("/event/subscribe") + @PostMapping("/hik/event/subscribe") @ResponseBody - public Object eventSubscribe() throws UnknownHostException { + public Object eventSubscribe() { EventSubscribeRequest eventSubscribeRequest = new EventSubscribeRequest(); ArrayList list = new ArrayList<>(); list.add(SecurityEventType.DEVICE_OFFLINE); + list.add(SecurityEventType.DEVICE_ONLINE); list.add(SecurityEventType.KEY_PERSONNEL_IDENTIFY_EVENT); list.add(SecurityEventType.MONITORING_POINT_OFFLINE); + list.add(SecurityEventType.MONITORING_POINT_ONLINE); list.add(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); list.add(SecurityEventType.PERSONNEL_GATHER_EVENT); - InetAddress localHost = InetAddress.getLocalHost(); + list.add(SecurityEventType.VISITOR_REGISTER); + list.add(SecurityEventType.VISITOR_CHECKOUT); + list.add(SecurityEventType.HIGH_ALTITUDE_PARABOLIC); +// InetAddress localHost = InetAddress.getLocalHost(); eventSubscribeRequest.setEventTypes(list); - eventSubscribeRequest.setEventDest("https://" + localHost + ":" + serverPort + "/eventRcv"); + eventSubscribeRequest.setEventDest("http://" + "192.168.10.6" + ":" + serverPort + "/eventRcv"); //订阅类型,0-订阅原始事件,1-联动事件,2-原始事件和联动事件,不填使用默认值0 eventSubscribeRequest.setSubType(0); /** @@ -92,19 +103,25 @@ } /** + * 查询事件订阅信息 + */ + @PostMapping("/hik/event/query") + @ResponseBody + public Object eventQuery() { + String result = HikUtil.hikApi(HikUri.EVENT_INFO, ""); + return result; + } + + /** * 海康事件接收 */ @PostMapping("/eventRcv") @ResponseBody public Object eventRcv(@RequestBody HikRecvEvent hikRecvEvent) { //1、接收所需事件类型 - Long eventType = hikRecvEvent.getEventType(); + Number eventType = hikRecvEvent.getEventType(); log.info("接收到安防事件类型为:{}", eventType); CaseInfo caseInfo = caseInfoFactoryUtil.getCaseInfo(eventType); - //接收到不关心事件直接返回 - if(Objects.isNull(caseInfo)){ - return ResponseData.success(); - } //2、不同事件不同处理,caseInfoFactoryUtil已设置好事件基础定义信息 // 再为事件添加状态、设备编码、设备名称、位置、区域、时间 // 异步处理事件 @@ -114,19 +131,23 @@ caseHandle(hikRecvEvent, eventType, caseInfo); } })); +// caseHandle(hikRecvEvent, eventType, caseInfo); - return null; + return ResponseData.success(); } - private void caseHandle(HikRecvEvent hikRecvEvent, Long eventType, CaseInfo caseInfo) { + private void caseHandle(HikRecvEvent hikRecvEvent, Number eventType, CaseInfo caseInfo) { JSONArray eventArray = hikRecvEvent.getEventArray(); List caseInfos = new ArrayList<>(); - while (eventArray.stream().iterator().hasNext()) { + Iterator iterator = eventArray.iterator(); + while (iterator.hasNext()) { CaseInfo caseInfo1 = new CaseInfo(); - BeanUtils.copyProperties(caseInfo, caseInfo1); - JSONObject event = (JSONObject) eventArray.stream().iterator().next(); + if(!Objects.isNull(caseInfo)){ + BeanUtils.copyProperties(caseInfo, caseInfo1); + } + JSONObject event = (JSONObject) iterator.next(); //5种事件进行不同处理 - if(SecurityEventType.KEY_PERSONNEL_IDENTIFY_EVENT == eventType){ + if (SecurityEventType.KEY_PERSONNEL_IDENTIFY_EVENT.equals(eventType)) { //判断所属人脸分组 JSONObject data = (JSONObject) event.get("data"); JSONObject faceRecognitionResult = (JSONObject) data.get("faceRecognitionResult"); @@ -142,52 +163,101 @@ if (faceGroupCode.equals(blackListGroup.getFaceGroupCode())) { //黑名单分组处理 caseInfo1 = hikService.blackListHandle(event, caseInfo1); - }else if(faceGroupCode.equals(propertyPersonnelGroup.getFaceGroupCode())){ + } else if (faceGroupCode.equals(propertyPersonnelGroup.getFaceGroupCode())) { //考勤分组处理-物业人员,添加到考勤表 hikService.propertyAttendanceHandle(event); - }else if(faceGroupCode.equals(securityPersonnelGroup.getFaceGroupCode())){ + } else if (faceGroupCode.equals(securityPersonnelGroup.getFaceGroupCode())) { //考勤分组处理-安保人员,添加到考勤表 hikService.securityPersonnelHandle(event); - }else { + } else { return; } - }else if(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT == eventType){ + } else if (SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT.equals(eventType)) { //离岗事件处理 caseInfo1 = hikService.demobilizedHandle(event, caseInfo1); - }else if(SecurityEventType.PERSONNEL_GATHER_EVENT == eventType){ + } else if (SecurityEventType.PERSONNEL_GATHER_EVENT.equals(eventType)) { //人员聚集事件处理 caseInfo1 = hikService.personGatherHandle(event, caseInfo1); - }else if(SecurityEventType.MONITORING_POINT_OFFLINE == eventType){ + } else if (SecurityEventType.MONITORING_POINT_OFFLINE.equals(eventType)) { //监控点离线事件处理 caseInfo1 = hikService.monitorPointOfflineHandle(event, caseInfo1); - }else if(SecurityEventType.DEVICE_OFFLINE == eventType){ + } else if (SecurityEventType.MONITORING_POINT_ONLINE.equals(eventType)) { + //监控点上线事件处理 + hikService.monitorPointOnlineHandle(event); + } else if (SecurityEventType.DEVICE_OFFLINE.equals(eventType)) { //装置离线事件处理 caseInfo1 = hikService.deviceOfflineHandle(event, caseInfo1); - }else if(SecurityEventType.VISITOR_REGISTER == eventType){ + } else if (SecurityEventType.DEVICE_ONLINE.equals(eventType)) { + //装置上线处理 + hikService.deviceOnlineHandle(event); + } else if (SecurityEventType.VISITOR_REGISTER.equals(eventType)) { //记录访客登记记录,添加到访客记录表 hikService.visitorRegisterHandler(event); - }else if(SecurityEventType.VISITOR_CHECKOUT == eventType){ + } else if (SecurityEventType.VISITOR_CHECKOUT.equals(eventType)) { //记录访客签离记录 hikService.visitorCheckOutHandler(event); } - if(!Objects.isNull(caseInfo1) && !StringUtils.isEmpty(caseInfo1.getHappenTime())){ + if (!Objects.isNull(caseInfo1) && !StringUtils.isEmpty(caseInfo1.getHappenTime())) { caseInfos.add(caseInfo1); } } //3、安防事件入库 - if(!caseInfoService.insertCaseInfoBatch(caseInfos)){ - log.error("安防事件批量入库异常"); + if (!CollectionUtils.isEmpty(caseInfos) && !caseInfoService.insertCaseInfoBatch(caseInfos)) { + log.error("安防事件批量入库异常!"); } // TODO: 2022/8/15 webSocket推送 + if (CollectionUtils.isEmpty(caseInfos)) { + log.info("webSocket事件推送"); + webSocket.sendAllMessage(JSONObject.toJSONString(caseInfos)); + } return; } /** + * 以图搜图,前端用于轨迹追踪 + */ + @PostMapping("/hik/search/picture") + @ResponseBody + public Object searchPictures(@RequestBody SearchPicturesRequest searchPicturesRequest) { + DateTime startDateTime = DateUtil.parse(searchPicturesRequest.getStartTime()); + DateTime endDateTime = DateUtil.parse(searchPicturesRequest.getEndTime()); + String startTime = DateUtil.format(startDateTime, "yyyy-MM-dd'T'HH:mm:ss.SSSXXX"); + String endTime = DateUtil.format(endDateTime, "yyyy-MM-dd'T'HH:mm:ss.SSSXXX"); + searchPicturesRequest.setStartTime(startTime); + searchPicturesRequest.setEndTime(endTime); + String body = JSONObject.toJSONString(searchPicturesRequest); + String resultStr = HikUtil.hikApi(HikUri.SEARCH_PICTURES, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (!"0".equals(resultJson.get("code"))) { + log.error("请求海康,以图搜图失败,海康response:{}", resultStr); + return ResponseData.error("以图搜图失败"); + } + return ResponseData.success(resultJson); + } + + + /** + * 海康事件取消订阅 + */ + @PostMapping("/hik/event/cancel") + @ResponseBody + public Object eventCancelSubscribe(@RequestBody CancelSubscribeRequest cancelSubscribeRequest) { + String body = JSONObject.toJSONString(cancelSubscribeRequest); + String resultStr = HikUtil.hikApi(HikUri.EVENT_CANCEL, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (!"0".equals(resultJson.get("code"))) { + log.error("请求海康,取消订阅失败,海康response:{}", resultStr); + return ResponseData.error("取消订阅失败"); + } + return ResponseData.success(resultJson); + } + + /** * 单个添加海康人脸分组 * api->hik单个添加人脸分组api->response->mysql */ - @PostMapping("/faceGroup/single/add") + @PostMapping("/hik/faceGroup/single/add") @ResponseBody public Object faceGroupAddition(@RequestBody FaceGroupAdditionRequest faceGroupAdditionRequest) { String body = JSONObject.toJSONString(faceGroupAdditionRequest); @@ -212,7 +282,7 @@ * 批量添加海康组织 * api->hik批量添加组织api->response */ - @PostMapping("/org/batch/add") + @PostMapping("/hik/org/batch/add") @ResponseBody public Object orgBatchAdd(@RequestBody List orgBatchAddRequest) { String body = JSONObject.toJSONString(orgBatchAddRequest); @@ -232,4 +302,62 @@ return ResponseData.error("批量添加组织失败"); } + /** + * 获取人员列表 + */ + @PostMapping("/hik/person/personList") + @ResponseBody + public Object personList() { + PersonListRequest request = new PersonListRequest(); + request.setPageNo(1); + request.setPageSize(100); + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi("/api/resource/v2/person/personList", body); + return resultStr; + } + + /** + * 获取组织列表 + */ + @PostMapping("/hik/org/orgList") + @ResponseBody + public Object orgList() { + PersonListRequest request = new PersonListRequest(); + request.setPageNo(1); + request.setPageSize(100); + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi("/api/resource/v1/org/orgList", body); + return resultStr; + } + + /** + * 查询访客权限下载记录 + */ + @PostMapping("/hik/auth/result") + @ResponseBody + public Object authResult() { + PersonListRequest request = new PersonListRequest(); + request.setPageNo(1); + request.setPageSize(100); + request.setOrderId("ba101db6246711edaea66f7939a13638"); + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi("/api/visitor/v1/auth/result", body); + return resultStr; + } + + /** + * 人脸图片获取 + */ + @PostMapping("/hik/face/picture") + @ResponseBody + public Object facePicture() { + FaceRequest request = new FaceRequest(); +// List list = new ArrayList<>(); +// list.add(""); + request.setCertificateNum("wanggong"); + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi("/api/frs/v1/face", body); + return resultStr; + } + } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/AssetInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/AssetInfoMapper.java index 4f64e83..c0684ee 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/AssetInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/AssetInfoMapper.java @@ -17,6 +17,6 @@ @Mapper public interface AssetInfoMapper extends BaseMapper { - List getAssetInfoListPage(@Param("page") Page page, AssetInfoRequest assetInfoRequest); + List getAssetInfoListPage(@Param("page") Page page, @Param("assetInfoRequest") AssetInfoRequest assetInfoRequest); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/AttendanceInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/AttendanceInfoMapper.java index f9e793e..ec87e46 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/AttendanceInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/AttendanceInfoMapper.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.statistics.AttendanceNumberDTO; import com.casic.missiles.modular.dto.statistics.AttendanceRatioDTO; import com.casic.missiles.modular.model.AttendanceInfo; import org.apache.ibatis.annotations.Mapper; @@ -17,7 +18,7 @@ */ @Mapper public interface AttendanceInfoMapper extends BaseMapper { - List getAttendanceInfoListPage(@Param("page") Page page, StaffInfoRequest attendanceInfoRequest); + List getAttendanceInfoListPage(@Param("page") Page page, @Param("attendanceInfoRequest") StaffInfoRequest attendanceInfoRequest); AttendanceInfo selectByCodeAndDate(@Param("staffCode") String staffCode); @@ -26,4 +27,8 @@ List getCountByTypeAndDateForMonth(@Param("staffType")String staffType); List getCountByTypeAndDateForYear(@Param("staffType")String staffType); + + List getCountForWeek(); + + List getCountForDay(); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java index ce94b8f..6137a7d 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java @@ -17,5 +17,5 @@ @Mapper public interface BlackInfoMapper extends BaseMapper { - List getBlackInfoListPage(@Param("page") Page page, BlackInfoRequest blackInfoRequest); + List getBlackInfoListPage(@Param("page") Page page, @Param("blackInfoRequest") BlackInfoRequest blackInfoRequest); } 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 efda6b3..50aaa6f 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 @@ -20,7 +20,7 @@ List getCaseInfoListPage(@Param("page") Page page, @Param("caseInfoRequest") CaseInfoRequest caseInfoRequest); - int updateStatusById(CaseInfoRequest caseInfoRequest); + int updateStatusById(@Param("caseInfoRequest") CaseInfoRequest caseInfoRequest); List selectByLevelAndMonth(@Param("year") String year); @@ -47,4 +47,20 @@ List selectPreWeekCountByThirtyDay(); List selectPreDayCountBySevenDay(); + + Integer selectDemobilizedCount(@Param("eventType") Number personnelDemobilizedEvent); + + List selectPreMonthCount(); + + List selectListBySevenDay(); + + List selectListByToday(); + + List selectListByToday2(); + + List selectListByToday3(); + + List selectListByType(@Param("eventType") Number eventType); + + List selectDemobilizedCountByHour(@Param("eventType") Number eventType); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/CategoryLevelMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/CategoryLevelMapper.java index 52fc714..afe1650 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/CategoryLevelMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/CategoryLevelMapper.java @@ -17,9 +17,9 @@ @Mapper public interface CategoryLevelMapper extends BaseMapper { - List getCaseCategoryLevelListPage(@Param("page") Page page, CategoryLevelRequest categoryLevelRequest); + List getCaseCategoryLevelListPage(@Param("page") Page page, @Param("categoryLevelRequest") CategoryLevelRequest categoryLevelRequest); - List getCaseCategoryLevelList(CategoryLevelRequest categoryLevelRequest); + List getCaseCategoryLevelList(@Param("categoryLevelRequest") CategoryLevelRequest categoryLevelRequest); CaseCategoryLevel getCaseCategoryLevel(@Param("categoryLevelCode") String categoryLevelCode); 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 66353b1..2555a09 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 @@ -19,7 +19,7 @@ @Mapper public interface DeviceInfoMapper extends BaseMapper { - List getDeviceInfoListPage(@Param("page") Page page, DeviceInfoRequest deviceInfoRequest); + List getDeviceInfoListPage(@Param("page") Page page, @Param("deviceInfoRequest") DeviceInfoRequest deviceInfoRequest); List getDeviceInfoList(@Param("deviceInfoRequest") DeviceInfoRequest deviceInfoRequest); @@ -27,6 +27,8 @@ DeviceInfo getByIndexCode(@Param("srcIndex") String srcIndex); + DeviceInfo getByIp(@Param("ip") String ip); + List selectIndexCodesByCodes(@Param("deviceCodes") List deviceCodes); List selectByType(@Param("devType") String devType); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java index 41dd0af..5bfaf63 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java @@ -5,6 +5,7 @@ import com.casic.missiles.modular.dto.DeviceRepairRequest; import com.casic.missiles.modular.model.DeviceRepairLog; import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; import java.util.List; @@ -16,7 +17,7 @@ @Mapper public interface DeviceRepairLogMapper extends BaseMapper { - List getDeviceRepairListPage(Page page, DeviceRepairRequest deviceRepairRequest); + List getDeviceRepairListPage(@Param("page") Page page, @Param("deviceRepairRequest")DeviceRepairRequest deviceRepairRequest); - List getDeviceRepairList(DeviceRepairRequest deviceRepairRequest); + List getDeviceRepairList(@Param("deviceRepairRequest") DeviceRepairRequest deviceRepairRequest); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java index 9035c47..4823ac1 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java @@ -18,7 +18,7 @@ @Mapper public interface FireEquipInfoMapper extends BaseMapper { - List getFireEquipInfoListPage(@Param("page") Page page, FireEquipRequest fireEquipRequest); + List getFireEquipInfoListPage(@Param("page") Page page, @Param("fireEquipRequest") FireEquipRequest fireEquipRequest); FireEquipInfo getFireEquipInfo(@Param("equipCode") String equipCode); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/GateGroupMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/GateGroupMapper.java index d8c330d..977a427 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/GateGroupMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/GateGroupMapper.java @@ -17,7 +17,7 @@ */ @Mapper public interface GateGroupMapper extends BaseMapper { - List getGateGroupListPage(@Param("page") Page page, GateGroupRequest gateGroupRequest); + List getGateGroupListPage(@Param("page") Page page, @Param("gateGroupRequest") GateGroupRequest gateGroupRequest); GateGroup getGateGroupByName(@Param("groupName") String groupName); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/HazardLevelMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/HazardLevelMapper.java index 8957780..dcf47bb 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/HazardLevelMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/HazardLevelMapper.java @@ -17,11 +17,13 @@ @Mapper public interface HazardLevelMapper extends BaseMapper { - List getCaseHazardLevelListPage(@Param("page") Page page, HazardLevelRequest hazardLevelRequest); + List getCaseHazardLevelListPage(@Param("page") Page page, @Param("hazardLevelRequest") HazardLevelRequest hazardLevelRequest); - List getCaseHazardLevelList(HazardLevelRequest hazardLevelRequest); + List getCaseHazardLevelList(@Param("hazardLevelRequest") HazardLevelRequest hazardLevelRequest); CaseHazardLevel getCaseHazardLevel(@Param("hazardLevelCode") String hazardLevelCode); List selectHazardName(); + + String selectHazardNameByCode(@Param("hazardLevelCode") String hazardLevelCode); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/HikCaseDefineMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/HikCaseDefineMapper.java index 0dc47d1..f162fef 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/HikCaseDefineMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/HikCaseDefineMapper.java @@ -12,5 +12,5 @@ */ @Mapper public interface HikCaseDefineMapper extends BaseMapper { - HikCaseDefine getHikCaseDefine(@Param("caseTypeCode") Long caseTypeCode); + HikCaseDefine getHikCaseDefine(@Param("caseTypeCode") Number caseTypeCode); } 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 f8a674c..fe5afc2 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 @@ -17,11 +17,13 @@ @Mapper public interface StaffInfoMapper extends BaseMapper { - List getStaffInfoListPage(@Param("page") Page page, StaffInfoRequest staffInfoRequest); + List getStaffInfoListPage(@Param("page") Page page, @Param("staffInfoRequest") StaffInfoRequest staffInfoRequest); StaffInfo selectByCode(@Param("staffCode") String staffCode); - List getStaffInfoList(StaffInfoRequest staffInfoRequest); + List getStaffInfoList(@Param("staffInfoRequest") StaffInfoRequest staffInfoRequest); - List selectBatchCodes(List list); + List selectBatchCodes(@Param("list") List list); + + int updateByCodeForCard(@Param("staffCode") String staffCode, @Param("cardNo") String cardNo); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitInfoMapper.java index b1217c5..6c52542 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitInfoMapper.java @@ -16,7 +16,7 @@ */ @Mapper public interface VisitInfoMapper extends BaseMapper { - List getVisitInfoListPage(@Param("page") Page page, VisitorRequest visitorRequest); + List getVisitInfoListPage(@Param("page") Page page, @Param("visitorRequest") VisitorRequest visitorRequest); VisitInfo selectByOrderId(@Param("orderId") String orderId); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitorApplyMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitorApplyMapper.java index c09f3c0..6ea55bd 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitorApplyMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitorApplyMapper.java @@ -18,7 +18,7 @@ @Mapper public interface VisitorApplyMapper extends BaseMapper { - List getVisitorApplyListPage(@Param("page") Page page, VisitorApplyRequest visitorApplyRequest); + List getVisitorApplyListPage(@Param("page") Page page, @Param("visitorApplyRequest") VisitorApplyRequest visitorApplyRequest); List selectByVisitReason(); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/AttendanceInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/AttendanceInfoMapper.xml index b2ece71..f8bdd6e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/AttendanceInfoMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/AttendanceInfoMapper.xml @@ -43,7 +43,8 @@ and staff_type = #{staffType} - and YEARWEEK(date_format(atte_date, '%Y-%m-%d'), 1) = YEARWEEK(now(),1); + AND DATE_SUB(CURDATE(), INTERVAL 7 DAY) <= DATE(atte_date) + GROUP BY DATE_FORMAT(atte_date, '%Y-%m-%d') @@ -69,4 +70,20 @@ GROUP BY DATE_FORMAT(atte_date, '%Y-%m') + + + \ No newline at end of file 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 2b6953f..06ec0a8 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 @@ -28,7 +28,9 @@ @@ -87,7 +89,8 @@ SELECT hazard_level_code as levelCode, count(id) as quantity FROM bus_case_info WHERE hazard_level_code is not null - AND DATE_SUB(CURDATE(), INTERVAL 7 DAY) <= date(happen_time); + AND is_key_area = 1 + AND DATE_SUB(CURDATE(), INTERVAL 7 DAY) <= date(happen_time) GROUP BY hazard_level_code @@ -95,7 +98,8 @@ SELECT hazard_level_code as levelCode, count(id) as quantity FROM bus_case_info WHERE hazard_level_code is not null - AND DATE_SUB(CURDATE(), INTERVAL 30 DAY) <= date(happen_time); + AND is_key_area = 1 + AND DATE_SUB(CURDATE(), INTERVAL 30 DAY) <= date(happen_time) GROUP BY hazard_level_code @@ -122,4 +126,71 @@ AND hazard_level_code is not null GROUP BY DATE_FORMAT(happen_time,'%Y-%m-%d') + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/CategoryLevelMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/CategoryLevelMapper.xml index 4670b1f..1d25cbd 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/CategoryLevelMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/CategoryLevelMapper.xml @@ -20,11 +20,11 @@ SELECT * FROM bus_case_category_level WHERE 1=1 - - and code = #{code} + + and code = #{categoryLevelRequest.code} - - and name = #{name} + + and name = #{categoryLevelRequest.name} ORDER by create_time DESC 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 9b66fd8..bfd84b7 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 @@ -98,4 +98,10 @@ #{item} + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceRepairLogMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceRepairLogMapper.xml index 078ed3c..cf1a481 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceRepairLogMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceRepairLogMapper.xml @@ -22,14 +22,14 @@ SELECT * FROM bus_device_repair_log WHERE 1=1 - - and device_code = #{devCode} + + and device_code = #{deviceRepairRequest.devCode} - - and device_name = #{devName} + + and device_name = #{deviceRepairRequest.devName} - - and DATE_FORMAT(create_time,"%y%m%d") = DATE_FORMAT(#{createTime},"%y%m%d") + + and DATE_FORMAT(create_time,"%y%m%d") = DATE_FORMAT(#{deviceRepairRequest.createTime},"%y%m%d") ORDER by create_time DESC diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/HazardLevelMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/HazardLevelMapper.xml index f16f2b9..458322b 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/HazardLevelMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/HazardLevelMapper.xml @@ -20,11 +20,11 @@ SELECT * FROM bus_case_hazard_level WHERE 1=1 - - and code = #{code} + + and code = #{hazardLevelRequest.code} - - and name = #{name} + + and name = #{hazardLevelRequest.name} ORDER by create_time DESC @@ -42,4 +42,10 @@ SELECT name FROM bus_case_hazard_level + + \ 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 557237e..b6a183a 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 @@ -50,4 +50,10 @@ + + + UPDATE bus_staff_info + SET card_no = #{cardNo} + WHERE staff_code = #{staffCode} + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitInfoMapper.xml index 84aa84f..230529a 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitInfoMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitInfoMapper.xml @@ -27,5 +27,6 @@ SELECT * FROM bus_visit_info WHERE order_id = #{orderId} and DATE_FORMAT(in_time,'%Y-%m-%d') = CURRENT_DATE + limit 1 \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/BlackPictureRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/BlackPictureRequest.java new file mode 100644 index 0000000..fc92701 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/BlackPictureRequest.java @@ -0,0 +1,14 @@ +package com.casic.missiles.modular.dto; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/29 19:26 + */ +@Data +public class BlackPictureRequest { + private String picUri; + private String serverIndexCode; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/CancelSubscribeRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/CancelSubscribeRequest.java new file mode 100644 index 0000000..e2d390a --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/CancelSubscribeRequest.java @@ -0,0 +1,15 @@ +package com.casic.missiles.modular.dto.hik; + +import lombok.Data; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/24 15:14 + */ +@Data +public class CancelSubscribeRequest { + private List eventTypes; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/CardInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/CardInfo.java new file mode 100644 index 0000000..341457d --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/CardInfo.java @@ -0,0 +1,24 @@ +package com.casic.missiles.modular.dto.hik; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/26 16:08 + */ +@Data +public class CardInfo { + //卡号,8~20个字符,支持数字和大写字母 + private String cardNo; + //人员ID,员工工号 + private String personId; + //人员所属组织IndexCode + private String orgIndexCode; + //卡片类型,默认是1:IC卡 + //1:IC卡 + //2:CPU卡 + //3:远距离卡 + //4:MIFARE卡 + private Number cardType; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/FaceRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/FaceRequest.java new file mode 100644 index 0000000..edc04bf --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/FaceRequest.java @@ -0,0 +1,16 @@ +package com.casic.missiles.modular.dto.hik; + +import lombok.Data; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/25 16:53 + */ +@Data +public class FaceRequest { + private String certificateNum; + private List indexCodes; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/HikRecvEvent.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/HikRecvEvent.java index a3e9845..1b2b2b1 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/HikRecvEvent.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/HikRecvEvent.java @@ -28,12 +28,12 @@ /** * 事件类型,用于判断所需接收到的事件类型 */ - public Long getEventType(){ + public Number getEventType(){ JSONObject jsonObject = (JSONObject)JSONObject.toJSON(params); //事件类别对应SecurityEventTypeEnum JSONArray eventTypeArray = (JSONArray)jsonObject.get("events"); JSONObject eventJsonObject = (JSONObject)JSONObject.toJSON(eventTypeArray.get(0)); - Long eventType = (Long) eventJsonObject.get("eventType"); + Number eventType = (Number) eventJsonObject.get("eventType"); return eventType; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonBatchDeleteRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonBatchDeleteRequest.java index 027d31d..9751929 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonBatchDeleteRequest.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonBatchDeleteRequest.java @@ -12,4 +12,6 @@ @Data public class PersonBatchDeleteRequest { private List personIds; + //删除人脸接口使用 + private String faceId; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonInfoRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonInfoRequest.java new file mode 100644 index 0000000..05dc9e1 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonInfoRequest.java @@ -0,0 +1,20 @@ +package com.casic.missiles.modular.dto.hik; + +import lombok.Data; + +import java.util.List; + +/** + * @Description: 获取员工照片请求实体 + * @Author: wangpeng + * @Date: 2022/8/25 16:53 + */ +@Data +public class PersonInfoRequest { + //获取员工详细信息使用 + private String paramName; + private List paramValue; + //获取照片使用 + private String picUri; + private String serverIndexCode; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonListRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonListRequest.java new file mode 100644 index 0000000..3f7149b --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonListRequest.java @@ -0,0 +1,16 @@ +package com.casic.missiles.modular.dto.hik; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/25 16:53 + */ +@Data +public class PersonListRequest { + private Number pageNo; + private Number pageSize; + + private String orderId; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/SearchPicturesRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/SearchPicturesRequest.java new file mode 100644 index 0000000..0a95966 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/SearchPicturesRequest.java @@ -0,0 +1,24 @@ +package com.casic.missiles.modular.dto.hik; + +import lombok.Data; + +import java.util.List; + +/** + * @Description: 以图搜图请求 + * @Author: wangpeng + * @Date: 2022/8/29 10:46 + */ +@Data +public class SearchPicturesRequest { + private String facePicBinaryData; + private String facePicUrl; + private List cameraIndexCodes; + private String startTime; + private String endTime; + //指定搜图的最小相似度,最小为1,最大为100 + private String minSimilarity; + private Number age; + //male-男性,female-女性 + private String sex; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/StaffCardRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/StaffCardRequest.java new file mode 100644 index 0000000..4052e6d --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/StaffCardRequest.java @@ -0,0 +1,20 @@ +package com.casic.missiles.modular.dto.hik; + +import lombok.Data; + +import java.util.List; + +/** + * @Description: 人员开卡请求实体 + * @Author: wangpeng + * @Date: 2022/8/26 16:05 + */ +@Data +public class StaffCardRequest { + //卡片开始有效时间,时间格式:yyyy-MM-dd + private String startDate; + //卡片截止有效时间,时间格式:yyyy-MM-dd,不能大于2037年12月31日 + private String endDate; + //cardList,待开卡列表,最大支持50张卡 + private List cardList; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/VisitorInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/VisitorInfo.java index 73aa316..b99f301 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/VisitorInfo.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/VisitorInfo.java @@ -14,7 +14,7 @@ //访客性别 //1: 男 //2: 女 - private String gender; + private Integer gender; //联系电话建议填写手机号码 private String phoneNo; //证件类型 diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/ApplyReasonGroupDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/ApplyReasonGroupDTO.java index 514f382..786143e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/ApplyReasonGroupDTO.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/ApplyReasonGroupDTO.java @@ -13,4 +13,6 @@ private String visitReason; //访问人数 private Integer quantity; + //占比 + private String ratio; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/AttendanceNumberDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/AttendanceNumberDTO.java new file mode 100644 index 0000000..a494321 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/AttendanceNumberDTO.java @@ -0,0 +1,24 @@ +package com.casic.missiles.modular.dto.statistics; + +import com.fasterxml.jackson.annotation.JsonIgnore; +import lombok.Data; + +/** + * @Description: 出勤人数统计实体 + * @Author: wangpeng + * @Date: 2022/8/31 19:24 + */ +@Data +public class AttendanceNumberDTO { + //日期维度,周、今日,入参 + @JsonIgnore + private String dateDimension; + + //日期,具体天/小时,出参 + private String date; + //出勤人数 + private String quantity; + //员工类型 + private String staffType; + +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/AvgMonthAndWeekGroupDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/AvgMonthAndWeekGroupDTO.java index 4366916..331a9a9 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/AvgMonthAndWeekGroupDTO.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/AvgMonthAndWeekGroupDTO.java @@ -2,8 +2,6 @@ import lombok.Data; -import java.util.Map; - /** * @Description: 平均每月和每周的数据实体 * @Author: wangpeng @@ -13,6 +11,4 @@ public class AvgMonthAndWeekGroupDTO { //入参 private String year; - //出参,key:事件类型,value:周和月数据平均值 - private Map map; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/GateStatusGroupResponse.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/GateStatusGroupResponse.java new file mode 100644 index 0000000..d16f4e5 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/GateStatusGroupResponse.java @@ -0,0 +1,16 @@ +package com.casic.missiles.modular.dto.statistics; + +import lombok.Data; + +/** + * @Description: 闸机/摄像机统计响应实体 + * @Author: wangpeng + * @Date: 2022/8/30 14:22 + */ +@Data +public class GateStatusGroupResponse { + //设备状态 + private String status; + //占比 + private String ratio; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/MonthAndWeekDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/MonthAndWeekDTO.java index 7482b2a..284115a 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/MonthAndWeekDTO.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/MonthAndWeekDTO.java @@ -9,7 +9,7 @@ */ @Data public class MonthAndWeekDTO { -// private String levelName; + private String levelName; private Integer monthQuantity; private Integer weekQuantity; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/OnDutyRatioDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/OnDutyRatioDTO.java new file mode 100644 index 0000000..4f6a65d --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/OnDutyRatioDTO.java @@ -0,0 +1,15 @@ +package com.casic.missiles.modular.dto.statistics; + +import lombok.Data; + +/** + * @Description: 在岗率统计实体 + * @Author: wangpeng + * @Date: 2022/9/2 21:24 + */ +@Data +public class OnDutyRatioDTO { + private String date; + private String quantity; + private String ratio; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/SecurityLevelAssessDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/SecurityLevelAssessDTO.java new file mode 100644 index 0000000..40a0738 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/SecurityLevelAssessDTO.java @@ -0,0 +1,15 @@ +package com.casic.missiles.modular.dto.statistics; + +import lombok.Data; + +/** + * @Description: 出勤人数统计实体 + * @Author: wangpeng + * @Date: 2022/8/31 19:24 + */ +@Data +public class SecurityLevelAssessDTO { + private String date; + private String quantity; + private Double score; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/SecurityScoreDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/SecurityScoreDTO.java index 304d169..f7bd4a2 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/SecurityScoreDTO.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/SecurityScoreDTO.java @@ -14,5 +14,5 @@ //楼层,出参 private String area; //评分,出参 - private String score; + private Double score; } 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 6a30786..e5e613d 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 @@ -8,6 +8,10 @@ public interface HikUri { //事件订阅 String EVENT_SUBSCRIBE = "/api/eventService/v1/eventSubscriptionByEventTypes"; + //事件订阅信息查询 + String EVENT_INFO = "/api/eventService/v1/eventSubscriptionView"; + //事件订阅取消 + String EVENT_CANCEL = "/api/eventService/v1/eventUnSubscriptionByEventTypes"; //预约免登记 String APPOINTMENT_FREE_REGISTER = "/api/visitor/v1/appointment/registration"; //修改访客预约 @@ -32,8 +36,18 @@ String PERSON_SINGLE_UPDATE = "/api/resource/v1/person/single/update"; //批量删除人员 String PERSON_BATCH_DELETE = "/api/resource/v1/person/batch/delete"; + //根据人脸Id删除人脸 + String PERSON_SINGLE_DELETE = "/api/resource/v1/face/single/delete"; //门禁点反控 String DOOR_CONTROL = "/api/acs/v1/door/doControl"; //查询海康门禁点事件v2 String DOOR_EVENTS = "/api/acs/v2/door/events"; + //批量开卡 + String CARD_BINDING = "/api/cis/v1/card/binding"; + //提取人员照片 + String PERSON_PICTURE = "/api/resource/v1/person/picture"; + //根据人员唯一字段获取人员详细信息 + String PERSON_INFO = "/api/resource/v1/person/condition/personInfo"; + //以图搜图 + String SEARCH_PICTURES = "/api/frs/v1/application/captureSearch"; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/enums/SecurityEventType.java b/casic-server/src/main/java/com/casic/missiles/modular/enums/SecurityEventType.java index d51034c..42eacf8 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/enums/SecurityEventType.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/enums/SecurityEventType.java @@ -14,18 +14,27 @@ Number PERSONNEL_GATHER_EVENT = 131593; //监控点离线事件 Number MONITORING_POINT_OFFLINE = 889196545; + //监控点上线事件 + Number MONITORING_POINT_ONLINE = 889196546; //装置离线 Number DEVICE_OFFLINE = 199710; + //装置连线 + Number DEVICE_ONLINE = 199711; //访客登记 Number VISITOR_REGISTER = 1392513025; //访客签离 Number VISITOR_CHECKOUT = 1392513026; + //高空抛物 + Number HIGH_ALTITUDE_PARABOLIC = 930335; + //下面两个查询海康门禁点事件使用 //合法卡比对通过 Number CARD_COMPARE_PASS = 198914; //人脸认证通过 Number FACE_COMPARE_PASS = 196893; + + // //正常开门 // Number NORMAL_OPENING = 198913; // //按钮开门 @@ -46,7 +55,6 @@ // Number FIREWORKS_DETECTION = 192514; // //陌生人识别事件 // Number STRANGER_RECOGNITION = 1644171265; -// //高空抛物 -// Number HIGH_ALTITUDE_PARABOLIC = 930335; + } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/job/CockpitJob.java b/casic-server/src/main/java/com/casic/missiles/modular/job/CockpitJob.java index 7490a27..85dd016 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/job/CockpitJob.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/job/CockpitJob.java @@ -79,14 +79,6 @@ } }); } - } - /** - * 机动力量实时在岗率,在岗人数除以总应在岗人数,功能待定 - */ -// @Scheduled(cron = "0 0/1 * * * ?") - public void BeOnDutyRatio() { - - } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/service/HikCaseDefineService.java b/casic-server/src/main/java/com/casic/missiles/modular/service/HikCaseDefineService.java index d9bb3a9..18e2936 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/service/HikCaseDefineService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/service/HikCaseDefineService.java @@ -9,5 +9,5 @@ * @Date: 2022/7/21 17:20 */ public interface HikCaseDefineService extends IService { - HikCaseDefine getHikCaseDefine(Long caseTypeCode); + HikCaseDefine getHikCaseDefine(Number caseTypeCode); } 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 dd24101..bcc3b5d 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 @@ -18,6 +18,8 @@ CaseInfo monitorPointOfflineHandle(JSONObject event, CaseInfo caseInfo); + void monitorPointOnlineHandle(JSONObject event); + CaseInfo deviceOfflineHandle(JSONObject event, CaseInfo caseInfo); void propertyAttendanceHandle(JSONObject event); @@ -27,4 +29,6 @@ void visitorRegisterHandler(JSONObject event); void visitorCheckOutHandler(JSONObject event); + + void deviceOnlineHandle(JSONObject event); } 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 e55c016..01870bd 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.StaffCardRequest; import com.casic.missiles.modular.model.StaffInfo; import java.util.List; @@ -28,4 +29,6 @@ StaffInfo selectStaffInfoByCode(StaffInfo staffInfo); List staffInfoList(StaffInfoRequest staffInfoRequest); + + int saveCardInfo(StaffCardRequest staffCardRequest); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/service/impl/BlackInfoServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/service/impl/BlackInfoServiceImpl.java index 8f47b37..981b4cd 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/service/impl/BlackInfoServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/service/impl/BlackInfoServiceImpl.java @@ -17,7 +17,6 @@ import com.casic.missiles.modular.model.BlackInfo; import com.casic.missiles.modular.model.HikFaceGroupInfo; import com.casic.missiles.modular.service.BlackInfoService; -import com.casic.missiles.modular.system.service.ICasicFileService; import com.casic.missiles.modular.util.HikUtil; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; @@ -43,9 +42,6 @@ private HikFaceGroupInfoMapper hikFaceGroupInfoMapper; @Resource - private ICasicFileService fileService; - - @Resource private AbstractDictService dictService; @Override @@ -90,9 +86,6 @@ //设置海康人脸唯一标识、人脸分组唯一标识 blackInfo.setIndexCode(String.valueOf(dataJson.get("indexCode"))); blackInfo.setFaceGroupIndexCode(String.valueOf(dataJson.get("faceGroupIndexCode"))); - //保存图片到本地 - String picUrl = fileService.saveFile(blackInfo.getPicture()); - blackInfo.setPicture(picUrl); //插入数据库 if(blackInfoMapper.insert(blackInfo) > 0){ return ResponseData.success(); @@ -141,8 +134,6 @@ log.error("请求海康,单个修改人脸失败,海康response:{}", resultStr); return ResponseData.error("单个修改人脸失败"); } - String picUrl = fileService.saveFile(blackInfo.getPicture()); - blackInfo.setPicture(picUrl); if(blackInfoMapper.updateById(blackInfo) > 0){ return ResponseData.success(); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/service/impl/CockpitServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/service/impl/CockpitServiceImpl.java index 6e6076e..7402991 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/service/impl/CockpitServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/service/impl/CockpitServiceImpl.java @@ -4,15 +4,12 @@ import cn.hutool.core.date.DateUtil; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.core.application.service.AbstractDictService; import com.casic.missiles.modular.dto.hik.DoorEventsRequest; import com.casic.missiles.modular.enums.HikUri; -import com.casic.missiles.modular.enums.SecurityEventDict; import com.casic.missiles.modular.enums.SecurityEventType; import com.casic.missiles.modular.service.CockpitService; import com.casic.missiles.modular.util.HikUtil; import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.*; @@ -25,8 +22,6 @@ @Slf4j @Service public class CockpitServiceImpl implements CockpitService { - @Autowired - private AbstractDictService dictService; @Override public HashMap dataHandle(DoorEventsRequest doorEventsRequest, HashMap> configMap, HashMap jsonMap, HashMap resultMap) { @@ -36,8 +31,8 @@ Date date = new Date(); DateTime startTimeDate = DateUtil.beginOfDay(date); DateTime endTimeDate = DateUtil.endOfDay(date); - String startTime = DateUtil.format(startTimeDate, "yyyy-MM-dd'T'HH:mm:ss'Z'"); - String endTime = DateUtil.format(endTimeDate, "yyyy-MM-dd'T'HH:mm:ss'Z'"); + String startTime = DateUtil.format(startTimeDate, "yyyy-MM-dd'T'HH:mm:ssXXX"); + String endTime = DateUtil.format(endTimeDate, "yyyy-MM-dd'T'HH:mm:ssXXX"); configMap.keySet().stream().forEach(key -> { List doorIndexCodes = configMap.get(key); doorEventsRequest.setPageNo(1); @@ -95,8 +90,9 @@ return; } Integer num = 0; - while (list.stream().iterator().hasNext()) { - JSONObject next = (JSONObject) list.stream().iterator().next(); + Iterator iterator = list.stream().iterator(); + while (iterator.hasNext()) { + JSONObject next = (JSONObject) iterator.next(); Integer inAndOutType = next.getInteger("inAndOutType"); //进门 if (1 == inAndOutType) { @@ -105,8 +101,8 @@ --num; } } - String dictName = dictService.getDictNameByCode(SecurityEventDict.DEVICE_POSITION, String.valueOf(key)); - resultMap.put(dictName, num); +// String dictName = dictService.getDictNameByCode(SecurityEventDict.DEVICE_POSITION, String.valueOf(key)); + resultMap.put(String.valueOf(key), num); }); return resultMap; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/BlackListController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/BlackListController.java index a27f9f8..0c06661 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/BlackListController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/BlackListController.java @@ -1,13 +1,18 @@ package com.casic.missiles.modular.controller; +import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.base.controller.ExportController; import com.casic.missiles.core.page.PageFactory; import com.casic.missiles.model.response.ResponseData; import com.casic.missiles.modular.dto.BlackInfoRequest; +import com.casic.missiles.modular.dto.BlackPictureRequest; +import com.casic.missiles.modular.dto.hik.PersonInfoRequest; +import com.casic.missiles.modular.enums.HikUri; import com.casic.missiles.modular.enums.OperateTypeEnum; import com.casic.missiles.modular.model.BlackInfo; import com.casic.missiles.modular.service.BlackInfoService; +import com.casic.missiles.modular.util.HikUtil; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; @@ -56,4 +61,22 @@ return null; } + /** + * 黑名单人员照片 + */ + @PostMapping("/personPicture") + @ResponseBody + public Object personPicture(@RequestBody BlackPictureRequest blackPictureRequest){ + //获取照片 + String picUri = blackPictureRequest.getPicUri(); + String serverIndexCode = blackPictureRequest.getServerIndexCode(); + PersonInfoRequest picRequest = new PersonInfoRequest(); + picRequest.setPicUri(picUri); + picRequest.setServerIndexCode(serverIndexCode); + String reBody = JSONObject.toJSONString(picRequest); + //重定向地址获取 + String url = HikUtil.hikApiFor302(HikUri.PERSON_PICTURE, reBody); + return ResponseData.success(url); + } + } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/DeviceController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/DeviceController.java index e1c4eba..666bbee 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/DeviceController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/DeviceController.java @@ -107,7 +107,7 @@ } /** - * 设备维修管理查询(分页),需计算MTTR=总维修时间/故障次数 + * 设备状态计算与评判/设备维修管理查询(分页),需计算MTTR=总维修时间/故障次数 */ @PostMapping("/repair/listPage") @ResponseBody @@ -211,7 +211,7 @@ //需根据设备编号获取到对应的门禁点唯一标识 doorControlRequest.setDoorIndexCodes(indexCodes); doorControlRequest.setControlType(Integer.valueOf(gateGroupDTO.getStatus())); - String body = JSONObject.toJSONString(deviceCodes); + String body = JSONObject.toJSONString(doorControlRequest); String resultStr = HikUtil.hikApi(HikUri.DOOR_CONTROL, body); JSONObject resultJson = (JSONObject)JSONObject.parse(resultStr); if (!"0".equals(resultJson.get("code"))) { diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/StaffController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/StaffController.java index b58ccab..704093c 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/StaffController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/StaffController.java @@ -2,15 +2,21 @@ import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.util.StrUtil; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.base.controller.ExportController; import com.casic.missiles.core.page.PageFactory; import com.casic.missiles.model.response.ErrorResponseData; import com.casic.missiles.model.response.ResponseData; import com.casic.missiles.modular.dto.StaffInfoRequest; +import com.casic.missiles.modular.dto.hik.PersonInfoRequest; +import com.casic.missiles.modular.dto.hik.StaffCardRequest; +import com.casic.missiles.modular.enums.HikUri; import com.casic.missiles.modular.enums.OperateTypeEnum; import com.casic.missiles.modular.model.StaffInfo; import com.casic.missiles.modular.service.StaffInfoService; +import com.casic.missiles.modular.util.HikUtil; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; @@ -110,4 +116,60 @@ } return ResponseData.success(); } + + /** + * 批量开卡,添加人员之后调用,若在一个接口中添加人员成功开卡失败则第二次添加时会有问题 + */ + @PostMapping("/cardBinding") + @ResponseBody + public Object cardBinding(@RequestBody StaffCardRequest staffCardRequest) { + String body = JSONObject.toJSONString(staffCardRequest); + String resultStr = HikUtil.hikApi(HikUri.CARD_BINDING, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (!"0".equals(resultJson.get("code"))) { + log.error("请求海康,批量开卡失败,海康response:{}", resultStr); + return ResponseData.error("批量开卡失败"); + } + //保存卡号 + if(staffInfoService.saveCardInfo(staffCardRequest) > 0){ + return ResponseData.success(); + } + return ResponseData.error("批量开卡失败"); + } + + /** + * 获取员工照片,海康存储 + */ + @PostMapping("/personPicture/{staffCode}") + @ResponseBody + public Object personPicture(@PathVariable("staffCode") String staffCode){ + //获取员工详细信息,含图片服务器、uri + PersonInfoRequest request = new PersonInfoRequest(); + List list = new ArrayList<>(); + list.add(staffCode); + request.setParamName("personId"); + request.setParamValue(list); + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi(HikUri.PERSON_INFO, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (!"0".equals(resultJson.get("code"))) { + log.error("请求海康,根据人员唯一字段获取人员详细信息失败,海康response:{}", resultStr); + return ResponseData.error("获取员工照片失败"); + } + //获取照片 + JSONObject data = (JSONObject) resultJson.get("data"); + JSONArray dataArray = (JSONArray) data.get("list"); + JSONObject jsonObject = (JSONObject) dataArray.get(0); + JSONArray personPhoto = (JSONArray) jsonObject.get("personPhoto"); + JSONObject photo = (JSONObject) personPhoto.get(0); + String picUri = photo.getString("picUri"); + String serverIndexCode = photo.getString("serverIndexCode"); + PersonInfoRequest picRequest = new PersonInfoRequest(); + picRequest.setPicUri(picUri); + picRequest.setServerIndexCode(serverIndexCode); + String reBody = JSONObject.toJSONString(picRequest); + //重定向地址获取 + String url = HikUtil.hikApiFor302(HikUri.PERSON_PICTURE, reBody); + return ResponseData.success(url); + } } 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 4a07dd9..7b1dcf6 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 @@ -16,6 +16,7 @@ import com.casic.missiles.modular.redis.key.CacheKeys; import com.casic.missiles.modular.service.CockpitService; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.util.CollectionUtils; import org.springframework.web.bind.annotation.*; @@ -24,10 +25,7 @@ import java.text.NumberFormat; import java.time.LocalDateTime; import java.time.temporal.ChronoUnit; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.util.*; import java.util.stream.Collectors; /** @@ -73,6 +71,9 @@ private StatisticNumberMapper numberMapper; @Autowired + private HazardLevelMapper hazardLevelMapper; + + @Autowired private AccessGroupConfig accessGroupConfig; /** @@ -104,8 +105,24 @@ public Object buildingNumberPerHour(){ //当天按小时分组的人数 List list = numberMapper.selectListByTime(); - Map> collect = list.stream().collect(Collectors.groupingBy(BuildingNumberDTO::getStatisticPosition)); - return ResponseData.success(collect); + Map> collect = list.stream().collect(Collectors.groupingBy(BuildingNumberDTO::getStatisticTime)); + //定时任务中已将每小时三栋楼人数存到数据库 + //将一期主楼和录制楼人数合并,二期单算 + List> resultList = new ArrayList<>(); + collect.keySet().forEach(key -> { + List buildingNumberDTOS = collect.get(key); + BuildingNumberDTO mainBuildingOne = buildingNumberDTOS.get(0); + BuildingNumberDTO mainBuildingTwo = buildingNumberDTOS.get(1); + BuildingNumberDTO recordingBuilding = buildingNumberDTOS.get(2); + HashMap resultMap = new HashMap<>(); + Integer oneQuantity = Integer.valueOf(mainBuildingOne.getStatisticQuantity()); + Integer recordingQuantity = Integer.valueOf(recordingBuilding.getStatisticQuantity()); + resultMap.put("staticTime", mainBuildingOne.getStatisticTime()); + resultMap.put(mainBuildingOne.getStatisticPositionName()+"、"+recordingBuilding.getStatisticPositionName(), String.valueOf(oneQuantity+recordingQuantity)); + resultMap.put(mainBuildingTwo.getStatisticPositionName(), mainBuildingTwo.getStatisticQuantity()); + resultList.add(resultMap); + }); + return ResponseData.success(resultList); } /** @@ -151,12 +168,11 @@ public Object securityNumber() { QueryWrapper wrapper = new QueryWrapper<>(); wrapper.eq("staff_type", 2); + // TODO: 2022/9/2 后续使用产品确定的每天出勤的安保人员的数量 Integer total = staffInfoMapper.selectCount(wrapper); - //当日离岗事件个数 - QueryWrapper wrapper1 = new QueryWrapper<>(); - wrapper1.eq("hik_event_type", SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); - wrapper1.apply("date_format(now(),'%Y-%m-%d') = date_format(happen_time,'%Y-%m-%d')"); - Integer leave = caseInfoMapper.selectCount(wrapper1); + //当日离岗事件按设备去重后的个数 + // TODO: 2022/9/2 目前相当于24小时内的计算,之后看需要可改成自定义小时数计算离岗率,即离岗+6小时内仅一次离岗则恢复为100%,多次则累加离岗次数计算离岗率 + Integer leave = caseInfoMapper.selectDemobilizedCount(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); NumberFormat numberFormat = NumberFormat.getInstance(); // 设置精确到小数点后2位 numberFormat.setMaximumFractionDigits(2); @@ -179,7 +195,6 @@ @ResponseBody public Object visitorApplyDetail() { List reasonGroup = applyMapper.selectByVisitReason(); - HashMap resultMap = new HashMap<>(); NumberFormat numberFormat = NumberFormat.getInstance(); // 设置精确到小数点后2位 numberFormat.setMaximumFractionDigits(2); @@ -187,12 +202,17 @@ if(0 == sum){ return ResponseData.success(); } + List resultList = new ArrayList<>(); reasonGroup.forEach(group -> { String reasonName = dictService.getDictNameByCode(SecurityEventDict.VISIT_REASON, group.getVisitReason()); String result = numberFormat.format((float) group.getQuantity() / (float) sum * 100); - resultMap.put(reasonName, result+"%"); + ApplyReasonGroupDTO applyReasonGroupDTO = new ApplyReasonGroupDTO(); + applyReasonGroupDTO.setQuantity(group.getQuantity()); + applyReasonGroupDTO.setVisitReason(reasonName); + applyReasonGroupDTO.setRatio(result+"%"); + resultList.add(applyReasonGroupDTO); }); - return ResponseData.success(resultMap); + return ResponseData.success(resultList); } /** @@ -247,6 +267,32 @@ } /** + * 机动力量实时在岗率,在岗人数除以总应在岗人数,用离岗+6小时内恢复为100%,6小时外再计算 + */ + @GetMapping("/staff/beOnDutyRatio") + @ResponseBody + public Object beOnDutyRatio() { + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("staff_type", 2); + // TODO: 2022/9/2 后续使用产品确定的每天出勤的安保人员的数量 + Integer total = staffInfoMapper.selectCount(wrapper); + if(0 == total){ + return ResponseData.success(null); + } + //当日离岗事件按设备去重后的个数 + // TODO: 2022/9/2 目前相当于24小时内的计算,之后看需要可改成自定义小时数计算离岗率,即离岗+6小时内仅一次离岗则恢复为100%,多次则累加离岗次数计算离岗率 + List onDutyRatioDTOS = caseInfoMapper.selectDemobilizedCountByHour(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); + onDutyRatioDTOS.forEach(dto -> { + NumberFormat numberFormat = NumberFormat.getInstance(); + // 设置精确到小数点后2位 + numberFormat.setMaximumFractionDigits(2); + String result = numberFormat.format(100 - Float.valueOf(dto.getQuantity()) / (float) total * 100); + dto.setRatio(result+"%"); + }); + return ResponseData.success(onDutyRatioDTOS); + } + + /** * 闸机速通门统计-设备状态分组计算数量,devType传闸机字典key * 视频频监控摄像机统计-设备状态分组计算数量,devType传摄像头字典key */ @@ -262,12 +308,17 @@ if(sum <= 0){ return ResponseData.error("无该类设备信息"); } + List resultList = new ArrayList<>(); gateStatusGroup.forEach(group -> { String devStatus = dictService.getDictNameByCode(SecurityEventDict.DEVICE_STATUS, group.getStatus()); String result = numberFormat.format((float) group.getQuantity() / (float) sum * 100); - resultMap.put(devStatus, result+"%"); + GateStatusGroupResponse gateStatusGroupResponse = new GateStatusGroupResponse(); + gateStatusGroupResponse.setStatus(devStatus); + gateStatusGroupResponse.setRatio(result+"%"); + resultList.add(gateStatusGroupResponse); }); - resultMap.put("总", sum); + resultMap.put("total", sum); + resultMap.put("list", resultList); return ResponseData.success(resultMap); } @@ -282,17 +333,38 @@ String position = securityScoreDTO.getPosition(); List caseInfos = caseInfoMapper.selectByPosition(position); //查询各危险级别权重、各类别权重,放入map,避免循环中多次查数据库 - + HashMap hazardScoreMap = new HashMap<>(); + List caseHazardLevelList = hazardLevelMapper.getCaseHazardLevelList(null); + caseHazardLevelList.forEach(hazardLevel -> { + hazardScoreMap.put(hazardLevel.getCode(), hazardLevel.getWeight()); + }); + HashMap categoryScoreMap = new HashMap<>(); + List categoryLevelList = categoryLevelMapper.getCaseCategoryLevelList(null); + categoryLevelList.forEach(categoryLevel -> { + categoryScoreMap.put(categoryLevel.getCode(), categoryLevel.getWeight()); + }); + //事件按楼层分组,计算 List securityScoreDTOs = new ArrayList<>(); caseInfos.forEach(caseInfo -> { SecurityScoreDTO securityScoreDTO1 = new SecurityScoreDTO(); + securityScoreDTO1.setPosition(caseInfo.getPosition()); securityScoreDTO1.setArea(caseInfo.getArea()); - // TODO: 2022/8/4 楼层评分计算根据产品定义调整 -// caseInfo.get -// securityScoreDTO1.setScore(); + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); + Double score = 100 - Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + securityScoreDTO1.setScore(score); + securityScoreDTOs.add(securityScoreDTO1); }); - - return null; + 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); + }); + return ResponseData.success(securityScoreDTOs); } /** @@ -303,9 +375,13 @@ public Object SecurityFrequency(@RequestBody SecurityFrequencyDTO securityFrequencyDTO) { String year = securityFrequencyDTO.getYear(); String month = securityFrequencyDTO.getMonth(); - Integer quantity = caseInfoMapper.selectCountByMonth(year, month); - securityFrequencyDTO.setQuantity(quantity); - return ResponseData.success(securityFrequencyDTO); + if(!StringUtils.isEmpty(year) && StringUtils.isEmpty(month)){ + Integer quantity = caseInfoMapper.selectCountByMonth(year, month); + securityFrequencyDTO.setQuantity(quantity); + return ResponseData.success(securityFrequencyDTO); + } + List list = caseInfoMapper.selectPreMonthCount(); + return ResponseData.success(list); } } 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 ae4d770..f4f075c 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 @@ -1,20 +1,25 @@ package com.casic.missiles.modular.controller.cockpit; +import cn.hutool.core.date.DateUnit; import cn.hutool.core.date.DateUtil; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.casic.missiles.model.response.ResponseData; -import com.casic.missiles.modular.dao.AttendanceInfoMapper; -import com.casic.missiles.modular.dao.CaseInfoMapper; -import com.casic.missiles.modular.dao.HazardLevelMapper; -import com.casic.missiles.modular.dao.StaffInfoMapper; +import com.casic.missiles.modular.dao.*; +import com.casic.missiles.modular.dto.DeviceRepairLogDTO; +import com.casic.missiles.modular.dto.DeviceRepairRequest; import com.casic.missiles.modular.dto.statistics.*; +import com.casic.missiles.modular.enums.SecurityEventType; +import com.casic.missiles.modular.model.CaseCategoryLevel; import com.casic.missiles.modular.model.CaseHazardLevel; +import com.casic.missiles.modular.model.CaseInfo; import com.casic.missiles.modular.model.StaffInfo; +import com.casic.missiles.modular.service.DeviceInfoService; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.util.CollectionUtils; import org.springframework.web.bind.annotation.*; +import java.math.BigDecimal; import java.text.NumberFormat; import java.util.*; import java.util.stream.Collectors; @@ -40,6 +45,12 @@ @Autowired private HazardLevelMapper hazardLevelMapper; + @Autowired + private CategoryLevelMapper categoryLevelMapper; + + @Autowired + private DeviceInfoService deviceInfoService; + /** * 安防事件时域频次统计,每月的每天安防事件个数(原方案) * 月维度:展示每个月的每天的数据 @@ -89,15 +100,17 @@ List monthList = caseInfoMapper.selectPreMonthCountByYear(year); Map> collect = monthList.stream().collect(Collectors.groupingBy(PreMonthOrWeekCaseDTO::getHazardLevelCode)); HashMap strAvgMap = new HashMap<>(); + List resultList = new ArrayList<>(); for (String key : collect.keySet()) { List preMonthOrWeekCaseDTOS = collect.get(key); int sum = preMonthOrWeekCaseDTOS.stream().mapToInt(PreMonthOrWeekCaseDTO::getQuantity).sum(); //若年份是本年,则使用个安防级别数量/当前月份数 //若不是本年,除数为12 MonthAndWeekDTO monthAndWeekDTO = new MonthAndWeekDTO(); + String hazardName = hazardLevelMapper.selectHazardNameByCode(key); + monthAndWeekDTO.setLevelName(hazardName); if(year.equals(String.valueOf(DateUtil.thisYear()))){ monthAndWeekDTO.setMonthQuantity(sum / DateUtil.thisMonth()); -// monthAndWeekDTO.setLevelName(); strAvgMap.put(key, monthAndWeekDTO); }else{ monthAndWeekDTO.setMonthQuantity(sum / 12); @@ -113,27 +126,37 @@ if(year.equals(String.valueOf(DateUtil.thisYear()))){ if(!Objects.isNull(strAvgMap.get(key))){ MonthAndWeekDTO monthAndWeekDTO = strAvgMap.get(key); + String hazardName = hazardLevelMapper.selectHazardNameByCode(key); + monthAndWeekDTO.setLevelName(hazardName); monthAndWeekDTO.setWeekQuantity(sum / DateUtil.thisWeekOfYear()); strAvgMap.put(key, monthAndWeekDTO); }else{ MonthAndWeekDTO monthAndWeekDTO = new MonthAndWeekDTO(); + String hazardName = hazardLevelMapper.selectHazardNameByCode(key); + monthAndWeekDTO.setLevelName(hazardName); monthAndWeekDTO.setWeekQuantity(sum / DateUtil.thisWeekOfYear()); strAvgMap.put(key, monthAndWeekDTO); } }else{ if(!Objects.isNull(strAvgMap.get(key))){ MonthAndWeekDTO monthAndWeekDTO = strAvgMap.get(key); + String hazardName = hazardLevelMapper.selectHazardNameByCode(key); + monthAndWeekDTO.setLevelName(hazardName); monthAndWeekDTO.setWeekQuantity(sum / 52); strAvgMap.put(key, monthAndWeekDTO); }else{ MonthAndWeekDTO monthAndWeekDTO = new MonthAndWeekDTO(); + String hazardName = hazardLevelMapper.selectHazardNameByCode(key); + monthAndWeekDTO.setLevelName(hazardName); monthAndWeekDTO.setWeekQuantity(sum / 52); strAvgMap.put(key, monthAndWeekDTO); } } } - avgMonthAndWeekGroupDTO.setMap(strAvgMap); - return ResponseData.success(avgMonthAndWeekGroupDTO); + strAvgMap.keySet().forEach(key -> { + resultList.add(strAvgMap.get(key)); + }); + return ResponseData.success(resultList); } /** @@ -181,12 +204,178 @@ } /** - * 员工考勤人数变化,功能待定 + * 员工考勤人数变化,统计当天(横坐标为时)及近7天(横坐标为天)的考勤人数变化,只要发生一次考勤识别,次数的基数就正常增加(没有上班下班区分) */ + @PostMapping("/staff/attendanceNumber/{dimension}") + @ResponseBody + public Object attendanceNumber(@PathVariable("dimension") String dimension) { + List attendanceNumberDTOs = null; + List> resultList = new ArrayList<>(); + if("week".equals(dimension)){ + //近7天数据按天分组统计 + attendanceNumberDTOs = attendanceInfoMapper.getCountForWeek(); + }else if("day".equals(dimension)) { + //今天数据按小时分组统计 + attendanceNumberDTOs = attendanceInfoMapper.getCountForDay(); + } + if(CollectionUtils.isEmpty(attendanceNumberDTOs)){ + return ResponseData.error("该查询条件下,无员工出勤数据!"); + } + Map> collect = attendanceNumberDTOs.stream().collect(Collectors.groupingBy(AttendanceNumberDTO::getDate)); + collect.keySet().forEach(key -> { + List attendanceNumberDTOS = collect.get(key); + AttendanceNumberDTO attendanceNumberDTO = attendanceNumberDTOS.get(0); + AttendanceNumberDTO attendanceNumberDTO2 = attendanceNumberDTOS.get(1); + Map resultMap = new HashMap<>(); + resultMap.put(attendanceNumberDTO.getStaffType(), attendanceNumberDTO.getQuantity()); + resultMap.put(attendanceNumberDTO2.getStaffType(), attendanceNumberDTO2.getQuantity()); + resultMap.put("staticTime", attendanceNumberDTO.getDate()); + resultList.add(resultMap); + }); + return ResponseData.success(resultList); + } /** - * 近30天/近一周安保人员到岗排行 + * 早晚高峰区域安防评估 */ + @PostMapping("/security/assessment/{dimension}") + @ResponseBody + public Object securityAssessment(@PathVariable("dimension") String dimension) { + //查询各危险级别权重、各类别权重,放入map,避免循环中多次查数据库 + HashMap hazardScoreMap = new HashMap<>(); + List caseHazardLevelList = hazardLevelMapper.getCaseHazardLevelList(null); + caseHazardLevelList.forEach(hazardLevel -> { + hazardScoreMap.put(hazardLevel.getCode(), hazardLevel.getWeight()); + }); + HashMap categoryScoreMap = new HashMap<>(); + List categoryLevelList = categoryLevelMapper.getCaseCategoryLevelList(null); + categoryLevelList.forEach(categoryLevel -> { + categoryScoreMap.put(categoryLevel.getCode(), categoryLevel.getWeight()); + }); + HashMap hashMap = new HashMap<>(); + if("week".equals(dimension)){ + //近7天早晚高峰数据 + List caseInfos = caseInfoMapper.selectListBySevenDay(); + //按时间(天)进行分组 + caseInfos.forEach(caseInfo -> { + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); + Double score = Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + String[] array = caseInfo.getHappenTime().split(" "); + String dayTime = array[0]; + BigDecimal preScore; + if(hashMap.containsKey(dayTime)){ + Double aDouble = hashMap.get(dayTime); + preScore = new BigDecimal(aDouble.toString()); + + }else{ + preScore = new BigDecimal("100.0"); + } + BigDecimal nowScore = new BigDecimal(score.toString()); + hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); + }); + return ResponseData.success(hashMap); + }else if("day".equals(dimension)) { + //今天数据按小时分组统计 + List caseInfos = caseInfoMapper.selectListByToday(); + caseInfos.forEach(caseInfo -> { + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); + Double score = Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + String[] array = caseInfo.getHappenTime().split(":"); + String dayTime = array[0]; + BigDecimal preScore; + if(hashMap.containsKey(dayTime)){ + Double aDouble = hashMap.get(dayTime); + preScore = new BigDecimal(aDouble.toString()); + + }else{ + preScore = new BigDecimal("100.0"); + } + BigDecimal nowScore = new BigDecimal(score.toString()); + hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); + }); + return ResponseData.success(hashMap); + } + return null; + } + + /** + * 重点区域安防事态评估,统计重点区域6:00-23:00按小时分组数据 + */ + @GetMapping("/security/keyAreaStatistic") + @ResponseBody + public Object keyAreaStatistic() { + //查询各危险级别权重、各类别权重,放入map,避免循环中多次查数据库 + HashMap hazardScoreMap = new HashMap<>(); + List caseHazardLevelList = hazardLevelMapper.getCaseHazardLevelList(null); + caseHazardLevelList.forEach(hazardLevel -> { + hazardScoreMap.put(hazardLevel.getCode(), hazardLevel.getWeight()); + }); + HashMap categoryScoreMap = new HashMap<>(); + List categoryLevelList = categoryLevelMapper.getCaseCategoryLevelList(null); + categoryLevelList.forEach(categoryLevel -> { + categoryScoreMap.put(categoryLevel.getCode(), categoryLevel.getWeight()); + }); + HashMap hashMap = new HashMap<>(); + //今天数据按小时分组统计 + List caseInfos = caseInfoMapper.selectListByToday2(); + caseInfos.forEach(caseInfo -> { + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); + Double score = Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + String[] array = caseInfo.getHappenTime().split(":"); + String dayTime = array[0]; + BigDecimal preScore; + if(hashMap.containsKey(dayTime)){ + Double aDouble = hashMap.get(dayTime); + preScore = new BigDecimal(aDouble.toString()); + + }else{ + preScore = new BigDecimal("100.0"); + } + BigDecimal nowScore = new BigDecimal(score.toString()); + hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); + }); + return ResponseData.success(hashMap); + } + + /** + * 安防机动支援力量调配响应评估,根据事件已解决状态及已解决时间-发送时间,按时间(小时)分组统计 + */ + @GetMapping("/security/responseAssess") + @ResponseBody + public Object responseAssess() { + //查询各危险级别权重、各类别权重,放入map,避免循环中多次查数据库 + HashMap hazardScoreMap = new HashMap<>(); + List caseHazardLevelList = hazardLevelMapper.getCaseHazardLevelList(null); + caseHazardLevelList.forEach(hazardLevel -> { + hazardScoreMap.put(hazardLevel.getCode(), hazardLevel.getWeight()); + }); + HashMap hashMap = new HashMap<>(); + //今天数据按小时分组统计 + List caseInfos = caseInfoMapper.selectListByToday3(); + caseInfos.forEach(caseInfo -> { + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + //扣分=事件级别权重*未解决小时数 + Date updateTime = DateUtil.parse(caseInfo.getUpdateTime()); + Date happenTime = DateUtil.parse(caseInfo.getHappenTime()); + long between = DateUtil.between(updateTime, happenTime, DateUnit.HOUR); + Double score = Double.valueOf(hazardWeight)*between; + String[] array = caseInfo.getHappenTime().split(":"); + String dayTime = array[0]; + BigDecimal preScore; + if(hashMap.containsKey(dayTime)){ + Double aDouble = hashMap.get(dayTime); + preScore = new BigDecimal(aDouble.toString()); + }else{ + preScore = new BigDecimal("100.0"); + } + BigDecimal nowScore = new BigDecimal(score.toString()); + hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); + }); + return ResponseData.success(hashMap); + } /** * 重点区域威胁事件类型统计,优先级2,统计近7天和近30天 @@ -224,7 +413,34 @@ } /** - * 设备状态计算系数和评判,优先级3,需确认设备恢复时间是否可以获取 + * 近30天/近一周安保人员到岗排行 */ + + /** + * 安保等级评估,发生离岗事件减1分 + */ + @GetMapping("/security/levelAssess") + @ResponseBody + public Object securityLevelAssess() { + //今天数据按小时分组统计 + List resultList = caseInfoMapper.selectListByType(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); + resultList.forEach(result -> { + BigDecimal deScore = new BigDecimal(result.getQuantity()); + BigDecimal preScore = new BigDecimal("100.0"); + result.setScore(preScore.subtract(deScore).doubleValue()); + }); + return ResponseData.success(resultList); + } + + /** + * 设备状态计算系数和评判,即设备维修管理查询(不分页) + */ + @PostMapping("/device/repairList") + @ResponseBody + public Object repairList(@RequestBody DeviceRepairRequest deviceRepairRequest) { + List deviceRepairLogDTOS = deviceInfoService.deviceRepairListPage(deviceRepairRequest); + return ResponseData.success(deviceRepairLogDTOS); + } + } 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 fbf8ab6..c71a15a 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 @@ -1,13 +1,12 @@ package com.casic.missiles.modular.controller.hik; +import cn.hutool.core.date.DateTime; +import cn.hutool.core.date.DateUtil; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.casic.missiles.model.response.ResponseData; import com.casic.missiles.modular.dao.HikFaceGroupInfoMapper; -import com.casic.missiles.modular.dto.hik.EventSubscribeRequest; -import com.casic.missiles.modular.dto.hik.FaceGroupAdditionRequest; -import com.casic.missiles.modular.dto.hik.HikRecvEvent; -import com.casic.missiles.modular.dto.hik.OrgBatchAdd; +import com.casic.missiles.modular.dto.hik.*; import com.casic.missiles.modular.enums.HikUri; import com.casic.missiles.modular.enums.SecurityEventType; import com.casic.missiles.modular.model.CaseInfo; @@ -18,16 +17,20 @@ import com.casic.missiles.modular.util.CaseInfoFactoryUtil; import com.casic.missiles.modular.util.HikUtil; import com.casic.missiles.modular.util.ThreadPoolUtil; +import com.casic.missiles.modular.util.WebSocket; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; -import org.springframework.web.bind.annotation.*; +import org.springframework.util.CollectionUtils; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.RestController; -import java.net.InetAddress; -import java.net.UnknownHostException; import java.util.ArrayList; +import java.util.Iterator; import java.util.List; import java.util.Objects; @@ -38,7 +41,6 @@ */ @Slf4j @RestController -@RequestMapping("/hik") public class HikController { @Autowired @@ -53,28 +55,37 @@ @Autowired private HikService hikService; + @Autowired + private HikFaceGroupInfoMapper hikFaceGroupInfoMapper; + + @Autowired + private WebSocket webSocket; + @Value("${server.port}") private int serverPort; - @Autowired - private HikFaceGroupInfoMapper hikFaceGroupInfoMapper; /** * 海康事件订阅 */ - @PostMapping("/event/subscribe") + @PostMapping("/hik/event/subscribe") @ResponseBody - public Object eventSubscribe() throws UnknownHostException { + public Object eventSubscribe() { EventSubscribeRequest eventSubscribeRequest = new EventSubscribeRequest(); ArrayList list = new ArrayList<>(); list.add(SecurityEventType.DEVICE_OFFLINE); + list.add(SecurityEventType.DEVICE_ONLINE); list.add(SecurityEventType.KEY_PERSONNEL_IDENTIFY_EVENT); list.add(SecurityEventType.MONITORING_POINT_OFFLINE); + list.add(SecurityEventType.MONITORING_POINT_ONLINE); list.add(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); list.add(SecurityEventType.PERSONNEL_GATHER_EVENT); - InetAddress localHost = InetAddress.getLocalHost(); + list.add(SecurityEventType.VISITOR_REGISTER); + list.add(SecurityEventType.VISITOR_CHECKOUT); + list.add(SecurityEventType.HIGH_ALTITUDE_PARABOLIC); +// InetAddress localHost = InetAddress.getLocalHost(); eventSubscribeRequest.setEventTypes(list); - eventSubscribeRequest.setEventDest("https://" + localHost + ":" + serverPort + "/eventRcv"); + eventSubscribeRequest.setEventDest("http://" + "192.168.10.6" + ":" + serverPort + "/eventRcv"); //订阅类型,0-订阅原始事件,1-联动事件,2-原始事件和联动事件,不填使用默认值0 eventSubscribeRequest.setSubType(0); /** @@ -92,19 +103,25 @@ } /** + * 查询事件订阅信息 + */ + @PostMapping("/hik/event/query") + @ResponseBody + public Object eventQuery() { + String result = HikUtil.hikApi(HikUri.EVENT_INFO, ""); + return result; + } + + /** * 海康事件接收 */ @PostMapping("/eventRcv") @ResponseBody public Object eventRcv(@RequestBody HikRecvEvent hikRecvEvent) { //1、接收所需事件类型 - Long eventType = hikRecvEvent.getEventType(); + Number eventType = hikRecvEvent.getEventType(); log.info("接收到安防事件类型为:{}", eventType); CaseInfo caseInfo = caseInfoFactoryUtil.getCaseInfo(eventType); - //接收到不关心事件直接返回 - if(Objects.isNull(caseInfo)){ - return ResponseData.success(); - } //2、不同事件不同处理,caseInfoFactoryUtil已设置好事件基础定义信息 // 再为事件添加状态、设备编码、设备名称、位置、区域、时间 // 异步处理事件 @@ -114,19 +131,23 @@ caseHandle(hikRecvEvent, eventType, caseInfo); } })); +// caseHandle(hikRecvEvent, eventType, caseInfo); - return null; + return ResponseData.success(); } - private void caseHandle(HikRecvEvent hikRecvEvent, Long eventType, CaseInfo caseInfo) { + private void caseHandle(HikRecvEvent hikRecvEvent, Number eventType, CaseInfo caseInfo) { JSONArray eventArray = hikRecvEvent.getEventArray(); List caseInfos = new ArrayList<>(); - while (eventArray.stream().iterator().hasNext()) { + Iterator iterator = eventArray.iterator(); + while (iterator.hasNext()) { CaseInfo caseInfo1 = new CaseInfo(); - BeanUtils.copyProperties(caseInfo, caseInfo1); - JSONObject event = (JSONObject) eventArray.stream().iterator().next(); + if(!Objects.isNull(caseInfo)){ + BeanUtils.copyProperties(caseInfo, caseInfo1); + } + JSONObject event = (JSONObject) iterator.next(); //5种事件进行不同处理 - if(SecurityEventType.KEY_PERSONNEL_IDENTIFY_EVENT == eventType){ + if (SecurityEventType.KEY_PERSONNEL_IDENTIFY_EVENT.equals(eventType)) { //判断所属人脸分组 JSONObject data = (JSONObject) event.get("data"); JSONObject faceRecognitionResult = (JSONObject) data.get("faceRecognitionResult"); @@ -142,52 +163,101 @@ if (faceGroupCode.equals(blackListGroup.getFaceGroupCode())) { //黑名单分组处理 caseInfo1 = hikService.blackListHandle(event, caseInfo1); - }else if(faceGroupCode.equals(propertyPersonnelGroup.getFaceGroupCode())){ + } else if (faceGroupCode.equals(propertyPersonnelGroup.getFaceGroupCode())) { //考勤分组处理-物业人员,添加到考勤表 hikService.propertyAttendanceHandle(event); - }else if(faceGroupCode.equals(securityPersonnelGroup.getFaceGroupCode())){ + } else if (faceGroupCode.equals(securityPersonnelGroup.getFaceGroupCode())) { //考勤分组处理-安保人员,添加到考勤表 hikService.securityPersonnelHandle(event); - }else { + } else { return; } - }else if(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT == eventType){ + } else if (SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT.equals(eventType)) { //离岗事件处理 caseInfo1 = hikService.demobilizedHandle(event, caseInfo1); - }else if(SecurityEventType.PERSONNEL_GATHER_EVENT == eventType){ + } else if (SecurityEventType.PERSONNEL_GATHER_EVENT.equals(eventType)) { //人员聚集事件处理 caseInfo1 = hikService.personGatherHandle(event, caseInfo1); - }else if(SecurityEventType.MONITORING_POINT_OFFLINE == eventType){ + } else if (SecurityEventType.MONITORING_POINT_OFFLINE.equals(eventType)) { //监控点离线事件处理 caseInfo1 = hikService.monitorPointOfflineHandle(event, caseInfo1); - }else if(SecurityEventType.DEVICE_OFFLINE == eventType){ + } else if (SecurityEventType.MONITORING_POINT_ONLINE.equals(eventType)) { + //监控点上线事件处理 + hikService.monitorPointOnlineHandle(event); + } else if (SecurityEventType.DEVICE_OFFLINE.equals(eventType)) { //装置离线事件处理 caseInfo1 = hikService.deviceOfflineHandle(event, caseInfo1); - }else if(SecurityEventType.VISITOR_REGISTER == eventType){ + } else if (SecurityEventType.DEVICE_ONLINE.equals(eventType)) { + //装置上线处理 + hikService.deviceOnlineHandle(event); + } else if (SecurityEventType.VISITOR_REGISTER.equals(eventType)) { //记录访客登记记录,添加到访客记录表 hikService.visitorRegisterHandler(event); - }else if(SecurityEventType.VISITOR_CHECKOUT == eventType){ + } else if (SecurityEventType.VISITOR_CHECKOUT.equals(eventType)) { //记录访客签离记录 hikService.visitorCheckOutHandler(event); } - if(!Objects.isNull(caseInfo1) && !StringUtils.isEmpty(caseInfo1.getHappenTime())){ + if (!Objects.isNull(caseInfo1) && !StringUtils.isEmpty(caseInfo1.getHappenTime())) { caseInfos.add(caseInfo1); } } //3、安防事件入库 - if(!caseInfoService.insertCaseInfoBatch(caseInfos)){ - log.error("安防事件批量入库异常"); + if (!CollectionUtils.isEmpty(caseInfos) && !caseInfoService.insertCaseInfoBatch(caseInfos)) { + log.error("安防事件批量入库异常!"); } // TODO: 2022/8/15 webSocket推送 + if (CollectionUtils.isEmpty(caseInfos)) { + log.info("webSocket事件推送"); + webSocket.sendAllMessage(JSONObject.toJSONString(caseInfos)); + } return; } /** + * 以图搜图,前端用于轨迹追踪 + */ + @PostMapping("/hik/search/picture") + @ResponseBody + public Object searchPictures(@RequestBody SearchPicturesRequest searchPicturesRequest) { + DateTime startDateTime = DateUtil.parse(searchPicturesRequest.getStartTime()); + DateTime endDateTime = DateUtil.parse(searchPicturesRequest.getEndTime()); + String startTime = DateUtil.format(startDateTime, "yyyy-MM-dd'T'HH:mm:ss.SSSXXX"); + String endTime = DateUtil.format(endDateTime, "yyyy-MM-dd'T'HH:mm:ss.SSSXXX"); + searchPicturesRequest.setStartTime(startTime); + searchPicturesRequest.setEndTime(endTime); + String body = JSONObject.toJSONString(searchPicturesRequest); + String resultStr = HikUtil.hikApi(HikUri.SEARCH_PICTURES, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (!"0".equals(resultJson.get("code"))) { + log.error("请求海康,以图搜图失败,海康response:{}", resultStr); + return ResponseData.error("以图搜图失败"); + } + return ResponseData.success(resultJson); + } + + + /** + * 海康事件取消订阅 + */ + @PostMapping("/hik/event/cancel") + @ResponseBody + public Object eventCancelSubscribe(@RequestBody CancelSubscribeRequest cancelSubscribeRequest) { + String body = JSONObject.toJSONString(cancelSubscribeRequest); + String resultStr = HikUtil.hikApi(HikUri.EVENT_CANCEL, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (!"0".equals(resultJson.get("code"))) { + log.error("请求海康,取消订阅失败,海康response:{}", resultStr); + return ResponseData.error("取消订阅失败"); + } + return ResponseData.success(resultJson); + } + + /** * 单个添加海康人脸分组 * api->hik单个添加人脸分组api->response->mysql */ - @PostMapping("/faceGroup/single/add") + @PostMapping("/hik/faceGroup/single/add") @ResponseBody public Object faceGroupAddition(@RequestBody FaceGroupAdditionRequest faceGroupAdditionRequest) { String body = JSONObject.toJSONString(faceGroupAdditionRequest); @@ -212,7 +282,7 @@ * 批量添加海康组织 * api->hik批量添加组织api->response */ - @PostMapping("/org/batch/add") + @PostMapping("/hik/org/batch/add") @ResponseBody public Object orgBatchAdd(@RequestBody List orgBatchAddRequest) { String body = JSONObject.toJSONString(orgBatchAddRequest); @@ -232,4 +302,62 @@ return ResponseData.error("批量添加组织失败"); } + /** + * 获取人员列表 + */ + @PostMapping("/hik/person/personList") + @ResponseBody + public Object personList() { + PersonListRequest request = new PersonListRequest(); + request.setPageNo(1); + request.setPageSize(100); + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi("/api/resource/v2/person/personList", body); + return resultStr; + } + + /** + * 获取组织列表 + */ + @PostMapping("/hik/org/orgList") + @ResponseBody + public Object orgList() { + PersonListRequest request = new PersonListRequest(); + request.setPageNo(1); + request.setPageSize(100); + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi("/api/resource/v1/org/orgList", body); + return resultStr; + } + + /** + * 查询访客权限下载记录 + */ + @PostMapping("/hik/auth/result") + @ResponseBody + public Object authResult() { + PersonListRequest request = new PersonListRequest(); + request.setPageNo(1); + request.setPageSize(100); + request.setOrderId("ba101db6246711edaea66f7939a13638"); + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi("/api/visitor/v1/auth/result", body); + return resultStr; + } + + /** + * 人脸图片获取 + */ + @PostMapping("/hik/face/picture") + @ResponseBody + public Object facePicture() { + FaceRequest request = new FaceRequest(); +// List list = new ArrayList<>(); +// list.add(""); + request.setCertificateNum("wanggong"); + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi("/api/frs/v1/face", body); + return resultStr; + } + } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/AssetInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/AssetInfoMapper.java index 4f64e83..c0684ee 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/AssetInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/AssetInfoMapper.java @@ -17,6 +17,6 @@ @Mapper public interface AssetInfoMapper extends BaseMapper { - List getAssetInfoListPage(@Param("page") Page page, AssetInfoRequest assetInfoRequest); + List getAssetInfoListPage(@Param("page") Page page, @Param("assetInfoRequest") AssetInfoRequest assetInfoRequest); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/AttendanceInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/AttendanceInfoMapper.java index f9e793e..ec87e46 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/AttendanceInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/AttendanceInfoMapper.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.statistics.AttendanceNumberDTO; import com.casic.missiles.modular.dto.statistics.AttendanceRatioDTO; import com.casic.missiles.modular.model.AttendanceInfo; import org.apache.ibatis.annotations.Mapper; @@ -17,7 +18,7 @@ */ @Mapper public interface AttendanceInfoMapper extends BaseMapper { - List getAttendanceInfoListPage(@Param("page") Page page, StaffInfoRequest attendanceInfoRequest); + List getAttendanceInfoListPage(@Param("page") Page page, @Param("attendanceInfoRequest") StaffInfoRequest attendanceInfoRequest); AttendanceInfo selectByCodeAndDate(@Param("staffCode") String staffCode); @@ -26,4 +27,8 @@ List getCountByTypeAndDateForMonth(@Param("staffType")String staffType); List getCountByTypeAndDateForYear(@Param("staffType")String staffType); + + List getCountForWeek(); + + List getCountForDay(); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java index ce94b8f..6137a7d 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java @@ -17,5 +17,5 @@ @Mapper public interface BlackInfoMapper extends BaseMapper { - List getBlackInfoListPage(@Param("page") Page page, BlackInfoRequest blackInfoRequest); + List getBlackInfoListPage(@Param("page") Page page, @Param("blackInfoRequest") BlackInfoRequest blackInfoRequest); } 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 efda6b3..50aaa6f 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 @@ -20,7 +20,7 @@ List getCaseInfoListPage(@Param("page") Page page, @Param("caseInfoRequest") CaseInfoRequest caseInfoRequest); - int updateStatusById(CaseInfoRequest caseInfoRequest); + int updateStatusById(@Param("caseInfoRequest") CaseInfoRequest caseInfoRequest); List selectByLevelAndMonth(@Param("year") String year); @@ -47,4 +47,20 @@ List selectPreWeekCountByThirtyDay(); List selectPreDayCountBySevenDay(); + + Integer selectDemobilizedCount(@Param("eventType") Number personnelDemobilizedEvent); + + List selectPreMonthCount(); + + List selectListBySevenDay(); + + List selectListByToday(); + + List selectListByToday2(); + + List selectListByToday3(); + + List selectListByType(@Param("eventType") Number eventType); + + List selectDemobilizedCountByHour(@Param("eventType") Number eventType); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/CategoryLevelMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/CategoryLevelMapper.java index 52fc714..afe1650 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/CategoryLevelMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/CategoryLevelMapper.java @@ -17,9 +17,9 @@ @Mapper public interface CategoryLevelMapper extends BaseMapper { - List getCaseCategoryLevelListPage(@Param("page") Page page, CategoryLevelRequest categoryLevelRequest); + List getCaseCategoryLevelListPage(@Param("page") Page page, @Param("categoryLevelRequest") CategoryLevelRequest categoryLevelRequest); - List getCaseCategoryLevelList(CategoryLevelRequest categoryLevelRequest); + List getCaseCategoryLevelList(@Param("categoryLevelRequest") CategoryLevelRequest categoryLevelRequest); CaseCategoryLevel getCaseCategoryLevel(@Param("categoryLevelCode") String categoryLevelCode); 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 66353b1..2555a09 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 @@ -19,7 +19,7 @@ @Mapper public interface DeviceInfoMapper extends BaseMapper { - List getDeviceInfoListPage(@Param("page") Page page, DeviceInfoRequest deviceInfoRequest); + List getDeviceInfoListPage(@Param("page") Page page, @Param("deviceInfoRequest") DeviceInfoRequest deviceInfoRequest); List getDeviceInfoList(@Param("deviceInfoRequest") DeviceInfoRequest deviceInfoRequest); @@ -27,6 +27,8 @@ DeviceInfo getByIndexCode(@Param("srcIndex") String srcIndex); + DeviceInfo getByIp(@Param("ip") String ip); + List selectIndexCodesByCodes(@Param("deviceCodes") List deviceCodes); List selectByType(@Param("devType") String devType); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java index 41dd0af..5bfaf63 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java @@ -5,6 +5,7 @@ import com.casic.missiles.modular.dto.DeviceRepairRequest; import com.casic.missiles.modular.model.DeviceRepairLog; import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; import java.util.List; @@ -16,7 +17,7 @@ @Mapper public interface DeviceRepairLogMapper extends BaseMapper { - List getDeviceRepairListPage(Page page, DeviceRepairRequest deviceRepairRequest); + List getDeviceRepairListPage(@Param("page") Page page, @Param("deviceRepairRequest")DeviceRepairRequest deviceRepairRequest); - List getDeviceRepairList(DeviceRepairRequest deviceRepairRequest); + List getDeviceRepairList(@Param("deviceRepairRequest") DeviceRepairRequest deviceRepairRequest); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java index 9035c47..4823ac1 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java @@ -18,7 +18,7 @@ @Mapper public interface FireEquipInfoMapper extends BaseMapper { - List getFireEquipInfoListPage(@Param("page") Page page, FireEquipRequest fireEquipRequest); + List getFireEquipInfoListPage(@Param("page") Page page, @Param("fireEquipRequest") FireEquipRequest fireEquipRequest); FireEquipInfo getFireEquipInfo(@Param("equipCode") String equipCode); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/GateGroupMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/GateGroupMapper.java index d8c330d..977a427 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/GateGroupMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/GateGroupMapper.java @@ -17,7 +17,7 @@ */ @Mapper public interface GateGroupMapper extends BaseMapper { - List getGateGroupListPage(@Param("page") Page page, GateGroupRequest gateGroupRequest); + List getGateGroupListPage(@Param("page") Page page, @Param("gateGroupRequest") GateGroupRequest gateGroupRequest); GateGroup getGateGroupByName(@Param("groupName") String groupName); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/HazardLevelMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/HazardLevelMapper.java index 8957780..dcf47bb 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/HazardLevelMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/HazardLevelMapper.java @@ -17,11 +17,13 @@ @Mapper public interface HazardLevelMapper extends BaseMapper { - List getCaseHazardLevelListPage(@Param("page") Page page, HazardLevelRequest hazardLevelRequest); + List getCaseHazardLevelListPage(@Param("page") Page page, @Param("hazardLevelRequest") HazardLevelRequest hazardLevelRequest); - List getCaseHazardLevelList(HazardLevelRequest hazardLevelRequest); + List getCaseHazardLevelList(@Param("hazardLevelRequest") HazardLevelRequest hazardLevelRequest); CaseHazardLevel getCaseHazardLevel(@Param("hazardLevelCode") String hazardLevelCode); List selectHazardName(); + + String selectHazardNameByCode(@Param("hazardLevelCode") String hazardLevelCode); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/HikCaseDefineMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/HikCaseDefineMapper.java index 0dc47d1..f162fef 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/HikCaseDefineMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/HikCaseDefineMapper.java @@ -12,5 +12,5 @@ */ @Mapper public interface HikCaseDefineMapper extends BaseMapper { - HikCaseDefine getHikCaseDefine(@Param("caseTypeCode") Long caseTypeCode); + HikCaseDefine getHikCaseDefine(@Param("caseTypeCode") Number caseTypeCode); } 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 f8a674c..fe5afc2 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 @@ -17,11 +17,13 @@ @Mapper public interface StaffInfoMapper extends BaseMapper { - List getStaffInfoListPage(@Param("page") Page page, StaffInfoRequest staffInfoRequest); + List getStaffInfoListPage(@Param("page") Page page, @Param("staffInfoRequest") StaffInfoRequest staffInfoRequest); StaffInfo selectByCode(@Param("staffCode") String staffCode); - List getStaffInfoList(StaffInfoRequest staffInfoRequest); + List getStaffInfoList(@Param("staffInfoRequest") StaffInfoRequest staffInfoRequest); - List selectBatchCodes(List list); + List selectBatchCodes(@Param("list") List list); + + int updateByCodeForCard(@Param("staffCode") String staffCode, @Param("cardNo") String cardNo); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitInfoMapper.java index b1217c5..6c52542 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitInfoMapper.java @@ -16,7 +16,7 @@ */ @Mapper public interface VisitInfoMapper extends BaseMapper { - List getVisitInfoListPage(@Param("page") Page page, VisitorRequest visitorRequest); + List getVisitInfoListPage(@Param("page") Page page, @Param("visitorRequest") VisitorRequest visitorRequest); VisitInfo selectByOrderId(@Param("orderId") String orderId); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitorApplyMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitorApplyMapper.java index c09f3c0..6ea55bd 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitorApplyMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitorApplyMapper.java @@ -18,7 +18,7 @@ @Mapper public interface VisitorApplyMapper extends BaseMapper { - List getVisitorApplyListPage(@Param("page") Page page, VisitorApplyRequest visitorApplyRequest); + List getVisitorApplyListPage(@Param("page") Page page, @Param("visitorApplyRequest") VisitorApplyRequest visitorApplyRequest); List selectByVisitReason(); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/AttendanceInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/AttendanceInfoMapper.xml index b2ece71..f8bdd6e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/AttendanceInfoMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/AttendanceInfoMapper.xml @@ -43,7 +43,8 @@ and staff_type = #{staffType} - and YEARWEEK(date_format(atte_date, '%Y-%m-%d'), 1) = YEARWEEK(now(),1); + AND DATE_SUB(CURDATE(), INTERVAL 7 DAY) <= DATE(atte_date) + GROUP BY DATE_FORMAT(atte_date, '%Y-%m-%d') @@ -69,4 +70,20 @@ GROUP BY DATE_FORMAT(atte_date, '%Y-%m') + + + \ No newline at end of file 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 2b6953f..06ec0a8 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 @@ -28,7 +28,9 @@ @@ -87,7 +89,8 @@ SELECT hazard_level_code as levelCode, count(id) as quantity FROM bus_case_info WHERE hazard_level_code is not null - AND DATE_SUB(CURDATE(), INTERVAL 7 DAY) <= date(happen_time); + AND is_key_area = 1 + AND DATE_SUB(CURDATE(), INTERVAL 7 DAY) <= date(happen_time) GROUP BY hazard_level_code @@ -95,7 +98,8 @@ SELECT hazard_level_code as levelCode, count(id) as quantity FROM bus_case_info WHERE hazard_level_code is not null - AND DATE_SUB(CURDATE(), INTERVAL 30 DAY) <= date(happen_time); + AND is_key_area = 1 + AND DATE_SUB(CURDATE(), INTERVAL 30 DAY) <= date(happen_time) GROUP BY hazard_level_code @@ -122,4 +126,71 @@ AND hazard_level_code is not null GROUP BY DATE_FORMAT(happen_time,'%Y-%m-%d') + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/CategoryLevelMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/CategoryLevelMapper.xml index 4670b1f..1d25cbd 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/CategoryLevelMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/CategoryLevelMapper.xml @@ -20,11 +20,11 @@ SELECT * FROM bus_case_category_level WHERE 1=1 - - and code = #{code} + + and code = #{categoryLevelRequest.code} - - and name = #{name} + + and name = #{categoryLevelRequest.name} ORDER by create_time DESC 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 9b66fd8..bfd84b7 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 @@ -98,4 +98,10 @@ #{item} + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceRepairLogMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceRepairLogMapper.xml index 078ed3c..cf1a481 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceRepairLogMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceRepairLogMapper.xml @@ -22,14 +22,14 @@ SELECT * FROM bus_device_repair_log WHERE 1=1 - - and device_code = #{devCode} + + and device_code = #{deviceRepairRequest.devCode} - - and device_name = #{devName} + + and device_name = #{deviceRepairRequest.devName} - - and DATE_FORMAT(create_time,"%y%m%d") = DATE_FORMAT(#{createTime},"%y%m%d") + + and DATE_FORMAT(create_time,"%y%m%d") = DATE_FORMAT(#{deviceRepairRequest.createTime},"%y%m%d") ORDER by create_time DESC diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/HazardLevelMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/HazardLevelMapper.xml index f16f2b9..458322b 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/HazardLevelMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/HazardLevelMapper.xml @@ -20,11 +20,11 @@ SELECT * FROM bus_case_hazard_level WHERE 1=1 - - and code = #{code} + + and code = #{hazardLevelRequest.code} - - and name = #{name} + + and name = #{hazardLevelRequest.name} ORDER by create_time DESC @@ -42,4 +42,10 @@ SELECT name FROM bus_case_hazard_level + + \ 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 557237e..b6a183a 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 @@ -50,4 +50,10 @@ + + + UPDATE bus_staff_info + SET card_no = #{cardNo} + WHERE staff_code = #{staffCode} + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitInfoMapper.xml index 84aa84f..230529a 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitInfoMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitInfoMapper.xml @@ -27,5 +27,6 @@ SELECT * FROM bus_visit_info WHERE order_id = #{orderId} and DATE_FORMAT(in_time,'%Y-%m-%d') = CURRENT_DATE + limit 1 \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/BlackPictureRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/BlackPictureRequest.java new file mode 100644 index 0000000..fc92701 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/BlackPictureRequest.java @@ -0,0 +1,14 @@ +package com.casic.missiles.modular.dto; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/29 19:26 + */ +@Data +public class BlackPictureRequest { + private String picUri; + private String serverIndexCode; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/CancelSubscribeRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/CancelSubscribeRequest.java new file mode 100644 index 0000000..e2d390a --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/CancelSubscribeRequest.java @@ -0,0 +1,15 @@ +package com.casic.missiles.modular.dto.hik; + +import lombok.Data; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/24 15:14 + */ +@Data +public class CancelSubscribeRequest { + private List eventTypes; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/CardInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/CardInfo.java new file mode 100644 index 0000000..341457d --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/CardInfo.java @@ -0,0 +1,24 @@ +package com.casic.missiles.modular.dto.hik; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/26 16:08 + */ +@Data +public class CardInfo { + //卡号,8~20个字符,支持数字和大写字母 + private String cardNo; + //人员ID,员工工号 + private String personId; + //人员所属组织IndexCode + private String orgIndexCode; + //卡片类型,默认是1:IC卡 + //1:IC卡 + //2:CPU卡 + //3:远距离卡 + //4:MIFARE卡 + private Number cardType; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/FaceRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/FaceRequest.java new file mode 100644 index 0000000..edc04bf --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/FaceRequest.java @@ -0,0 +1,16 @@ +package com.casic.missiles.modular.dto.hik; + +import lombok.Data; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/25 16:53 + */ +@Data +public class FaceRequest { + private String certificateNum; + private List indexCodes; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/HikRecvEvent.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/HikRecvEvent.java index a3e9845..1b2b2b1 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/HikRecvEvent.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/HikRecvEvent.java @@ -28,12 +28,12 @@ /** * 事件类型,用于判断所需接收到的事件类型 */ - public Long getEventType(){ + public Number getEventType(){ JSONObject jsonObject = (JSONObject)JSONObject.toJSON(params); //事件类别对应SecurityEventTypeEnum JSONArray eventTypeArray = (JSONArray)jsonObject.get("events"); JSONObject eventJsonObject = (JSONObject)JSONObject.toJSON(eventTypeArray.get(0)); - Long eventType = (Long) eventJsonObject.get("eventType"); + Number eventType = (Number) eventJsonObject.get("eventType"); return eventType; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonBatchDeleteRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonBatchDeleteRequest.java index 027d31d..9751929 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonBatchDeleteRequest.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonBatchDeleteRequest.java @@ -12,4 +12,6 @@ @Data public class PersonBatchDeleteRequest { private List personIds; + //删除人脸接口使用 + private String faceId; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonInfoRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonInfoRequest.java new file mode 100644 index 0000000..05dc9e1 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonInfoRequest.java @@ -0,0 +1,20 @@ +package com.casic.missiles.modular.dto.hik; + +import lombok.Data; + +import java.util.List; + +/** + * @Description: 获取员工照片请求实体 + * @Author: wangpeng + * @Date: 2022/8/25 16:53 + */ +@Data +public class PersonInfoRequest { + //获取员工详细信息使用 + private String paramName; + private List paramValue; + //获取照片使用 + private String picUri; + private String serverIndexCode; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonListRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonListRequest.java new file mode 100644 index 0000000..3f7149b --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonListRequest.java @@ -0,0 +1,16 @@ +package com.casic.missiles.modular.dto.hik; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/25 16:53 + */ +@Data +public class PersonListRequest { + private Number pageNo; + private Number pageSize; + + private String orderId; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/SearchPicturesRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/SearchPicturesRequest.java new file mode 100644 index 0000000..0a95966 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/SearchPicturesRequest.java @@ -0,0 +1,24 @@ +package com.casic.missiles.modular.dto.hik; + +import lombok.Data; + +import java.util.List; + +/** + * @Description: 以图搜图请求 + * @Author: wangpeng + * @Date: 2022/8/29 10:46 + */ +@Data +public class SearchPicturesRequest { + private String facePicBinaryData; + private String facePicUrl; + private List cameraIndexCodes; + private String startTime; + private String endTime; + //指定搜图的最小相似度,最小为1,最大为100 + private String minSimilarity; + private Number age; + //male-男性,female-女性 + private String sex; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/StaffCardRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/StaffCardRequest.java new file mode 100644 index 0000000..4052e6d --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/StaffCardRequest.java @@ -0,0 +1,20 @@ +package com.casic.missiles.modular.dto.hik; + +import lombok.Data; + +import java.util.List; + +/** + * @Description: 人员开卡请求实体 + * @Author: wangpeng + * @Date: 2022/8/26 16:05 + */ +@Data +public class StaffCardRequest { + //卡片开始有效时间,时间格式:yyyy-MM-dd + private String startDate; + //卡片截止有效时间,时间格式:yyyy-MM-dd,不能大于2037年12月31日 + private String endDate; + //cardList,待开卡列表,最大支持50张卡 + private List cardList; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/VisitorInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/VisitorInfo.java index 73aa316..b99f301 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/VisitorInfo.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/VisitorInfo.java @@ -14,7 +14,7 @@ //访客性别 //1: 男 //2: 女 - private String gender; + private Integer gender; //联系电话建议填写手机号码 private String phoneNo; //证件类型 diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/ApplyReasonGroupDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/ApplyReasonGroupDTO.java index 514f382..786143e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/ApplyReasonGroupDTO.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/ApplyReasonGroupDTO.java @@ -13,4 +13,6 @@ private String visitReason; //访问人数 private Integer quantity; + //占比 + private String ratio; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/AttendanceNumberDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/AttendanceNumberDTO.java new file mode 100644 index 0000000..a494321 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/AttendanceNumberDTO.java @@ -0,0 +1,24 @@ +package com.casic.missiles.modular.dto.statistics; + +import com.fasterxml.jackson.annotation.JsonIgnore; +import lombok.Data; + +/** + * @Description: 出勤人数统计实体 + * @Author: wangpeng + * @Date: 2022/8/31 19:24 + */ +@Data +public class AttendanceNumberDTO { + //日期维度,周、今日,入参 + @JsonIgnore + private String dateDimension; + + //日期,具体天/小时,出参 + private String date; + //出勤人数 + private String quantity; + //员工类型 + private String staffType; + +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/AvgMonthAndWeekGroupDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/AvgMonthAndWeekGroupDTO.java index 4366916..331a9a9 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/AvgMonthAndWeekGroupDTO.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/AvgMonthAndWeekGroupDTO.java @@ -2,8 +2,6 @@ import lombok.Data; -import java.util.Map; - /** * @Description: 平均每月和每周的数据实体 * @Author: wangpeng @@ -13,6 +11,4 @@ public class AvgMonthAndWeekGroupDTO { //入参 private String year; - //出参,key:事件类型,value:周和月数据平均值 - private Map map; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/GateStatusGroupResponse.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/GateStatusGroupResponse.java new file mode 100644 index 0000000..d16f4e5 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/GateStatusGroupResponse.java @@ -0,0 +1,16 @@ +package com.casic.missiles.modular.dto.statistics; + +import lombok.Data; + +/** + * @Description: 闸机/摄像机统计响应实体 + * @Author: wangpeng + * @Date: 2022/8/30 14:22 + */ +@Data +public class GateStatusGroupResponse { + //设备状态 + private String status; + //占比 + private String ratio; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/MonthAndWeekDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/MonthAndWeekDTO.java index 7482b2a..284115a 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/MonthAndWeekDTO.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/MonthAndWeekDTO.java @@ -9,7 +9,7 @@ */ @Data public class MonthAndWeekDTO { -// private String levelName; + private String levelName; private Integer monthQuantity; private Integer weekQuantity; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/OnDutyRatioDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/OnDutyRatioDTO.java new file mode 100644 index 0000000..4f6a65d --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/OnDutyRatioDTO.java @@ -0,0 +1,15 @@ +package com.casic.missiles.modular.dto.statistics; + +import lombok.Data; + +/** + * @Description: 在岗率统计实体 + * @Author: wangpeng + * @Date: 2022/9/2 21:24 + */ +@Data +public class OnDutyRatioDTO { + private String date; + private String quantity; + private String ratio; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/SecurityLevelAssessDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/SecurityLevelAssessDTO.java new file mode 100644 index 0000000..40a0738 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/SecurityLevelAssessDTO.java @@ -0,0 +1,15 @@ +package com.casic.missiles.modular.dto.statistics; + +import lombok.Data; + +/** + * @Description: 出勤人数统计实体 + * @Author: wangpeng + * @Date: 2022/8/31 19:24 + */ +@Data +public class SecurityLevelAssessDTO { + private String date; + private String quantity; + private Double score; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/SecurityScoreDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/SecurityScoreDTO.java index 304d169..f7bd4a2 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/SecurityScoreDTO.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/SecurityScoreDTO.java @@ -14,5 +14,5 @@ //楼层,出参 private String area; //评分,出参 - private String score; + private Double score; } 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 6a30786..e5e613d 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 @@ -8,6 +8,10 @@ public interface HikUri { //事件订阅 String EVENT_SUBSCRIBE = "/api/eventService/v1/eventSubscriptionByEventTypes"; + //事件订阅信息查询 + String EVENT_INFO = "/api/eventService/v1/eventSubscriptionView"; + //事件订阅取消 + String EVENT_CANCEL = "/api/eventService/v1/eventUnSubscriptionByEventTypes"; //预约免登记 String APPOINTMENT_FREE_REGISTER = "/api/visitor/v1/appointment/registration"; //修改访客预约 @@ -32,8 +36,18 @@ String PERSON_SINGLE_UPDATE = "/api/resource/v1/person/single/update"; //批量删除人员 String PERSON_BATCH_DELETE = "/api/resource/v1/person/batch/delete"; + //根据人脸Id删除人脸 + String PERSON_SINGLE_DELETE = "/api/resource/v1/face/single/delete"; //门禁点反控 String DOOR_CONTROL = "/api/acs/v1/door/doControl"; //查询海康门禁点事件v2 String DOOR_EVENTS = "/api/acs/v2/door/events"; + //批量开卡 + String CARD_BINDING = "/api/cis/v1/card/binding"; + //提取人员照片 + String PERSON_PICTURE = "/api/resource/v1/person/picture"; + //根据人员唯一字段获取人员详细信息 + String PERSON_INFO = "/api/resource/v1/person/condition/personInfo"; + //以图搜图 + String SEARCH_PICTURES = "/api/frs/v1/application/captureSearch"; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/enums/SecurityEventType.java b/casic-server/src/main/java/com/casic/missiles/modular/enums/SecurityEventType.java index d51034c..42eacf8 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/enums/SecurityEventType.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/enums/SecurityEventType.java @@ -14,18 +14,27 @@ Number PERSONNEL_GATHER_EVENT = 131593; //监控点离线事件 Number MONITORING_POINT_OFFLINE = 889196545; + //监控点上线事件 + Number MONITORING_POINT_ONLINE = 889196546; //装置离线 Number DEVICE_OFFLINE = 199710; + //装置连线 + Number DEVICE_ONLINE = 199711; //访客登记 Number VISITOR_REGISTER = 1392513025; //访客签离 Number VISITOR_CHECKOUT = 1392513026; + //高空抛物 + Number HIGH_ALTITUDE_PARABOLIC = 930335; + //下面两个查询海康门禁点事件使用 //合法卡比对通过 Number CARD_COMPARE_PASS = 198914; //人脸认证通过 Number FACE_COMPARE_PASS = 196893; + + // //正常开门 // Number NORMAL_OPENING = 198913; // //按钮开门 @@ -46,7 +55,6 @@ // Number FIREWORKS_DETECTION = 192514; // //陌生人识别事件 // Number STRANGER_RECOGNITION = 1644171265; -// //高空抛物 -// Number HIGH_ALTITUDE_PARABOLIC = 930335; + } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/job/CockpitJob.java b/casic-server/src/main/java/com/casic/missiles/modular/job/CockpitJob.java index 7490a27..85dd016 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/job/CockpitJob.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/job/CockpitJob.java @@ -79,14 +79,6 @@ } }); } - } - /** - * 机动力量实时在岗率,在岗人数除以总应在岗人数,功能待定 - */ -// @Scheduled(cron = "0 0/1 * * * ?") - public void BeOnDutyRatio() { - - } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/service/HikCaseDefineService.java b/casic-server/src/main/java/com/casic/missiles/modular/service/HikCaseDefineService.java index d9bb3a9..18e2936 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/service/HikCaseDefineService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/service/HikCaseDefineService.java @@ -9,5 +9,5 @@ * @Date: 2022/7/21 17:20 */ public interface HikCaseDefineService extends IService { - HikCaseDefine getHikCaseDefine(Long caseTypeCode); + HikCaseDefine getHikCaseDefine(Number caseTypeCode); } 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 dd24101..bcc3b5d 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 @@ -18,6 +18,8 @@ CaseInfo monitorPointOfflineHandle(JSONObject event, CaseInfo caseInfo); + void monitorPointOnlineHandle(JSONObject event); + CaseInfo deviceOfflineHandle(JSONObject event, CaseInfo caseInfo); void propertyAttendanceHandle(JSONObject event); @@ -27,4 +29,6 @@ void visitorRegisterHandler(JSONObject event); void visitorCheckOutHandler(JSONObject event); + + void deviceOnlineHandle(JSONObject event); } 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 e55c016..01870bd 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.StaffCardRequest; import com.casic.missiles.modular.model.StaffInfo; import java.util.List; @@ -28,4 +29,6 @@ StaffInfo selectStaffInfoByCode(StaffInfo staffInfo); List staffInfoList(StaffInfoRequest staffInfoRequest); + + int saveCardInfo(StaffCardRequest staffCardRequest); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/service/impl/BlackInfoServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/service/impl/BlackInfoServiceImpl.java index 8f47b37..981b4cd 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/service/impl/BlackInfoServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/service/impl/BlackInfoServiceImpl.java @@ -17,7 +17,6 @@ import com.casic.missiles.modular.model.BlackInfo; import com.casic.missiles.modular.model.HikFaceGroupInfo; import com.casic.missiles.modular.service.BlackInfoService; -import com.casic.missiles.modular.system.service.ICasicFileService; import com.casic.missiles.modular.util.HikUtil; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; @@ -43,9 +42,6 @@ private HikFaceGroupInfoMapper hikFaceGroupInfoMapper; @Resource - private ICasicFileService fileService; - - @Resource private AbstractDictService dictService; @Override @@ -90,9 +86,6 @@ //设置海康人脸唯一标识、人脸分组唯一标识 blackInfo.setIndexCode(String.valueOf(dataJson.get("indexCode"))); blackInfo.setFaceGroupIndexCode(String.valueOf(dataJson.get("faceGroupIndexCode"))); - //保存图片到本地 - String picUrl = fileService.saveFile(blackInfo.getPicture()); - blackInfo.setPicture(picUrl); //插入数据库 if(blackInfoMapper.insert(blackInfo) > 0){ return ResponseData.success(); @@ -141,8 +134,6 @@ log.error("请求海康,单个修改人脸失败,海康response:{}", resultStr); return ResponseData.error("单个修改人脸失败"); } - String picUrl = fileService.saveFile(blackInfo.getPicture()); - blackInfo.setPicture(picUrl); if(blackInfoMapper.updateById(blackInfo) > 0){ return ResponseData.success(); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/service/impl/CockpitServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/service/impl/CockpitServiceImpl.java index 6e6076e..7402991 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/service/impl/CockpitServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/service/impl/CockpitServiceImpl.java @@ -4,15 +4,12 @@ import cn.hutool.core.date.DateUtil; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.core.application.service.AbstractDictService; import com.casic.missiles.modular.dto.hik.DoorEventsRequest; import com.casic.missiles.modular.enums.HikUri; -import com.casic.missiles.modular.enums.SecurityEventDict; import com.casic.missiles.modular.enums.SecurityEventType; import com.casic.missiles.modular.service.CockpitService; import com.casic.missiles.modular.util.HikUtil; import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.*; @@ -25,8 +22,6 @@ @Slf4j @Service public class CockpitServiceImpl implements CockpitService { - @Autowired - private AbstractDictService dictService; @Override public HashMap dataHandle(DoorEventsRequest doorEventsRequest, HashMap> configMap, HashMap jsonMap, HashMap resultMap) { @@ -36,8 +31,8 @@ Date date = new Date(); DateTime startTimeDate = DateUtil.beginOfDay(date); DateTime endTimeDate = DateUtil.endOfDay(date); - String startTime = DateUtil.format(startTimeDate, "yyyy-MM-dd'T'HH:mm:ss'Z'"); - String endTime = DateUtil.format(endTimeDate, "yyyy-MM-dd'T'HH:mm:ss'Z'"); + String startTime = DateUtil.format(startTimeDate, "yyyy-MM-dd'T'HH:mm:ssXXX"); + String endTime = DateUtil.format(endTimeDate, "yyyy-MM-dd'T'HH:mm:ssXXX"); configMap.keySet().stream().forEach(key -> { List doorIndexCodes = configMap.get(key); doorEventsRequest.setPageNo(1); @@ -95,8 +90,9 @@ return; } Integer num = 0; - while (list.stream().iterator().hasNext()) { - JSONObject next = (JSONObject) list.stream().iterator().next(); + Iterator iterator = list.stream().iterator(); + while (iterator.hasNext()) { + JSONObject next = (JSONObject) iterator.next(); Integer inAndOutType = next.getInteger("inAndOutType"); //进门 if (1 == inAndOutType) { @@ -105,8 +101,8 @@ --num; } } - String dictName = dictService.getDictNameByCode(SecurityEventDict.DEVICE_POSITION, String.valueOf(key)); - resultMap.put(dictName, num); +// String dictName = dictService.getDictNameByCode(SecurityEventDict.DEVICE_POSITION, String.valueOf(key)); + resultMap.put(String.valueOf(key), num); }); return resultMap; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/service/impl/HikCaseDefineServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/service/impl/HikCaseDefineServiceImpl.java index 98ab2a4..1a59c7e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/service/impl/HikCaseDefineServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/service/impl/HikCaseDefineServiceImpl.java @@ -16,7 +16,7 @@ private HikCaseDefineMapper hikCaseDefineMapper; @Override - public HikCaseDefine getHikCaseDefine(Long caseTypeCode) { + public HikCaseDefine getHikCaseDefine(Number caseTypeCode) { return hikCaseDefineMapper.getHikCaseDefine(caseTypeCode); } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/BlackListController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/BlackListController.java index a27f9f8..0c06661 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/BlackListController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/BlackListController.java @@ -1,13 +1,18 @@ package com.casic.missiles.modular.controller; +import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.base.controller.ExportController; import com.casic.missiles.core.page.PageFactory; import com.casic.missiles.model.response.ResponseData; import com.casic.missiles.modular.dto.BlackInfoRequest; +import com.casic.missiles.modular.dto.BlackPictureRequest; +import com.casic.missiles.modular.dto.hik.PersonInfoRequest; +import com.casic.missiles.modular.enums.HikUri; import com.casic.missiles.modular.enums.OperateTypeEnum; import com.casic.missiles.modular.model.BlackInfo; import com.casic.missiles.modular.service.BlackInfoService; +import com.casic.missiles.modular.util.HikUtil; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; @@ -56,4 +61,22 @@ return null; } + /** + * 黑名单人员照片 + */ + @PostMapping("/personPicture") + @ResponseBody + public Object personPicture(@RequestBody BlackPictureRequest blackPictureRequest){ + //获取照片 + String picUri = blackPictureRequest.getPicUri(); + String serverIndexCode = blackPictureRequest.getServerIndexCode(); + PersonInfoRequest picRequest = new PersonInfoRequest(); + picRequest.setPicUri(picUri); + picRequest.setServerIndexCode(serverIndexCode); + String reBody = JSONObject.toJSONString(picRequest); + //重定向地址获取 + String url = HikUtil.hikApiFor302(HikUri.PERSON_PICTURE, reBody); + return ResponseData.success(url); + } + } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/DeviceController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/DeviceController.java index e1c4eba..666bbee 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/DeviceController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/DeviceController.java @@ -107,7 +107,7 @@ } /** - * 设备维修管理查询(分页),需计算MTTR=总维修时间/故障次数 + * 设备状态计算与评判/设备维修管理查询(分页),需计算MTTR=总维修时间/故障次数 */ @PostMapping("/repair/listPage") @ResponseBody @@ -211,7 +211,7 @@ //需根据设备编号获取到对应的门禁点唯一标识 doorControlRequest.setDoorIndexCodes(indexCodes); doorControlRequest.setControlType(Integer.valueOf(gateGroupDTO.getStatus())); - String body = JSONObject.toJSONString(deviceCodes); + String body = JSONObject.toJSONString(doorControlRequest); String resultStr = HikUtil.hikApi(HikUri.DOOR_CONTROL, body); JSONObject resultJson = (JSONObject)JSONObject.parse(resultStr); if (!"0".equals(resultJson.get("code"))) { diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/StaffController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/StaffController.java index b58ccab..704093c 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/StaffController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/StaffController.java @@ -2,15 +2,21 @@ import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.util.StrUtil; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.base.controller.ExportController; import com.casic.missiles.core.page.PageFactory; import com.casic.missiles.model.response.ErrorResponseData; import com.casic.missiles.model.response.ResponseData; import com.casic.missiles.modular.dto.StaffInfoRequest; +import com.casic.missiles.modular.dto.hik.PersonInfoRequest; +import com.casic.missiles.modular.dto.hik.StaffCardRequest; +import com.casic.missiles.modular.enums.HikUri; import com.casic.missiles.modular.enums.OperateTypeEnum; import com.casic.missiles.modular.model.StaffInfo; import com.casic.missiles.modular.service.StaffInfoService; +import com.casic.missiles.modular.util.HikUtil; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; @@ -110,4 +116,60 @@ } return ResponseData.success(); } + + /** + * 批量开卡,添加人员之后调用,若在一个接口中添加人员成功开卡失败则第二次添加时会有问题 + */ + @PostMapping("/cardBinding") + @ResponseBody + public Object cardBinding(@RequestBody StaffCardRequest staffCardRequest) { + String body = JSONObject.toJSONString(staffCardRequest); + String resultStr = HikUtil.hikApi(HikUri.CARD_BINDING, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (!"0".equals(resultJson.get("code"))) { + log.error("请求海康,批量开卡失败,海康response:{}", resultStr); + return ResponseData.error("批量开卡失败"); + } + //保存卡号 + if(staffInfoService.saveCardInfo(staffCardRequest) > 0){ + return ResponseData.success(); + } + return ResponseData.error("批量开卡失败"); + } + + /** + * 获取员工照片,海康存储 + */ + @PostMapping("/personPicture/{staffCode}") + @ResponseBody + public Object personPicture(@PathVariable("staffCode") String staffCode){ + //获取员工详细信息,含图片服务器、uri + PersonInfoRequest request = new PersonInfoRequest(); + List list = new ArrayList<>(); + list.add(staffCode); + request.setParamName("personId"); + request.setParamValue(list); + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi(HikUri.PERSON_INFO, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (!"0".equals(resultJson.get("code"))) { + log.error("请求海康,根据人员唯一字段获取人员详细信息失败,海康response:{}", resultStr); + return ResponseData.error("获取员工照片失败"); + } + //获取照片 + JSONObject data = (JSONObject) resultJson.get("data"); + JSONArray dataArray = (JSONArray) data.get("list"); + JSONObject jsonObject = (JSONObject) dataArray.get(0); + JSONArray personPhoto = (JSONArray) jsonObject.get("personPhoto"); + JSONObject photo = (JSONObject) personPhoto.get(0); + String picUri = photo.getString("picUri"); + String serverIndexCode = photo.getString("serverIndexCode"); + PersonInfoRequest picRequest = new PersonInfoRequest(); + picRequest.setPicUri(picUri); + picRequest.setServerIndexCode(serverIndexCode); + String reBody = JSONObject.toJSONString(picRequest); + //重定向地址获取 + String url = HikUtil.hikApiFor302(HikUri.PERSON_PICTURE, reBody); + return ResponseData.success(url); + } } 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 4a07dd9..7b1dcf6 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 @@ -16,6 +16,7 @@ import com.casic.missiles.modular.redis.key.CacheKeys; import com.casic.missiles.modular.service.CockpitService; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.util.CollectionUtils; import org.springframework.web.bind.annotation.*; @@ -24,10 +25,7 @@ import java.text.NumberFormat; import java.time.LocalDateTime; import java.time.temporal.ChronoUnit; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.util.*; import java.util.stream.Collectors; /** @@ -73,6 +71,9 @@ private StatisticNumberMapper numberMapper; @Autowired + private HazardLevelMapper hazardLevelMapper; + + @Autowired private AccessGroupConfig accessGroupConfig; /** @@ -104,8 +105,24 @@ public Object buildingNumberPerHour(){ //当天按小时分组的人数 List list = numberMapper.selectListByTime(); - Map> collect = list.stream().collect(Collectors.groupingBy(BuildingNumberDTO::getStatisticPosition)); - return ResponseData.success(collect); + Map> collect = list.stream().collect(Collectors.groupingBy(BuildingNumberDTO::getStatisticTime)); + //定时任务中已将每小时三栋楼人数存到数据库 + //将一期主楼和录制楼人数合并,二期单算 + List> resultList = new ArrayList<>(); + collect.keySet().forEach(key -> { + List buildingNumberDTOS = collect.get(key); + BuildingNumberDTO mainBuildingOne = buildingNumberDTOS.get(0); + BuildingNumberDTO mainBuildingTwo = buildingNumberDTOS.get(1); + BuildingNumberDTO recordingBuilding = buildingNumberDTOS.get(2); + HashMap resultMap = new HashMap<>(); + Integer oneQuantity = Integer.valueOf(mainBuildingOne.getStatisticQuantity()); + Integer recordingQuantity = Integer.valueOf(recordingBuilding.getStatisticQuantity()); + resultMap.put("staticTime", mainBuildingOne.getStatisticTime()); + resultMap.put(mainBuildingOne.getStatisticPositionName()+"、"+recordingBuilding.getStatisticPositionName(), String.valueOf(oneQuantity+recordingQuantity)); + resultMap.put(mainBuildingTwo.getStatisticPositionName(), mainBuildingTwo.getStatisticQuantity()); + resultList.add(resultMap); + }); + return ResponseData.success(resultList); } /** @@ -151,12 +168,11 @@ public Object securityNumber() { QueryWrapper wrapper = new QueryWrapper<>(); wrapper.eq("staff_type", 2); + // TODO: 2022/9/2 后续使用产品确定的每天出勤的安保人员的数量 Integer total = staffInfoMapper.selectCount(wrapper); - //当日离岗事件个数 - QueryWrapper wrapper1 = new QueryWrapper<>(); - wrapper1.eq("hik_event_type", SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); - wrapper1.apply("date_format(now(),'%Y-%m-%d') = date_format(happen_time,'%Y-%m-%d')"); - Integer leave = caseInfoMapper.selectCount(wrapper1); + //当日离岗事件按设备去重后的个数 + // TODO: 2022/9/2 目前相当于24小时内的计算,之后看需要可改成自定义小时数计算离岗率,即离岗+6小时内仅一次离岗则恢复为100%,多次则累加离岗次数计算离岗率 + Integer leave = caseInfoMapper.selectDemobilizedCount(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); NumberFormat numberFormat = NumberFormat.getInstance(); // 设置精确到小数点后2位 numberFormat.setMaximumFractionDigits(2); @@ -179,7 +195,6 @@ @ResponseBody public Object visitorApplyDetail() { List reasonGroup = applyMapper.selectByVisitReason(); - HashMap resultMap = new HashMap<>(); NumberFormat numberFormat = NumberFormat.getInstance(); // 设置精确到小数点后2位 numberFormat.setMaximumFractionDigits(2); @@ -187,12 +202,17 @@ if(0 == sum){ return ResponseData.success(); } + List resultList = new ArrayList<>(); reasonGroup.forEach(group -> { String reasonName = dictService.getDictNameByCode(SecurityEventDict.VISIT_REASON, group.getVisitReason()); String result = numberFormat.format((float) group.getQuantity() / (float) sum * 100); - resultMap.put(reasonName, result+"%"); + ApplyReasonGroupDTO applyReasonGroupDTO = new ApplyReasonGroupDTO(); + applyReasonGroupDTO.setQuantity(group.getQuantity()); + applyReasonGroupDTO.setVisitReason(reasonName); + applyReasonGroupDTO.setRatio(result+"%"); + resultList.add(applyReasonGroupDTO); }); - return ResponseData.success(resultMap); + return ResponseData.success(resultList); } /** @@ -247,6 +267,32 @@ } /** + * 机动力量实时在岗率,在岗人数除以总应在岗人数,用离岗+6小时内恢复为100%,6小时外再计算 + */ + @GetMapping("/staff/beOnDutyRatio") + @ResponseBody + public Object beOnDutyRatio() { + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("staff_type", 2); + // TODO: 2022/9/2 后续使用产品确定的每天出勤的安保人员的数量 + Integer total = staffInfoMapper.selectCount(wrapper); + if(0 == total){ + return ResponseData.success(null); + } + //当日离岗事件按设备去重后的个数 + // TODO: 2022/9/2 目前相当于24小时内的计算,之后看需要可改成自定义小时数计算离岗率,即离岗+6小时内仅一次离岗则恢复为100%,多次则累加离岗次数计算离岗率 + List onDutyRatioDTOS = caseInfoMapper.selectDemobilizedCountByHour(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); + onDutyRatioDTOS.forEach(dto -> { + NumberFormat numberFormat = NumberFormat.getInstance(); + // 设置精确到小数点后2位 + numberFormat.setMaximumFractionDigits(2); + String result = numberFormat.format(100 - Float.valueOf(dto.getQuantity()) / (float) total * 100); + dto.setRatio(result+"%"); + }); + return ResponseData.success(onDutyRatioDTOS); + } + + /** * 闸机速通门统计-设备状态分组计算数量,devType传闸机字典key * 视频频监控摄像机统计-设备状态分组计算数量,devType传摄像头字典key */ @@ -262,12 +308,17 @@ if(sum <= 0){ return ResponseData.error("无该类设备信息"); } + List resultList = new ArrayList<>(); gateStatusGroup.forEach(group -> { String devStatus = dictService.getDictNameByCode(SecurityEventDict.DEVICE_STATUS, group.getStatus()); String result = numberFormat.format((float) group.getQuantity() / (float) sum * 100); - resultMap.put(devStatus, result+"%"); + GateStatusGroupResponse gateStatusGroupResponse = new GateStatusGroupResponse(); + gateStatusGroupResponse.setStatus(devStatus); + gateStatusGroupResponse.setRatio(result+"%"); + resultList.add(gateStatusGroupResponse); }); - resultMap.put("总", sum); + resultMap.put("total", sum); + resultMap.put("list", resultList); return ResponseData.success(resultMap); } @@ -282,17 +333,38 @@ String position = securityScoreDTO.getPosition(); List caseInfos = caseInfoMapper.selectByPosition(position); //查询各危险级别权重、各类别权重,放入map,避免循环中多次查数据库 - + HashMap hazardScoreMap = new HashMap<>(); + List caseHazardLevelList = hazardLevelMapper.getCaseHazardLevelList(null); + caseHazardLevelList.forEach(hazardLevel -> { + hazardScoreMap.put(hazardLevel.getCode(), hazardLevel.getWeight()); + }); + HashMap categoryScoreMap = new HashMap<>(); + List categoryLevelList = categoryLevelMapper.getCaseCategoryLevelList(null); + categoryLevelList.forEach(categoryLevel -> { + categoryScoreMap.put(categoryLevel.getCode(), categoryLevel.getWeight()); + }); + //事件按楼层分组,计算 List securityScoreDTOs = new ArrayList<>(); caseInfos.forEach(caseInfo -> { SecurityScoreDTO securityScoreDTO1 = new SecurityScoreDTO(); + securityScoreDTO1.setPosition(caseInfo.getPosition()); securityScoreDTO1.setArea(caseInfo.getArea()); - // TODO: 2022/8/4 楼层评分计算根据产品定义调整 -// caseInfo.get -// securityScoreDTO1.setScore(); + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); + Double score = 100 - Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + securityScoreDTO1.setScore(score); + securityScoreDTOs.add(securityScoreDTO1); }); - - return null; + 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); + }); + return ResponseData.success(securityScoreDTOs); } /** @@ -303,9 +375,13 @@ public Object SecurityFrequency(@RequestBody SecurityFrequencyDTO securityFrequencyDTO) { String year = securityFrequencyDTO.getYear(); String month = securityFrequencyDTO.getMonth(); - Integer quantity = caseInfoMapper.selectCountByMonth(year, month); - securityFrequencyDTO.setQuantity(quantity); - return ResponseData.success(securityFrequencyDTO); + if(!StringUtils.isEmpty(year) && StringUtils.isEmpty(month)){ + Integer quantity = caseInfoMapper.selectCountByMonth(year, month); + securityFrequencyDTO.setQuantity(quantity); + return ResponseData.success(securityFrequencyDTO); + } + List list = caseInfoMapper.selectPreMonthCount(); + return ResponseData.success(list); } } 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 ae4d770..f4f075c 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 @@ -1,20 +1,25 @@ package com.casic.missiles.modular.controller.cockpit; +import cn.hutool.core.date.DateUnit; import cn.hutool.core.date.DateUtil; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.casic.missiles.model.response.ResponseData; -import com.casic.missiles.modular.dao.AttendanceInfoMapper; -import com.casic.missiles.modular.dao.CaseInfoMapper; -import com.casic.missiles.modular.dao.HazardLevelMapper; -import com.casic.missiles.modular.dao.StaffInfoMapper; +import com.casic.missiles.modular.dao.*; +import com.casic.missiles.modular.dto.DeviceRepairLogDTO; +import com.casic.missiles.modular.dto.DeviceRepairRequest; import com.casic.missiles.modular.dto.statistics.*; +import com.casic.missiles.modular.enums.SecurityEventType; +import com.casic.missiles.modular.model.CaseCategoryLevel; import com.casic.missiles.modular.model.CaseHazardLevel; +import com.casic.missiles.modular.model.CaseInfo; import com.casic.missiles.modular.model.StaffInfo; +import com.casic.missiles.modular.service.DeviceInfoService; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.util.CollectionUtils; import org.springframework.web.bind.annotation.*; +import java.math.BigDecimal; import java.text.NumberFormat; import java.util.*; import java.util.stream.Collectors; @@ -40,6 +45,12 @@ @Autowired private HazardLevelMapper hazardLevelMapper; + @Autowired + private CategoryLevelMapper categoryLevelMapper; + + @Autowired + private DeviceInfoService deviceInfoService; + /** * 安防事件时域频次统计,每月的每天安防事件个数(原方案) * 月维度:展示每个月的每天的数据 @@ -89,15 +100,17 @@ List monthList = caseInfoMapper.selectPreMonthCountByYear(year); Map> collect = monthList.stream().collect(Collectors.groupingBy(PreMonthOrWeekCaseDTO::getHazardLevelCode)); HashMap strAvgMap = new HashMap<>(); + List resultList = new ArrayList<>(); for (String key : collect.keySet()) { List preMonthOrWeekCaseDTOS = collect.get(key); int sum = preMonthOrWeekCaseDTOS.stream().mapToInt(PreMonthOrWeekCaseDTO::getQuantity).sum(); //若年份是本年,则使用个安防级别数量/当前月份数 //若不是本年,除数为12 MonthAndWeekDTO monthAndWeekDTO = new MonthAndWeekDTO(); + String hazardName = hazardLevelMapper.selectHazardNameByCode(key); + monthAndWeekDTO.setLevelName(hazardName); if(year.equals(String.valueOf(DateUtil.thisYear()))){ monthAndWeekDTO.setMonthQuantity(sum / DateUtil.thisMonth()); -// monthAndWeekDTO.setLevelName(); strAvgMap.put(key, monthAndWeekDTO); }else{ monthAndWeekDTO.setMonthQuantity(sum / 12); @@ -113,27 +126,37 @@ if(year.equals(String.valueOf(DateUtil.thisYear()))){ if(!Objects.isNull(strAvgMap.get(key))){ MonthAndWeekDTO monthAndWeekDTO = strAvgMap.get(key); + String hazardName = hazardLevelMapper.selectHazardNameByCode(key); + monthAndWeekDTO.setLevelName(hazardName); monthAndWeekDTO.setWeekQuantity(sum / DateUtil.thisWeekOfYear()); strAvgMap.put(key, monthAndWeekDTO); }else{ MonthAndWeekDTO monthAndWeekDTO = new MonthAndWeekDTO(); + String hazardName = hazardLevelMapper.selectHazardNameByCode(key); + monthAndWeekDTO.setLevelName(hazardName); monthAndWeekDTO.setWeekQuantity(sum / DateUtil.thisWeekOfYear()); strAvgMap.put(key, monthAndWeekDTO); } }else{ if(!Objects.isNull(strAvgMap.get(key))){ MonthAndWeekDTO monthAndWeekDTO = strAvgMap.get(key); + String hazardName = hazardLevelMapper.selectHazardNameByCode(key); + monthAndWeekDTO.setLevelName(hazardName); monthAndWeekDTO.setWeekQuantity(sum / 52); strAvgMap.put(key, monthAndWeekDTO); }else{ MonthAndWeekDTO monthAndWeekDTO = new MonthAndWeekDTO(); + String hazardName = hazardLevelMapper.selectHazardNameByCode(key); + monthAndWeekDTO.setLevelName(hazardName); monthAndWeekDTO.setWeekQuantity(sum / 52); strAvgMap.put(key, monthAndWeekDTO); } } } - avgMonthAndWeekGroupDTO.setMap(strAvgMap); - return ResponseData.success(avgMonthAndWeekGroupDTO); + strAvgMap.keySet().forEach(key -> { + resultList.add(strAvgMap.get(key)); + }); + return ResponseData.success(resultList); } /** @@ -181,12 +204,178 @@ } /** - * 员工考勤人数变化,功能待定 + * 员工考勤人数变化,统计当天(横坐标为时)及近7天(横坐标为天)的考勤人数变化,只要发生一次考勤识别,次数的基数就正常增加(没有上班下班区分) */ + @PostMapping("/staff/attendanceNumber/{dimension}") + @ResponseBody + public Object attendanceNumber(@PathVariable("dimension") String dimension) { + List attendanceNumberDTOs = null; + List> resultList = new ArrayList<>(); + if("week".equals(dimension)){ + //近7天数据按天分组统计 + attendanceNumberDTOs = attendanceInfoMapper.getCountForWeek(); + }else if("day".equals(dimension)) { + //今天数据按小时分组统计 + attendanceNumberDTOs = attendanceInfoMapper.getCountForDay(); + } + if(CollectionUtils.isEmpty(attendanceNumberDTOs)){ + return ResponseData.error("该查询条件下,无员工出勤数据!"); + } + Map> collect = attendanceNumberDTOs.stream().collect(Collectors.groupingBy(AttendanceNumberDTO::getDate)); + collect.keySet().forEach(key -> { + List attendanceNumberDTOS = collect.get(key); + AttendanceNumberDTO attendanceNumberDTO = attendanceNumberDTOS.get(0); + AttendanceNumberDTO attendanceNumberDTO2 = attendanceNumberDTOS.get(1); + Map resultMap = new HashMap<>(); + resultMap.put(attendanceNumberDTO.getStaffType(), attendanceNumberDTO.getQuantity()); + resultMap.put(attendanceNumberDTO2.getStaffType(), attendanceNumberDTO2.getQuantity()); + resultMap.put("staticTime", attendanceNumberDTO.getDate()); + resultList.add(resultMap); + }); + return ResponseData.success(resultList); + } /** - * 近30天/近一周安保人员到岗排行 + * 早晚高峰区域安防评估 */ + @PostMapping("/security/assessment/{dimension}") + @ResponseBody + public Object securityAssessment(@PathVariable("dimension") String dimension) { + //查询各危险级别权重、各类别权重,放入map,避免循环中多次查数据库 + HashMap hazardScoreMap = new HashMap<>(); + List caseHazardLevelList = hazardLevelMapper.getCaseHazardLevelList(null); + caseHazardLevelList.forEach(hazardLevel -> { + hazardScoreMap.put(hazardLevel.getCode(), hazardLevel.getWeight()); + }); + HashMap categoryScoreMap = new HashMap<>(); + List categoryLevelList = categoryLevelMapper.getCaseCategoryLevelList(null); + categoryLevelList.forEach(categoryLevel -> { + categoryScoreMap.put(categoryLevel.getCode(), categoryLevel.getWeight()); + }); + HashMap hashMap = new HashMap<>(); + if("week".equals(dimension)){ + //近7天早晚高峰数据 + List caseInfos = caseInfoMapper.selectListBySevenDay(); + //按时间(天)进行分组 + caseInfos.forEach(caseInfo -> { + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); + Double score = Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + String[] array = caseInfo.getHappenTime().split(" "); + String dayTime = array[0]; + BigDecimal preScore; + if(hashMap.containsKey(dayTime)){ + Double aDouble = hashMap.get(dayTime); + preScore = new BigDecimal(aDouble.toString()); + + }else{ + preScore = new BigDecimal("100.0"); + } + BigDecimal nowScore = new BigDecimal(score.toString()); + hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); + }); + return ResponseData.success(hashMap); + }else if("day".equals(dimension)) { + //今天数据按小时分组统计 + List caseInfos = caseInfoMapper.selectListByToday(); + caseInfos.forEach(caseInfo -> { + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); + Double score = Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + String[] array = caseInfo.getHappenTime().split(":"); + String dayTime = array[0]; + BigDecimal preScore; + if(hashMap.containsKey(dayTime)){ + Double aDouble = hashMap.get(dayTime); + preScore = new BigDecimal(aDouble.toString()); + + }else{ + preScore = new BigDecimal("100.0"); + } + BigDecimal nowScore = new BigDecimal(score.toString()); + hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); + }); + return ResponseData.success(hashMap); + } + return null; + } + + /** + * 重点区域安防事态评估,统计重点区域6:00-23:00按小时分组数据 + */ + @GetMapping("/security/keyAreaStatistic") + @ResponseBody + public Object keyAreaStatistic() { + //查询各危险级别权重、各类别权重,放入map,避免循环中多次查数据库 + HashMap hazardScoreMap = new HashMap<>(); + List caseHazardLevelList = hazardLevelMapper.getCaseHazardLevelList(null); + caseHazardLevelList.forEach(hazardLevel -> { + hazardScoreMap.put(hazardLevel.getCode(), hazardLevel.getWeight()); + }); + HashMap categoryScoreMap = new HashMap<>(); + List categoryLevelList = categoryLevelMapper.getCaseCategoryLevelList(null); + categoryLevelList.forEach(categoryLevel -> { + categoryScoreMap.put(categoryLevel.getCode(), categoryLevel.getWeight()); + }); + HashMap hashMap = new HashMap<>(); + //今天数据按小时分组统计 + List caseInfos = caseInfoMapper.selectListByToday2(); + caseInfos.forEach(caseInfo -> { + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); + Double score = Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + String[] array = caseInfo.getHappenTime().split(":"); + String dayTime = array[0]; + BigDecimal preScore; + if(hashMap.containsKey(dayTime)){ + Double aDouble = hashMap.get(dayTime); + preScore = new BigDecimal(aDouble.toString()); + + }else{ + preScore = new BigDecimal("100.0"); + } + BigDecimal nowScore = new BigDecimal(score.toString()); + hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); + }); + return ResponseData.success(hashMap); + } + + /** + * 安防机动支援力量调配响应评估,根据事件已解决状态及已解决时间-发送时间,按时间(小时)分组统计 + */ + @GetMapping("/security/responseAssess") + @ResponseBody + public Object responseAssess() { + //查询各危险级别权重、各类别权重,放入map,避免循环中多次查数据库 + HashMap hazardScoreMap = new HashMap<>(); + List caseHazardLevelList = hazardLevelMapper.getCaseHazardLevelList(null); + caseHazardLevelList.forEach(hazardLevel -> { + hazardScoreMap.put(hazardLevel.getCode(), hazardLevel.getWeight()); + }); + HashMap hashMap = new HashMap<>(); + //今天数据按小时分组统计 + List caseInfos = caseInfoMapper.selectListByToday3(); + caseInfos.forEach(caseInfo -> { + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + //扣分=事件级别权重*未解决小时数 + Date updateTime = DateUtil.parse(caseInfo.getUpdateTime()); + Date happenTime = DateUtil.parse(caseInfo.getHappenTime()); + long between = DateUtil.between(updateTime, happenTime, DateUnit.HOUR); + Double score = Double.valueOf(hazardWeight)*between; + String[] array = caseInfo.getHappenTime().split(":"); + String dayTime = array[0]; + BigDecimal preScore; + if(hashMap.containsKey(dayTime)){ + Double aDouble = hashMap.get(dayTime); + preScore = new BigDecimal(aDouble.toString()); + }else{ + preScore = new BigDecimal("100.0"); + } + BigDecimal nowScore = new BigDecimal(score.toString()); + hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); + }); + return ResponseData.success(hashMap); + } /** * 重点区域威胁事件类型统计,优先级2,统计近7天和近30天 @@ -224,7 +413,34 @@ } /** - * 设备状态计算系数和评判,优先级3,需确认设备恢复时间是否可以获取 + * 近30天/近一周安保人员到岗排行 */ + + /** + * 安保等级评估,发生离岗事件减1分 + */ + @GetMapping("/security/levelAssess") + @ResponseBody + public Object securityLevelAssess() { + //今天数据按小时分组统计 + List resultList = caseInfoMapper.selectListByType(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); + resultList.forEach(result -> { + BigDecimal deScore = new BigDecimal(result.getQuantity()); + BigDecimal preScore = new BigDecimal("100.0"); + result.setScore(preScore.subtract(deScore).doubleValue()); + }); + return ResponseData.success(resultList); + } + + /** + * 设备状态计算系数和评判,即设备维修管理查询(不分页) + */ + @PostMapping("/device/repairList") + @ResponseBody + public Object repairList(@RequestBody DeviceRepairRequest deviceRepairRequest) { + List deviceRepairLogDTOS = deviceInfoService.deviceRepairListPage(deviceRepairRequest); + return ResponseData.success(deviceRepairLogDTOS); + } + } 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 fbf8ab6..c71a15a 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 @@ -1,13 +1,12 @@ package com.casic.missiles.modular.controller.hik; +import cn.hutool.core.date.DateTime; +import cn.hutool.core.date.DateUtil; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.casic.missiles.model.response.ResponseData; import com.casic.missiles.modular.dao.HikFaceGroupInfoMapper; -import com.casic.missiles.modular.dto.hik.EventSubscribeRequest; -import com.casic.missiles.modular.dto.hik.FaceGroupAdditionRequest; -import com.casic.missiles.modular.dto.hik.HikRecvEvent; -import com.casic.missiles.modular.dto.hik.OrgBatchAdd; +import com.casic.missiles.modular.dto.hik.*; import com.casic.missiles.modular.enums.HikUri; import com.casic.missiles.modular.enums.SecurityEventType; import com.casic.missiles.modular.model.CaseInfo; @@ -18,16 +17,20 @@ import com.casic.missiles.modular.util.CaseInfoFactoryUtil; import com.casic.missiles.modular.util.HikUtil; import com.casic.missiles.modular.util.ThreadPoolUtil; +import com.casic.missiles.modular.util.WebSocket; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; -import org.springframework.web.bind.annotation.*; +import org.springframework.util.CollectionUtils; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.RestController; -import java.net.InetAddress; -import java.net.UnknownHostException; import java.util.ArrayList; +import java.util.Iterator; import java.util.List; import java.util.Objects; @@ -38,7 +41,6 @@ */ @Slf4j @RestController -@RequestMapping("/hik") public class HikController { @Autowired @@ -53,28 +55,37 @@ @Autowired private HikService hikService; + @Autowired + private HikFaceGroupInfoMapper hikFaceGroupInfoMapper; + + @Autowired + private WebSocket webSocket; + @Value("${server.port}") private int serverPort; - @Autowired - private HikFaceGroupInfoMapper hikFaceGroupInfoMapper; /** * 海康事件订阅 */ - @PostMapping("/event/subscribe") + @PostMapping("/hik/event/subscribe") @ResponseBody - public Object eventSubscribe() throws UnknownHostException { + public Object eventSubscribe() { EventSubscribeRequest eventSubscribeRequest = new EventSubscribeRequest(); ArrayList list = new ArrayList<>(); list.add(SecurityEventType.DEVICE_OFFLINE); + list.add(SecurityEventType.DEVICE_ONLINE); list.add(SecurityEventType.KEY_PERSONNEL_IDENTIFY_EVENT); list.add(SecurityEventType.MONITORING_POINT_OFFLINE); + list.add(SecurityEventType.MONITORING_POINT_ONLINE); list.add(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); list.add(SecurityEventType.PERSONNEL_GATHER_EVENT); - InetAddress localHost = InetAddress.getLocalHost(); + list.add(SecurityEventType.VISITOR_REGISTER); + list.add(SecurityEventType.VISITOR_CHECKOUT); + list.add(SecurityEventType.HIGH_ALTITUDE_PARABOLIC); +// InetAddress localHost = InetAddress.getLocalHost(); eventSubscribeRequest.setEventTypes(list); - eventSubscribeRequest.setEventDest("https://" + localHost + ":" + serverPort + "/eventRcv"); + eventSubscribeRequest.setEventDest("http://" + "192.168.10.6" + ":" + serverPort + "/eventRcv"); //订阅类型,0-订阅原始事件,1-联动事件,2-原始事件和联动事件,不填使用默认值0 eventSubscribeRequest.setSubType(0); /** @@ -92,19 +103,25 @@ } /** + * 查询事件订阅信息 + */ + @PostMapping("/hik/event/query") + @ResponseBody + public Object eventQuery() { + String result = HikUtil.hikApi(HikUri.EVENT_INFO, ""); + return result; + } + + /** * 海康事件接收 */ @PostMapping("/eventRcv") @ResponseBody public Object eventRcv(@RequestBody HikRecvEvent hikRecvEvent) { //1、接收所需事件类型 - Long eventType = hikRecvEvent.getEventType(); + Number eventType = hikRecvEvent.getEventType(); log.info("接收到安防事件类型为:{}", eventType); CaseInfo caseInfo = caseInfoFactoryUtil.getCaseInfo(eventType); - //接收到不关心事件直接返回 - if(Objects.isNull(caseInfo)){ - return ResponseData.success(); - } //2、不同事件不同处理,caseInfoFactoryUtil已设置好事件基础定义信息 // 再为事件添加状态、设备编码、设备名称、位置、区域、时间 // 异步处理事件 @@ -114,19 +131,23 @@ caseHandle(hikRecvEvent, eventType, caseInfo); } })); +// caseHandle(hikRecvEvent, eventType, caseInfo); - return null; + return ResponseData.success(); } - private void caseHandle(HikRecvEvent hikRecvEvent, Long eventType, CaseInfo caseInfo) { + private void caseHandle(HikRecvEvent hikRecvEvent, Number eventType, CaseInfo caseInfo) { JSONArray eventArray = hikRecvEvent.getEventArray(); List caseInfos = new ArrayList<>(); - while (eventArray.stream().iterator().hasNext()) { + Iterator iterator = eventArray.iterator(); + while (iterator.hasNext()) { CaseInfo caseInfo1 = new CaseInfo(); - BeanUtils.copyProperties(caseInfo, caseInfo1); - JSONObject event = (JSONObject) eventArray.stream().iterator().next(); + if(!Objects.isNull(caseInfo)){ + BeanUtils.copyProperties(caseInfo, caseInfo1); + } + JSONObject event = (JSONObject) iterator.next(); //5种事件进行不同处理 - if(SecurityEventType.KEY_PERSONNEL_IDENTIFY_EVENT == eventType){ + if (SecurityEventType.KEY_PERSONNEL_IDENTIFY_EVENT.equals(eventType)) { //判断所属人脸分组 JSONObject data = (JSONObject) event.get("data"); JSONObject faceRecognitionResult = (JSONObject) data.get("faceRecognitionResult"); @@ -142,52 +163,101 @@ if (faceGroupCode.equals(blackListGroup.getFaceGroupCode())) { //黑名单分组处理 caseInfo1 = hikService.blackListHandle(event, caseInfo1); - }else if(faceGroupCode.equals(propertyPersonnelGroup.getFaceGroupCode())){ + } else if (faceGroupCode.equals(propertyPersonnelGroup.getFaceGroupCode())) { //考勤分组处理-物业人员,添加到考勤表 hikService.propertyAttendanceHandle(event); - }else if(faceGroupCode.equals(securityPersonnelGroup.getFaceGroupCode())){ + } else if (faceGroupCode.equals(securityPersonnelGroup.getFaceGroupCode())) { //考勤分组处理-安保人员,添加到考勤表 hikService.securityPersonnelHandle(event); - }else { + } else { return; } - }else if(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT == eventType){ + } else if (SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT.equals(eventType)) { //离岗事件处理 caseInfo1 = hikService.demobilizedHandle(event, caseInfo1); - }else if(SecurityEventType.PERSONNEL_GATHER_EVENT == eventType){ + } else if (SecurityEventType.PERSONNEL_GATHER_EVENT.equals(eventType)) { //人员聚集事件处理 caseInfo1 = hikService.personGatherHandle(event, caseInfo1); - }else if(SecurityEventType.MONITORING_POINT_OFFLINE == eventType){ + } else if (SecurityEventType.MONITORING_POINT_OFFLINE.equals(eventType)) { //监控点离线事件处理 caseInfo1 = hikService.monitorPointOfflineHandle(event, caseInfo1); - }else if(SecurityEventType.DEVICE_OFFLINE == eventType){ + } else if (SecurityEventType.MONITORING_POINT_ONLINE.equals(eventType)) { + //监控点上线事件处理 + hikService.monitorPointOnlineHandle(event); + } else if (SecurityEventType.DEVICE_OFFLINE.equals(eventType)) { //装置离线事件处理 caseInfo1 = hikService.deviceOfflineHandle(event, caseInfo1); - }else if(SecurityEventType.VISITOR_REGISTER == eventType){ + } else if (SecurityEventType.DEVICE_ONLINE.equals(eventType)) { + //装置上线处理 + hikService.deviceOnlineHandle(event); + } else if (SecurityEventType.VISITOR_REGISTER.equals(eventType)) { //记录访客登记记录,添加到访客记录表 hikService.visitorRegisterHandler(event); - }else if(SecurityEventType.VISITOR_CHECKOUT == eventType){ + } else if (SecurityEventType.VISITOR_CHECKOUT.equals(eventType)) { //记录访客签离记录 hikService.visitorCheckOutHandler(event); } - if(!Objects.isNull(caseInfo1) && !StringUtils.isEmpty(caseInfo1.getHappenTime())){ + if (!Objects.isNull(caseInfo1) && !StringUtils.isEmpty(caseInfo1.getHappenTime())) { caseInfos.add(caseInfo1); } } //3、安防事件入库 - if(!caseInfoService.insertCaseInfoBatch(caseInfos)){ - log.error("安防事件批量入库异常"); + if (!CollectionUtils.isEmpty(caseInfos) && !caseInfoService.insertCaseInfoBatch(caseInfos)) { + log.error("安防事件批量入库异常!"); } // TODO: 2022/8/15 webSocket推送 + if (CollectionUtils.isEmpty(caseInfos)) { + log.info("webSocket事件推送"); + webSocket.sendAllMessage(JSONObject.toJSONString(caseInfos)); + } return; } /** + * 以图搜图,前端用于轨迹追踪 + */ + @PostMapping("/hik/search/picture") + @ResponseBody + public Object searchPictures(@RequestBody SearchPicturesRequest searchPicturesRequest) { + DateTime startDateTime = DateUtil.parse(searchPicturesRequest.getStartTime()); + DateTime endDateTime = DateUtil.parse(searchPicturesRequest.getEndTime()); + String startTime = DateUtil.format(startDateTime, "yyyy-MM-dd'T'HH:mm:ss.SSSXXX"); + String endTime = DateUtil.format(endDateTime, "yyyy-MM-dd'T'HH:mm:ss.SSSXXX"); + searchPicturesRequest.setStartTime(startTime); + searchPicturesRequest.setEndTime(endTime); + String body = JSONObject.toJSONString(searchPicturesRequest); + String resultStr = HikUtil.hikApi(HikUri.SEARCH_PICTURES, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (!"0".equals(resultJson.get("code"))) { + log.error("请求海康,以图搜图失败,海康response:{}", resultStr); + return ResponseData.error("以图搜图失败"); + } + return ResponseData.success(resultJson); + } + + + /** + * 海康事件取消订阅 + */ + @PostMapping("/hik/event/cancel") + @ResponseBody + public Object eventCancelSubscribe(@RequestBody CancelSubscribeRequest cancelSubscribeRequest) { + String body = JSONObject.toJSONString(cancelSubscribeRequest); + String resultStr = HikUtil.hikApi(HikUri.EVENT_CANCEL, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (!"0".equals(resultJson.get("code"))) { + log.error("请求海康,取消订阅失败,海康response:{}", resultStr); + return ResponseData.error("取消订阅失败"); + } + return ResponseData.success(resultJson); + } + + /** * 单个添加海康人脸分组 * api->hik单个添加人脸分组api->response->mysql */ - @PostMapping("/faceGroup/single/add") + @PostMapping("/hik/faceGroup/single/add") @ResponseBody public Object faceGroupAddition(@RequestBody FaceGroupAdditionRequest faceGroupAdditionRequest) { String body = JSONObject.toJSONString(faceGroupAdditionRequest); @@ -212,7 +282,7 @@ * 批量添加海康组织 * api->hik批量添加组织api->response */ - @PostMapping("/org/batch/add") + @PostMapping("/hik/org/batch/add") @ResponseBody public Object orgBatchAdd(@RequestBody List orgBatchAddRequest) { String body = JSONObject.toJSONString(orgBatchAddRequest); @@ -232,4 +302,62 @@ return ResponseData.error("批量添加组织失败"); } + /** + * 获取人员列表 + */ + @PostMapping("/hik/person/personList") + @ResponseBody + public Object personList() { + PersonListRequest request = new PersonListRequest(); + request.setPageNo(1); + request.setPageSize(100); + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi("/api/resource/v2/person/personList", body); + return resultStr; + } + + /** + * 获取组织列表 + */ + @PostMapping("/hik/org/orgList") + @ResponseBody + public Object orgList() { + PersonListRequest request = new PersonListRequest(); + request.setPageNo(1); + request.setPageSize(100); + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi("/api/resource/v1/org/orgList", body); + return resultStr; + } + + /** + * 查询访客权限下载记录 + */ + @PostMapping("/hik/auth/result") + @ResponseBody + public Object authResult() { + PersonListRequest request = new PersonListRequest(); + request.setPageNo(1); + request.setPageSize(100); + request.setOrderId("ba101db6246711edaea66f7939a13638"); + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi("/api/visitor/v1/auth/result", body); + return resultStr; + } + + /** + * 人脸图片获取 + */ + @PostMapping("/hik/face/picture") + @ResponseBody + public Object facePicture() { + FaceRequest request = new FaceRequest(); +// List list = new ArrayList<>(); +// list.add(""); + request.setCertificateNum("wanggong"); + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi("/api/frs/v1/face", body); + return resultStr; + } + } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/AssetInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/AssetInfoMapper.java index 4f64e83..c0684ee 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/AssetInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/AssetInfoMapper.java @@ -17,6 +17,6 @@ @Mapper public interface AssetInfoMapper extends BaseMapper { - List getAssetInfoListPage(@Param("page") Page page, AssetInfoRequest assetInfoRequest); + List getAssetInfoListPage(@Param("page") Page page, @Param("assetInfoRequest") AssetInfoRequest assetInfoRequest); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/AttendanceInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/AttendanceInfoMapper.java index f9e793e..ec87e46 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/AttendanceInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/AttendanceInfoMapper.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.statistics.AttendanceNumberDTO; import com.casic.missiles.modular.dto.statistics.AttendanceRatioDTO; import com.casic.missiles.modular.model.AttendanceInfo; import org.apache.ibatis.annotations.Mapper; @@ -17,7 +18,7 @@ */ @Mapper public interface AttendanceInfoMapper extends BaseMapper { - List getAttendanceInfoListPage(@Param("page") Page page, StaffInfoRequest attendanceInfoRequest); + List getAttendanceInfoListPage(@Param("page") Page page, @Param("attendanceInfoRequest") StaffInfoRequest attendanceInfoRequest); AttendanceInfo selectByCodeAndDate(@Param("staffCode") String staffCode); @@ -26,4 +27,8 @@ List getCountByTypeAndDateForMonth(@Param("staffType")String staffType); List getCountByTypeAndDateForYear(@Param("staffType")String staffType); + + List getCountForWeek(); + + List getCountForDay(); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java index ce94b8f..6137a7d 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java @@ -17,5 +17,5 @@ @Mapper public interface BlackInfoMapper extends BaseMapper { - List getBlackInfoListPage(@Param("page") Page page, BlackInfoRequest blackInfoRequest); + List getBlackInfoListPage(@Param("page") Page page, @Param("blackInfoRequest") BlackInfoRequest blackInfoRequest); } 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 efda6b3..50aaa6f 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 @@ -20,7 +20,7 @@ List getCaseInfoListPage(@Param("page") Page page, @Param("caseInfoRequest") CaseInfoRequest caseInfoRequest); - int updateStatusById(CaseInfoRequest caseInfoRequest); + int updateStatusById(@Param("caseInfoRequest") CaseInfoRequest caseInfoRequest); List selectByLevelAndMonth(@Param("year") String year); @@ -47,4 +47,20 @@ List selectPreWeekCountByThirtyDay(); List selectPreDayCountBySevenDay(); + + Integer selectDemobilizedCount(@Param("eventType") Number personnelDemobilizedEvent); + + List selectPreMonthCount(); + + List selectListBySevenDay(); + + List selectListByToday(); + + List selectListByToday2(); + + List selectListByToday3(); + + List selectListByType(@Param("eventType") Number eventType); + + List selectDemobilizedCountByHour(@Param("eventType") Number eventType); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/CategoryLevelMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/CategoryLevelMapper.java index 52fc714..afe1650 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/CategoryLevelMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/CategoryLevelMapper.java @@ -17,9 +17,9 @@ @Mapper public interface CategoryLevelMapper extends BaseMapper { - List getCaseCategoryLevelListPage(@Param("page") Page page, CategoryLevelRequest categoryLevelRequest); + List getCaseCategoryLevelListPage(@Param("page") Page page, @Param("categoryLevelRequest") CategoryLevelRequest categoryLevelRequest); - List getCaseCategoryLevelList(CategoryLevelRequest categoryLevelRequest); + List getCaseCategoryLevelList(@Param("categoryLevelRequest") CategoryLevelRequest categoryLevelRequest); CaseCategoryLevel getCaseCategoryLevel(@Param("categoryLevelCode") String categoryLevelCode); 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 66353b1..2555a09 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 @@ -19,7 +19,7 @@ @Mapper public interface DeviceInfoMapper extends BaseMapper { - List getDeviceInfoListPage(@Param("page") Page page, DeviceInfoRequest deviceInfoRequest); + List getDeviceInfoListPage(@Param("page") Page page, @Param("deviceInfoRequest") DeviceInfoRequest deviceInfoRequest); List getDeviceInfoList(@Param("deviceInfoRequest") DeviceInfoRequest deviceInfoRequest); @@ -27,6 +27,8 @@ DeviceInfo getByIndexCode(@Param("srcIndex") String srcIndex); + DeviceInfo getByIp(@Param("ip") String ip); + List selectIndexCodesByCodes(@Param("deviceCodes") List deviceCodes); List selectByType(@Param("devType") String devType); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java index 41dd0af..5bfaf63 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java @@ -5,6 +5,7 @@ import com.casic.missiles.modular.dto.DeviceRepairRequest; import com.casic.missiles.modular.model.DeviceRepairLog; import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; import java.util.List; @@ -16,7 +17,7 @@ @Mapper public interface DeviceRepairLogMapper extends BaseMapper { - List getDeviceRepairListPage(Page page, DeviceRepairRequest deviceRepairRequest); + List getDeviceRepairListPage(@Param("page") Page page, @Param("deviceRepairRequest")DeviceRepairRequest deviceRepairRequest); - List getDeviceRepairList(DeviceRepairRequest deviceRepairRequest); + List getDeviceRepairList(@Param("deviceRepairRequest") DeviceRepairRequest deviceRepairRequest); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java index 9035c47..4823ac1 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java @@ -18,7 +18,7 @@ @Mapper public interface FireEquipInfoMapper extends BaseMapper { - List getFireEquipInfoListPage(@Param("page") Page page, FireEquipRequest fireEquipRequest); + List getFireEquipInfoListPage(@Param("page") Page page, @Param("fireEquipRequest") FireEquipRequest fireEquipRequest); FireEquipInfo getFireEquipInfo(@Param("equipCode") String equipCode); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/GateGroupMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/GateGroupMapper.java index d8c330d..977a427 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/GateGroupMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/GateGroupMapper.java @@ -17,7 +17,7 @@ */ @Mapper public interface GateGroupMapper extends BaseMapper { - List getGateGroupListPage(@Param("page") Page page, GateGroupRequest gateGroupRequest); + List getGateGroupListPage(@Param("page") Page page, @Param("gateGroupRequest") GateGroupRequest gateGroupRequest); GateGroup getGateGroupByName(@Param("groupName") String groupName); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/HazardLevelMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/HazardLevelMapper.java index 8957780..dcf47bb 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/HazardLevelMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/HazardLevelMapper.java @@ -17,11 +17,13 @@ @Mapper public interface HazardLevelMapper extends BaseMapper { - List getCaseHazardLevelListPage(@Param("page") Page page, HazardLevelRequest hazardLevelRequest); + List getCaseHazardLevelListPage(@Param("page") Page page, @Param("hazardLevelRequest") HazardLevelRequest hazardLevelRequest); - List getCaseHazardLevelList(HazardLevelRequest hazardLevelRequest); + List getCaseHazardLevelList(@Param("hazardLevelRequest") HazardLevelRequest hazardLevelRequest); CaseHazardLevel getCaseHazardLevel(@Param("hazardLevelCode") String hazardLevelCode); List selectHazardName(); + + String selectHazardNameByCode(@Param("hazardLevelCode") String hazardLevelCode); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/HikCaseDefineMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/HikCaseDefineMapper.java index 0dc47d1..f162fef 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/HikCaseDefineMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/HikCaseDefineMapper.java @@ -12,5 +12,5 @@ */ @Mapper public interface HikCaseDefineMapper extends BaseMapper { - HikCaseDefine getHikCaseDefine(@Param("caseTypeCode") Long caseTypeCode); + HikCaseDefine getHikCaseDefine(@Param("caseTypeCode") Number caseTypeCode); } 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 f8a674c..fe5afc2 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 @@ -17,11 +17,13 @@ @Mapper public interface StaffInfoMapper extends BaseMapper { - List getStaffInfoListPage(@Param("page") Page page, StaffInfoRequest staffInfoRequest); + List getStaffInfoListPage(@Param("page") Page page, @Param("staffInfoRequest") StaffInfoRequest staffInfoRequest); StaffInfo selectByCode(@Param("staffCode") String staffCode); - List getStaffInfoList(StaffInfoRequest staffInfoRequest); + List getStaffInfoList(@Param("staffInfoRequest") StaffInfoRequest staffInfoRequest); - List selectBatchCodes(List list); + List selectBatchCodes(@Param("list") List list); + + int updateByCodeForCard(@Param("staffCode") String staffCode, @Param("cardNo") String cardNo); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitInfoMapper.java index b1217c5..6c52542 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitInfoMapper.java @@ -16,7 +16,7 @@ */ @Mapper public interface VisitInfoMapper extends BaseMapper { - List getVisitInfoListPage(@Param("page") Page page, VisitorRequest visitorRequest); + List getVisitInfoListPage(@Param("page") Page page, @Param("visitorRequest") VisitorRequest visitorRequest); VisitInfo selectByOrderId(@Param("orderId") String orderId); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitorApplyMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitorApplyMapper.java index c09f3c0..6ea55bd 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitorApplyMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitorApplyMapper.java @@ -18,7 +18,7 @@ @Mapper public interface VisitorApplyMapper extends BaseMapper { - List getVisitorApplyListPage(@Param("page") Page page, VisitorApplyRequest visitorApplyRequest); + List getVisitorApplyListPage(@Param("page") Page page, @Param("visitorApplyRequest") VisitorApplyRequest visitorApplyRequest); List selectByVisitReason(); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/AttendanceInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/AttendanceInfoMapper.xml index b2ece71..f8bdd6e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/AttendanceInfoMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/AttendanceInfoMapper.xml @@ -43,7 +43,8 @@ and staff_type = #{staffType} - and YEARWEEK(date_format(atte_date, '%Y-%m-%d'), 1) = YEARWEEK(now(),1); + AND DATE_SUB(CURDATE(), INTERVAL 7 DAY) <= DATE(atte_date) + GROUP BY DATE_FORMAT(atte_date, '%Y-%m-%d') @@ -69,4 +70,20 @@ GROUP BY DATE_FORMAT(atte_date, '%Y-%m') + + + \ No newline at end of file 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 2b6953f..06ec0a8 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 @@ -28,7 +28,9 @@ @@ -87,7 +89,8 @@ SELECT hazard_level_code as levelCode, count(id) as quantity FROM bus_case_info WHERE hazard_level_code is not null - AND DATE_SUB(CURDATE(), INTERVAL 7 DAY) <= date(happen_time); + AND is_key_area = 1 + AND DATE_SUB(CURDATE(), INTERVAL 7 DAY) <= date(happen_time) GROUP BY hazard_level_code @@ -95,7 +98,8 @@ SELECT hazard_level_code as levelCode, count(id) as quantity FROM bus_case_info WHERE hazard_level_code is not null - AND DATE_SUB(CURDATE(), INTERVAL 30 DAY) <= date(happen_time); + AND is_key_area = 1 + AND DATE_SUB(CURDATE(), INTERVAL 30 DAY) <= date(happen_time) GROUP BY hazard_level_code @@ -122,4 +126,71 @@ AND hazard_level_code is not null GROUP BY DATE_FORMAT(happen_time,'%Y-%m-%d') + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/CategoryLevelMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/CategoryLevelMapper.xml index 4670b1f..1d25cbd 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/CategoryLevelMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/CategoryLevelMapper.xml @@ -20,11 +20,11 @@ SELECT * FROM bus_case_category_level WHERE 1=1 - - and code = #{code} + + and code = #{categoryLevelRequest.code} - - and name = #{name} + + and name = #{categoryLevelRequest.name} ORDER by create_time DESC 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 9b66fd8..bfd84b7 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 @@ -98,4 +98,10 @@ #{item} + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceRepairLogMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceRepairLogMapper.xml index 078ed3c..cf1a481 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceRepairLogMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceRepairLogMapper.xml @@ -22,14 +22,14 @@ SELECT * FROM bus_device_repair_log WHERE 1=1 - - and device_code = #{devCode} + + and device_code = #{deviceRepairRequest.devCode} - - and device_name = #{devName} + + and device_name = #{deviceRepairRequest.devName} - - and DATE_FORMAT(create_time,"%y%m%d") = DATE_FORMAT(#{createTime},"%y%m%d") + + and DATE_FORMAT(create_time,"%y%m%d") = DATE_FORMAT(#{deviceRepairRequest.createTime},"%y%m%d") ORDER by create_time DESC diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/HazardLevelMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/HazardLevelMapper.xml index f16f2b9..458322b 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/HazardLevelMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/HazardLevelMapper.xml @@ -20,11 +20,11 @@ SELECT * FROM bus_case_hazard_level WHERE 1=1 - - and code = #{code} + + and code = #{hazardLevelRequest.code} - - and name = #{name} + + and name = #{hazardLevelRequest.name} ORDER by create_time DESC @@ -42,4 +42,10 @@ SELECT name FROM bus_case_hazard_level + + \ 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 557237e..b6a183a 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 @@ -50,4 +50,10 @@ + + + UPDATE bus_staff_info + SET card_no = #{cardNo} + WHERE staff_code = #{staffCode} + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitInfoMapper.xml index 84aa84f..230529a 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitInfoMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitInfoMapper.xml @@ -27,5 +27,6 @@ SELECT * FROM bus_visit_info WHERE order_id = #{orderId} and DATE_FORMAT(in_time,'%Y-%m-%d') = CURRENT_DATE + limit 1 \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/BlackPictureRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/BlackPictureRequest.java new file mode 100644 index 0000000..fc92701 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/BlackPictureRequest.java @@ -0,0 +1,14 @@ +package com.casic.missiles.modular.dto; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/29 19:26 + */ +@Data +public class BlackPictureRequest { + private String picUri; + private String serverIndexCode; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/CancelSubscribeRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/CancelSubscribeRequest.java new file mode 100644 index 0000000..e2d390a --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/CancelSubscribeRequest.java @@ -0,0 +1,15 @@ +package com.casic.missiles.modular.dto.hik; + +import lombok.Data; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/24 15:14 + */ +@Data +public class CancelSubscribeRequest { + private List eventTypes; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/CardInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/CardInfo.java new file mode 100644 index 0000000..341457d --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/CardInfo.java @@ -0,0 +1,24 @@ +package com.casic.missiles.modular.dto.hik; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/26 16:08 + */ +@Data +public class CardInfo { + //卡号,8~20个字符,支持数字和大写字母 + private String cardNo; + //人员ID,员工工号 + private String personId; + //人员所属组织IndexCode + private String orgIndexCode; + //卡片类型,默认是1:IC卡 + //1:IC卡 + //2:CPU卡 + //3:远距离卡 + //4:MIFARE卡 + private Number cardType; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/FaceRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/FaceRequest.java new file mode 100644 index 0000000..edc04bf --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/FaceRequest.java @@ -0,0 +1,16 @@ +package com.casic.missiles.modular.dto.hik; + +import lombok.Data; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/25 16:53 + */ +@Data +public class FaceRequest { + private String certificateNum; + private List indexCodes; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/HikRecvEvent.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/HikRecvEvent.java index a3e9845..1b2b2b1 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/HikRecvEvent.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/HikRecvEvent.java @@ -28,12 +28,12 @@ /** * 事件类型,用于判断所需接收到的事件类型 */ - public Long getEventType(){ + public Number getEventType(){ JSONObject jsonObject = (JSONObject)JSONObject.toJSON(params); //事件类别对应SecurityEventTypeEnum JSONArray eventTypeArray = (JSONArray)jsonObject.get("events"); JSONObject eventJsonObject = (JSONObject)JSONObject.toJSON(eventTypeArray.get(0)); - Long eventType = (Long) eventJsonObject.get("eventType"); + Number eventType = (Number) eventJsonObject.get("eventType"); return eventType; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonBatchDeleteRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonBatchDeleteRequest.java index 027d31d..9751929 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonBatchDeleteRequest.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonBatchDeleteRequest.java @@ -12,4 +12,6 @@ @Data public class PersonBatchDeleteRequest { private List personIds; + //删除人脸接口使用 + private String faceId; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonInfoRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonInfoRequest.java new file mode 100644 index 0000000..05dc9e1 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonInfoRequest.java @@ -0,0 +1,20 @@ +package com.casic.missiles.modular.dto.hik; + +import lombok.Data; + +import java.util.List; + +/** + * @Description: 获取员工照片请求实体 + * @Author: wangpeng + * @Date: 2022/8/25 16:53 + */ +@Data +public class PersonInfoRequest { + //获取员工详细信息使用 + private String paramName; + private List paramValue; + //获取照片使用 + private String picUri; + private String serverIndexCode; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonListRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonListRequest.java new file mode 100644 index 0000000..3f7149b --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonListRequest.java @@ -0,0 +1,16 @@ +package com.casic.missiles.modular.dto.hik; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/25 16:53 + */ +@Data +public class PersonListRequest { + private Number pageNo; + private Number pageSize; + + private String orderId; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/SearchPicturesRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/SearchPicturesRequest.java new file mode 100644 index 0000000..0a95966 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/SearchPicturesRequest.java @@ -0,0 +1,24 @@ +package com.casic.missiles.modular.dto.hik; + +import lombok.Data; + +import java.util.List; + +/** + * @Description: 以图搜图请求 + * @Author: wangpeng + * @Date: 2022/8/29 10:46 + */ +@Data +public class SearchPicturesRequest { + private String facePicBinaryData; + private String facePicUrl; + private List cameraIndexCodes; + private String startTime; + private String endTime; + //指定搜图的最小相似度,最小为1,最大为100 + private String minSimilarity; + private Number age; + //male-男性,female-女性 + private String sex; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/StaffCardRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/StaffCardRequest.java new file mode 100644 index 0000000..4052e6d --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/StaffCardRequest.java @@ -0,0 +1,20 @@ +package com.casic.missiles.modular.dto.hik; + +import lombok.Data; + +import java.util.List; + +/** + * @Description: 人员开卡请求实体 + * @Author: wangpeng + * @Date: 2022/8/26 16:05 + */ +@Data +public class StaffCardRequest { + //卡片开始有效时间,时间格式:yyyy-MM-dd + private String startDate; + //卡片截止有效时间,时间格式:yyyy-MM-dd,不能大于2037年12月31日 + private String endDate; + //cardList,待开卡列表,最大支持50张卡 + private List cardList; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/VisitorInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/VisitorInfo.java index 73aa316..b99f301 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/VisitorInfo.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/VisitorInfo.java @@ -14,7 +14,7 @@ //访客性别 //1: 男 //2: 女 - private String gender; + private Integer gender; //联系电话建议填写手机号码 private String phoneNo; //证件类型 diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/ApplyReasonGroupDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/ApplyReasonGroupDTO.java index 514f382..786143e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/ApplyReasonGroupDTO.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/ApplyReasonGroupDTO.java @@ -13,4 +13,6 @@ private String visitReason; //访问人数 private Integer quantity; + //占比 + private String ratio; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/AttendanceNumberDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/AttendanceNumberDTO.java new file mode 100644 index 0000000..a494321 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/AttendanceNumberDTO.java @@ -0,0 +1,24 @@ +package com.casic.missiles.modular.dto.statistics; + +import com.fasterxml.jackson.annotation.JsonIgnore; +import lombok.Data; + +/** + * @Description: 出勤人数统计实体 + * @Author: wangpeng + * @Date: 2022/8/31 19:24 + */ +@Data +public class AttendanceNumberDTO { + //日期维度,周、今日,入参 + @JsonIgnore + private String dateDimension; + + //日期,具体天/小时,出参 + private String date; + //出勤人数 + private String quantity; + //员工类型 + private String staffType; + +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/AvgMonthAndWeekGroupDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/AvgMonthAndWeekGroupDTO.java index 4366916..331a9a9 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/AvgMonthAndWeekGroupDTO.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/AvgMonthAndWeekGroupDTO.java @@ -2,8 +2,6 @@ import lombok.Data; -import java.util.Map; - /** * @Description: 平均每月和每周的数据实体 * @Author: wangpeng @@ -13,6 +11,4 @@ public class AvgMonthAndWeekGroupDTO { //入参 private String year; - //出参,key:事件类型,value:周和月数据平均值 - private Map map; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/GateStatusGroupResponse.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/GateStatusGroupResponse.java new file mode 100644 index 0000000..d16f4e5 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/GateStatusGroupResponse.java @@ -0,0 +1,16 @@ +package com.casic.missiles.modular.dto.statistics; + +import lombok.Data; + +/** + * @Description: 闸机/摄像机统计响应实体 + * @Author: wangpeng + * @Date: 2022/8/30 14:22 + */ +@Data +public class GateStatusGroupResponse { + //设备状态 + private String status; + //占比 + private String ratio; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/MonthAndWeekDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/MonthAndWeekDTO.java index 7482b2a..284115a 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/MonthAndWeekDTO.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/MonthAndWeekDTO.java @@ -9,7 +9,7 @@ */ @Data public class MonthAndWeekDTO { -// private String levelName; + private String levelName; private Integer monthQuantity; private Integer weekQuantity; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/OnDutyRatioDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/OnDutyRatioDTO.java new file mode 100644 index 0000000..4f6a65d --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/OnDutyRatioDTO.java @@ -0,0 +1,15 @@ +package com.casic.missiles.modular.dto.statistics; + +import lombok.Data; + +/** + * @Description: 在岗率统计实体 + * @Author: wangpeng + * @Date: 2022/9/2 21:24 + */ +@Data +public class OnDutyRatioDTO { + private String date; + private String quantity; + private String ratio; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/SecurityLevelAssessDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/SecurityLevelAssessDTO.java new file mode 100644 index 0000000..40a0738 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/SecurityLevelAssessDTO.java @@ -0,0 +1,15 @@ +package com.casic.missiles.modular.dto.statistics; + +import lombok.Data; + +/** + * @Description: 出勤人数统计实体 + * @Author: wangpeng + * @Date: 2022/8/31 19:24 + */ +@Data +public class SecurityLevelAssessDTO { + private String date; + private String quantity; + private Double score; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/SecurityScoreDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/SecurityScoreDTO.java index 304d169..f7bd4a2 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/SecurityScoreDTO.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/SecurityScoreDTO.java @@ -14,5 +14,5 @@ //楼层,出参 private String area; //评分,出参 - private String score; + private Double score; } 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 6a30786..e5e613d 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 @@ -8,6 +8,10 @@ public interface HikUri { //事件订阅 String EVENT_SUBSCRIBE = "/api/eventService/v1/eventSubscriptionByEventTypes"; + //事件订阅信息查询 + String EVENT_INFO = "/api/eventService/v1/eventSubscriptionView"; + //事件订阅取消 + String EVENT_CANCEL = "/api/eventService/v1/eventUnSubscriptionByEventTypes"; //预约免登记 String APPOINTMENT_FREE_REGISTER = "/api/visitor/v1/appointment/registration"; //修改访客预约 @@ -32,8 +36,18 @@ String PERSON_SINGLE_UPDATE = "/api/resource/v1/person/single/update"; //批量删除人员 String PERSON_BATCH_DELETE = "/api/resource/v1/person/batch/delete"; + //根据人脸Id删除人脸 + String PERSON_SINGLE_DELETE = "/api/resource/v1/face/single/delete"; //门禁点反控 String DOOR_CONTROL = "/api/acs/v1/door/doControl"; //查询海康门禁点事件v2 String DOOR_EVENTS = "/api/acs/v2/door/events"; + //批量开卡 + String CARD_BINDING = "/api/cis/v1/card/binding"; + //提取人员照片 + String PERSON_PICTURE = "/api/resource/v1/person/picture"; + //根据人员唯一字段获取人员详细信息 + String PERSON_INFO = "/api/resource/v1/person/condition/personInfo"; + //以图搜图 + String SEARCH_PICTURES = "/api/frs/v1/application/captureSearch"; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/enums/SecurityEventType.java b/casic-server/src/main/java/com/casic/missiles/modular/enums/SecurityEventType.java index d51034c..42eacf8 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/enums/SecurityEventType.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/enums/SecurityEventType.java @@ -14,18 +14,27 @@ Number PERSONNEL_GATHER_EVENT = 131593; //监控点离线事件 Number MONITORING_POINT_OFFLINE = 889196545; + //监控点上线事件 + Number MONITORING_POINT_ONLINE = 889196546; //装置离线 Number DEVICE_OFFLINE = 199710; + //装置连线 + Number DEVICE_ONLINE = 199711; //访客登记 Number VISITOR_REGISTER = 1392513025; //访客签离 Number VISITOR_CHECKOUT = 1392513026; + //高空抛物 + Number HIGH_ALTITUDE_PARABOLIC = 930335; + //下面两个查询海康门禁点事件使用 //合法卡比对通过 Number CARD_COMPARE_PASS = 198914; //人脸认证通过 Number FACE_COMPARE_PASS = 196893; + + // //正常开门 // Number NORMAL_OPENING = 198913; // //按钮开门 @@ -46,7 +55,6 @@ // Number FIREWORKS_DETECTION = 192514; // //陌生人识别事件 // Number STRANGER_RECOGNITION = 1644171265; -// //高空抛物 -// Number HIGH_ALTITUDE_PARABOLIC = 930335; + } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/job/CockpitJob.java b/casic-server/src/main/java/com/casic/missiles/modular/job/CockpitJob.java index 7490a27..85dd016 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/job/CockpitJob.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/job/CockpitJob.java @@ -79,14 +79,6 @@ } }); } - } - /** - * 机动力量实时在岗率,在岗人数除以总应在岗人数,功能待定 - */ -// @Scheduled(cron = "0 0/1 * * * ?") - public void BeOnDutyRatio() { - - } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/service/HikCaseDefineService.java b/casic-server/src/main/java/com/casic/missiles/modular/service/HikCaseDefineService.java index d9bb3a9..18e2936 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/service/HikCaseDefineService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/service/HikCaseDefineService.java @@ -9,5 +9,5 @@ * @Date: 2022/7/21 17:20 */ public interface HikCaseDefineService extends IService { - HikCaseDefine getHikCaseDefine(Long caseTypeCode); + HikCaseDefine getHikCaseDefine(Number caseTypeCode); } 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 dd24101..bcc3b5d 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 @@ -18,6 +18,8 @@ CaseInfo monitorPointOfflineHandle(JSONObject event, CaseInfo caseInfo); + void monitorPointOnlineHandle(JSONObject event); + CaseInfo deviceOfflineHandle(JSONObject event, CaseInfo caseInfo); void propertyAttendanceHandle(JSONObject event); @@ -27,4 +29,6 @@ void visitorRegisterHandler(JSONObject event); void visitorCheckOutHandler(JSONObject event); + + void deviceOnlineHandle(JSONObject event); } 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 e55c016..01870bd 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.StaffCardRequest; import com.casic.missiles.modular.model.StaffInfo; import java.util.List; @@ -28,4 +29,6 @@ StaffInfo selectStaffInfoByCode(StaffInfo staffInfo); List staffInfoList(StaffInfoRequest staffInfoRequest); + + int saveCardInfo(StaffCardRequest staffCardRequest); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/service/impl/BlackInfoServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/service/impl/BlackInfoServiceImpl.java index 8f47b37..981b4cd 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/service/impl/BlackInfoServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/service/impl/BlackInfoServiceImpl.java @@ -17,7 +17,6 @@ import com.casic.missiles.modular.model.BlackInfo; import com.casic.missiles.modular.model.HikFaceGroupInfo; import com.casic.missiles.modular.service.BlackInfoService; -import com.casic.missiles.modular.system.service.ICasicFileService; import com.casic.missiles.modular.util.HikUtil; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; @@ -43,9 +42,6 @@ private HikFaceGroupInfoMapper hikFaceGroupInfoMapper; @Resource - private ICasicFileService fileService; - - @Resource private AbstractDictService dictService; @Override @@ -90,9 +86,6 @@ //设置海康人脸唯一标识、人脸分组唯一标识 blackInfo.setIndexCode(String.valueOf(dataJson.get("indexCode"))); blackInfo.setFaceGroupIndexCode(String.valueOf(dataJson.get("faceGroupIndexCode"))); - //保存图片到本地 - String picUrl = fileService.saveFile(blackInfo.getPicture()); - blackInfo.setPicture(picUrl); //插入数据库 if(blackInfoMapper.insert(blackInfo) > 0){ return ResponseData.success(); @@ -141,8 +134,6 @@ log.error("请求海康,单个修改人脸失败,海康response:{}", resultStr); return ResponseData.error("单个修改人脸失败"); } - String picUrl = fileService.saveFile(blackInfo.getPicture()); - blackInfo.setPicture(picUrl); if(blackInfoMapper.updateById(blackInfo) > 0){ return ResponseData.success(); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/service/impl/CockpitServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/service/impl/CockpitServiceImpl.java index 6e6076e..7402991 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/service/impl/CockpitServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/service/impl/CockpitServiceImpl.java @@ -4,15 +4,12 @@ import cn.hutool.core.date.DateUtil; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.core.application.service.AbstractDictService; import com.casic.missiles.modular.dto.hik.DoorEventsRequest; import com.casic.missiles.modular.enums.HikUri; -import com.casic.missiles.modular.enums.SecurityEventDict; import com.casic.missiles.modular.enums.SecurityEventType; import com.casic.missiles.modular.service.CockpitService; import com.casic.missiles.modular.util.HikUtil; import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.*; @@ -25,8 +22,6 @@ @Slf4j @Service public class CockpitServiceImpl implements CockpitService { - @Autowired - private AbstractDictService dictService; @Override public HashMap dataHandle(DoorEventsRequest doorEventsRequest, HashMap> configMap, HashMap jsonMap, HashMap resultMap) { @@ -36,8 +31,8 @@ Date date = new Date(); DateTime startTimeDate = DateUtil.beginOfDay(date); DateTime endTimeDate = DateUtil.endOfDay(date); - String startTime = DateUtil.format(startTimeDate, "yyyy-MM-dd'T'HH:mm:ss'Z'"); - String endTime = DateUtil.format(endTimeDate, "yyyy-MM-dd'T'HH:mm:ss'Z'"); + String startTime = DateUtil.format(startTimeDate, "yyyy-MM-dd'T'HH:mm:ssXXX"); + String endTime = DateUtil.format(endTimeDate, "yyyy-MM-dd'T'HH:mm:ssXXX"); configMap.keySet().stream().forEach(key -> { List doorIndexCodes = configMap.get(key); doorEventsRequest.setPageNo(1); @@ -95,8 +90,9 @@ return; } Integer num = 0; - while (list.stream().iterator().hasNext()) { - JSONObject next = (JSONObject) list.stream().iterator().next(); + Iterator iterator = list.stream().iterator(); + while (iterator.hasNext()) { + JSONObject next = (JSONObject) iterator.next(); Integer inAndOutType = next.getInteger("inAndOutType"); //进门 if (1 == inAndOutType) { @@ -105,8 +101,8 @@ --num; } } - String dictName = dictService.getDictNameByCode(SecurityEventDict.DEVICE_POSITION, String.valueOf(key)); - resultMap.put(dictName, num); +// String dictName = dictService.getDictNameByCode(SecurityEventDict.DEVICE_POSITION, String.valueOf(key)); + resultMap.put(String.valueOf(key), num); }); return resultMap; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/service/impl/HikCaseDefineServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/service/impl/HikCaseDefineServiceImpl.java index 98ab2a4..1a59c7e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/service/impl/HikCaseDefineServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/service/impl/HikCaseDefineServiceImpl.java @@ -16,7 +16,7 @@ private HikCaseDefineMapper hikCaseDefineMapper; @Override - public HikCaseDefine getHikCaseDefine(Long caseTypeCode) { + public HikCaseDefine getHikCaseDefine(Number caseTypeCode) { return hikCaseDefineMapper.getHikCaseDefine(caseTypeCode); } } 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 b47f78f..dbad48f 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 @@ -58,10 +58,16 @@ 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.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; } @@ -76,10 +82,16 @@ 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.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; } @@ -94,10 +106,16 @@ 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.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; } @@ -109,24 +127,44 @@ 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()); //事件状态(未解决的字典值) + // TODO: 2022/7/28 事件状态字典值选择 + caseInfo.setStatus(dict.get(0).getCode()); //事件状态("未解决"的字典值) DeviceInfo deviceInfo = deviceInfoMapper.getByIndexCode(srcIndex); + if(Objects.isNull(deviceInfo)){ + log.info("接收到监控点离线事件,但数据库中无该事件发生的设备信息"); + return caseInfo; + } 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()); //更新设备状态 // TODO: 2022/7/28 设备离线字典值选择 -// deviceInfo.setStatus(); + List deviceDict = dictService.findInDictByCode(SecurityEventDict.DEVICE_STATUS); + deviceInfo.setStatus(deviceDict.get(1).getCode()); if(deviceInfoMapper.updateById(deviceInfo) <= 0){ + log.error("海康回调,更新监控点离线线状态失败!"); return null; } return caseInfo; } @Override + public void monitorPointOnlineHandle(JSONObject event) { + String srcIndex = event.getString("srcIndex"); + DeviceInfo deviceInfo = deviceInfoMapper.getByIndexCode(srcIndex); + // TODO: 2022/7/28 设备在线字典值选择 + List deviceDict = dictService.findInDictByCode(SecurityEventDict.DEVICE_STATUS); + deviceInfo.setStatus(deviceDict.get(0).getCode()); + if(deviceInfoMapper.updateById(deviceInfo) <= 0){ + log.error("海康回调,更新监控点在线状态失败!"); + } + } + + @Override public CaseInfo deviceOfflineHandle(JSONObject event, CaseInfo caseInfo) { //加入到安防事件 String srcIndex = event.getString("srcIndex"); //海康资源唯一标识 @@ -138,19 +176,40 @@ 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.setDeviceCode(deviceInfo.getDevCode()); //设备code caseInfo.setDevName(deviceInfo.getDevName()); //设备名 caseInfo.setPosition(deviceInfo.getPosition()); //事件位置 caseInfo.setArea(deviceInfo.getArea()); //区域 + caseInfo.setIsKeyArea(deviceInfo.getIsKeyArea()); + caseInfo.setDetailLocation(deviceInfo.getDetailLocation()); //更新设备状态 // TODO: 2022/7/28 设备离线字典值选择 -// deviceInfo.setStatus(); + List deviceDict = dictService.findInDictByCode(SecurityEventDict.DEVICE_STATUS); + deviceInfo.setStatus(deviceDict.get(1).getCode()); if(deviceInfoMapper.updateById(deviceInfo) <= 0){ + log.error("海康回调,更新设备离线状态失败!"); return null; } return caseInfo; } + + @Override + public void deviceOnlineHandle(JSONObject event) { + String srcIndex = event.getString("srcIndex"); + DeviceInfo deviceInfo = deviceInfoMapper.getByIndexCode(srcIndex); + // TODO: 2022/7/28 设备在线字典值选择 + List deviceDict = dictService.findInDictByCode(SecurityEventDict.DEVICE_STATUS); + deviceInfo.setStatus(deviceDict.get(0).getCode()); + if(deviceInfoMapper.updateById(deviceInfo) <= 0){ + log.error("海康回调,更新门禁点装置在线状态失败!"); + } + } + @Override public void propertyAttendanceHandle(JSONObject event) { String srcIndex = event.getString("srcIndex"); @@ -182,8 +241,9 @@ info.setStaffName(staffInfo.getStaffName()); info.setStaffGender(staffInfo.getStaffGender()); // TODO: 2022/7/29 物业人员字典值选择 -// info.setStaffType(); -// info.setStaffTypeName(); + List staffDict = dictService.findInDictByCode(SecurityEventDict.STAFF_TYPE); + info.setStaffType(staffDict.get(0).getCode()); + info.setStaffTypeName(staffDict.get(0).getName()); info.setAtteDate(DateUtil.today()); info.setAtteStartTime(happenTime); info.setAtteStartDev(deviceInfo.getDevCode()); @@ -226,8 +286,9 @@ info.setStaffName(staffInfo.getStaffName()); info.setStaffGender(staffInfo.getStaffGender()); // TODO: 2022/7/29 安保人员字典值选择 -// info.setStaffType(); -// info.setStaffTypeName(); + List staffDict = dictService.findInDictByCode(SecurityEventDict.STAFF_TYPE); + info.setStaffType(staffDict.get(1).getCode()); + info.setStaffTypeName(staffDict.get(1).getName()); info.setAtteDate(DateUtil.today()); info.setAtteStartTime(happenTime); info.setAtteStartDev(deviceInfo.getDevCode()); @@ -259,8 +320,12 @@ visitInfo.setVisitReason(data.getString("purpose")); visitInfo.setPicUri(data.getString("captureUrl")); visitInfo.setServerIndexCode(data.getString("svrIndexCode")); - visitInfo.setVisitPosition(deviceInfo.getPosition()); - + visitInfo.setOrderId(data.getString("visitorId")); + if(!Objects.isNull(deviceInfo)){ + visitInfo.setVisitPosition(deviceInfo.getPosition()); + } else{ + log.info("识别访客的门禁不在数据库中"); + } if(visitInfoMapper.insert(visitInfo) <= 0){ log.error("新增访客记录异常"); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/BlackListController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/BlackListController.java index a27f9f8..0c06661 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/BlackListController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/BlackListController.java @@ -1,13 +1,18 @@ package com.casic.missiles.modular.controller; +import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.base.controller.ExportController; import com.casic.missiles.core.page.PageFactory; import com.casic.missiles.model.response.ResponseData; import com.casic.missiles.modular.dto.BlackInfoRequest; +import com.casic.missiles.modular.dto.BlackPictureRequest; +import com.casic.missiles.modular.dto.hik.PersonInfoRequest; +import com.casic.missiles.modular.enums.HikUri; import com.casic.missiles.modular.enums.OperateTypeEnum; import com.casic.missiles.modular.model.BlackInfo; import com.casic.missiles.modular.service.BlackInfoService; +import com.casic.missiles.modular.util.HikUtil; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; @@ -56,4 +61,22 @@ return null; } + /** + * 黑名单人员照片 + */ + @PostMapping("/personPicture") + @ResponseBody + public Object personPicture(@RequestBody BlackPictureRequest blackPictureRequest){ + //获取照片 + String picUri = blackPictureRequest.getPicUri(); + String serverIndexCode = blackPictureRequest.getServerIndexCode(); + PersonInfoRequest picRequest = new PersonInfoRequest(); + picRequest.setPicUri(picUri); + picRequest.setServerIndexCode(serverIndexCode); + String reBody = JSONObject.toJSONString(picRequest); + //重定向地址获取 + String url = HikUtil.hikApiFor302(HikUri.PERSON_PICTURE, reBody); + return ResponseData.success(url); + } + } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/DeviceController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/DeviceController.java index e1c4eba..666bbee 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/DeviceController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/DeviceController.java @@ -107,7 +107,7 @@ } /** - * 设备维修管理查询(分页),需计算MTTR=总维修时间/故障次数 + * 设备状态计算与评判/设备维修管理查询(分页),需计算MTTR=总维修时间/故障次数 */ @PostMapping("/repair/listPage") @ResponseBody @@ -211,7 +211,7 @@ //需根据设备编号获取到对应的门禁点唯一标识 doorControlRequest.setDoorIndexCodes(indexCodes); doorControlRequest.setControlType(Integer.valueOf(gateGroupDTO.getStatus())); - String body = JSONObject.toJSONString(deviceCodes); + String body = JSONObject.toJSONString(doorControlRequest); String resultStr = HikUtil.hikApi(HikUri.DOOR_CONTROL, body); JSONObject resultJson = (JSONObject)JSONObject.parse(resultStr); if (!"0".equals(resultJson.get("code"))) { diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/StaffController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/StaffController.java index b58ccab..704093c 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/StaffController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/StaffController.java @@ -2,15 +2,21 @@ import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.util.StrUtil; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.base.controller.ExportController; import com.casic.missiles.core.page.PageFactory; import com.casic.missiles.model.response.ErrorResponseData; import com.casic.missiles.model.response.ResponseData; import com.casic.missiles.modular.dto.StaffInfoRequest; +import com.casic.missiles.modular.dto.hik.PersonInfoRequest; +import com.casic.missiles.modular.dto.hik.StaffCardRequest; +import com.casic.missiles.modular.enums.HikUri; import com.casic.missiles.modular.enums.OperateTypeEnum; import com.casic.missiles.modular.model.StaffInfo; import com.casic.missiles.modular.service.StaffInfoService; +import com.casic.missiles.modular.util.HikUtil; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; @@ -110,4 +116,60 @@ } return ResponseData.success(); } + + /** + * 批量开卡,添加人员之后调用,若在一个接口中添加人员成功开卡失败则第二次添加时会有问题 + */ + @PostMapping("/cardBinding") + @ResponseBody + public Object cardBinding(@RequestBody StaffCardRequest staffCardRequest) { + String body = JSONObject.toJSONString(staffCardRequest); + String resultStr = HikUtil.hikApi(HikUri.CARD_BINDING, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (!"0".equals(resultJson.get("code"))) { + log.error("请求海康,批量开卡失败,海康response:{}", resultStr); + return ResponseData.error("批量开卡失败"); + } + //保存卡号 + if(staffInfoService.saveCardInfo(staffCardRequest) > 0){ + return ResponseData.success(); + } + return ResponseData.error("批量开卡失败"); + } + + /** + * 获取员工照片,海康存储 + */ + @PostMapping("/personPicture/{staffCode}") + @ResponseBody + public Object personPicture(@PathVariable("staffCode") String staffCode){ + //获取员工详细信息,含图片服务器、uri + PersonInfoRequest request = new PersonInfoRequest(); + List list = new ArrayList<>(); + list.add(staffCode); + request.setParamName("personId"); + request.setParamValue(list); + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi(HikUri.PERSON_INFO, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (!"0".equals(resultJson.get("code"))) { + log.error("请求海康,根据人员唯一字段获取人员详细信息失败,海康response:{}", resultStr); + return ResponseData.error("获取员工照片失败"); + } + //获取照片 + JSONObject data = (JSONObject) resultJson.get("data"); + JSONArray dataArray = (JSONArray) data.get("list"); + JSONObject jsonObject = (JSONObject) dataArray.get(0); + JSONArray personPhoto = (JSONArray) jsonObject.get("personPhoto"); + JSONObject photo = (JSONObject) personPhoto.get(0); + String picUri = photo.getString("picUri"); + String serverIndexCode = photo.getString("serverIndexCode"); + PersonInfoRequest picRequest = new PersonInfoRequest(); + picRequest.setPicUri(picUri); + picRequest.setServerIndexCode(serverIndexCode); + String reBody = JSONObject.toJSONString(picRequest); + //重定向地址获取 + String url = HikUtil.hikApiFor302(HikUri.PERSON_PICTURE, reBody); + return ResponseData.success(url); + } } 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 4a07dd9..7b1dcf6 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 @@ -16,6 +16,7 @@ import com.casic.missiles.modular.redis.key.CacheKeys; import com.casic.missiles.modular.service.CockpitService; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.util.CollectionUtils; import org.springframework.web.bind.annotation.*; @@ -24,10 +25,7 @@ import java.text.NumberFormat; import java.time.LocalDateTime; import java.time.temporal.ChronoUnit; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.util.*; import java.util.stream.Collectors; /** @@ -73,6 +71,9 @@ private StatisticNumberMapper numberMapper; @Autowired + private HazardLevelMapper hazardLevelMapper; + + @Autowired private AccessGroupConfig accessGroupConfig; /** @@ -104,8 +105,24 @@ public Object buildingNumberPerHour(){ //当天按小时分组的人数 List list = numberMapper.selectListByTime(); - Map> collect = list.stream().collect(Collectors.groupingBy(BuildingNumberDTO::getStatisticPosition)); - return ResponseData.success(collect); + Map> collect = list.stream().collect(Collectors.groupingBy(BuildingNumberDTO::getStatisticTime)); + //定时任务中已将每小时三栋楼人数存到数据库 + //将一期主楼和录制楼人数合并,二期单算 + List> resultList = new ArrayList<>(); + collect.keySet().forEach(key -> { + List buildingNumberDTOS = collect.get(key); + BuildingNumberDTO mainBuildingOne = buildingNumberDTOS.get(0); + BuildingNumberDTO mainBuildingTwo = buildingNumberDTOS.get(1); + BuildingNumberDTO recordingBuilding = buildingNumberDTOS.get(2); + HashMap resultMap = new HashMap<>(); + Integer oneQuantity = Integer.valueOf(mainBuildingOne.getStatisticQuantity()); + Integer recordingQuantity = Integer.valueOf(recordingBuilding.getStatisticQuantity()); + resultMap.put("staticTime", mainBuildingOne.getStatisticTime()); + resultMap.put(mainBuildingOne.getStatisticPositionName()+"、"+recordingBuilding.getStatisticPositionName(), String.valueOf(oneQuantity+recordingQuantity)); + resultMap.put(mainBuildingTwo.getStatisticPositionName(), mainBuildingTwo.getStatisticQuantity()); + resultList.add(resultMap); + }); + return ResponseData.success(resultList); } /** @@ -151,12 +168,11 @@ public Object securityNumber() { QueryWrapper wrapper = new QueryWrapper<>(); wrapper.eq("staff_type", 2); + // TODO: 2022/9/2 后续使用产品确定的每天出勤的安保人员的数量 Integer total = staffInfoMapper.selectCount(wrapper); - //当日离岗事件个数 - QueryWrapper wrapper1 = new QueryWrapper<>(); - wrapper1.eq("hik_event_type", SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); - wrapper1.apply("date_format(now(),'%Y-%m-%d') = date_format(happen_time,'%Y-%m-%d')"); - Integer leave = caseInfoMapper.selectCount(wrapper1); + //当日离岗事件按设备去重后的个数 + // TODO: 2022/9/2 目前相当于24小时内的计算,之后看需要可改成自定义小时数计算离岗率,即离岗+6小时内仅一次离岗则恢复为100%,多次则累加离岗次数计算离岗率 + Integer leave = caseInfoMapper.selectDemobilizedCount(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); NumberFormat numberFormat = NumberFormat.getInstance(); // 设置精确到小数点后2位 numberFormat.setMaximumFractionDigits(2); @@ -179,7 +195,6 @@ @ResponseBody public Object visitorApplyDetail() { List reasonGroup = applyMapper.selectByVisitReason(); - HashMap resultMap = new HashMap<>(); NumberFormat numberFormat = NumberFormat.getInstance(); // 设置精确到小数点后2位 numberFormat.setMaximumFractionDigits(2); @@ -187,12 +202,17 @@ if(0 == sum){ return ResponseData.success(); } + List resultList = new ArrayList<>(); reasonGroup.forEach(group -> { String reasonName = dictService.getDictNameByCode(SecurityEventDict.VISIT_REASON, group.getVisitReason()); String result = numberFormat.format((float) group.getQuantity() / (float) sum * 100); - resultMap.put(reasonName, result+"%"); + ApplyReasonGroupDTO applyReasonGroupDTO = new ApplyReasonGroupDTO(); + applyReasonGroupDTO.setQuantity(group.getQuantity()); + applyReasonGroupDTO.setVisitReason(reasonName); + applyReasonGroupDTO.setRatio(result+"%"); + resultList.add(applyReasonGroupDTO); }); - return ResponseData.success(resultMap); + return ResponseData.success(resultList); } /** @@ -247,6 +267,32 @@ } /** + * 机动力量实时在岗率,在岗人数除以总应在岗人数,用离岗+6小时内恢复为100%,6小时外再计算 + */ + @GetMapping("/staff/beOnDutyRatio") + @ResponseBody + public Object beOnDutyRatio() { + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("staff_type", 2); + // TODO: 2022/9/2 后续使用产品确定的每天出勤的安保人员的数量 + Integer total = staffInfoMapper.selectCount(wrapper); + if(0 == total){ + return ResponseData.success(null); + } + //当日离岗事件按设备去重后的个数 + // TODO: 2022/9/2 目前相当于24小时内的计算,之后看需要可改成自定义小时数计算离岗率,即离岗+6小时内仅一次离岗则恢复为100%,多次则累加离岗次数计算离岗率 + List onDutyRatioDTOS = caseInfoMapper.selectDemobilizedCountByHour(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); + onDutyRatioDTOS.forEach(dto -> { + NumberFormat numberFormat = NumberFormat.getInstance(); + // 设置精确到小数点后2位 + numberFormat.setMaximumFractionDigits(2); + String result = numberFormat.format(100 - Float.valueOf(dto.getQuantity()) / (float) total * 100); + dto.setRatio(result+"%"); + }); + return ResponseData.success(onDutyRatioDTOS); + } + + /** * 闸机速通门统计-设备状态分组计算数量,devType传闸机字典key * 视频频监控摄像机统计-设备状态分组计算数量,devType传摄像头字典key */ @@ -262,12 +308,17 @@ if(sum <= 0){ return ResponseData.error("无该类设备信息"); } + List resultList = new ArrayList<>(); gateStatusGroup.forEach(group -> { String devStatus = dictService.getDictNameByCode(SecurityEventDict.DEVICE_STATUS, group.getStatus()); String result = numberFormat.format((float) group.getQuantity() / (float) sum * 100); - resultMap.put(devStatus, result+"%"); + GateStatusGroupResponse gateStatusGroupResponse = new GateStatusGroupResponse(); + gateStatusGroupResponse.setStatus(devStatus); + gateStatusGroupResponse.setRatio(result+"%"); + resultList.add(gateStatusGroupResponse); }); - resultMap.put("总", sum); + resultMap.put("total", sum); + resultMap.put("list", resultList); return ResponseData.success(resultMap); } @@ -282,17 +333,38 @@ String position = securityScoreDTO.getPosition(); List caseInfos = caseInfoMapper.selectByPosition(position); //查询各危险级别权重、各类别权重,放入map,避免循环中多次查数据库 - + HashMap hazardScoreMap = new HashMap<>(); + List caseHazardLevelList = hazardLevelMapper.getCaseHazardLevelList(null); + caseHazardLevelList.forEach(hazardLevel -> { + hazardScoreMap.put(hazardLevel.getCode(), hazardLevel.getWeight()); + }); + HashMap categoryScoreMap = new HashMap<>(); + List categoryLevelList = categoryLevelMapper.getCaseCategoryLevelList(null); + categoryLevelList.forEach(categoryLevel -> { + categoryScoreMap.put(categoryLevel.getCode(), categoryLevel.getWeight()); + }); + //事件按楼层分组,计算 List securityScoreDTOs = new ArrayList<>(); caseInfos.forEach(caseInfo -> { SecurityScoreDTO securityScoreDTO1 = new SecurityScoreDTO(); + securityScoreDTO1.setPosition(caseInfo.getPosition()); securityScoreDTO1.setArea(caseInfo.getArea()); - // TODO: 2022/8/4 楼层评分计算根据产品定义调整 -// caseInfo.get -// securityScoreDTO1.setScore(); + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); + Double score = 100 - Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + securityScoreDTO1.setScore(score); + securityScoreDTOs.add(securityScoreDTO1); }); - - return null; + 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); + }); + return ResponseData.success(securityScoreDTOs); } /** @@ -303,9 +375,13 @@ public Object SecurityFrequency(@RequestBody SecurityFrequencyDTO securityFrequencyDTO) { String year = securityFrequencyDTO.getYear(); String month = securityFrequencyDTO.getMonth(); - Integer quantity = caseInfoMapper.selectCountByMonth(year, month); - securityFrequencyDTO.setQuantity(quantity); - return ResponseData.success(securityFrequencyDTO); + if(!StringUtils.isEmpty(year) && StringUtils.isEmpty(month)){ + Integer quantity = caseInfoMapper.selectCountByMonth(year, month); + securityFrequencyDTO.setQuantity(quantity); + return ResponseData.success(securityFrequencyDTO); + } + List list = caseInfoMapper.selectPreMonthCount(); + return ResponseData.success(list); } } 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 ae4d770..f4f075c 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 @@ -1,20 +1,25 @@ package com.casic.missiles.modular.controller.cockpit; +import cn.hutool.core.date.DateUnit; import cn.hutool.core.date.DateUtil; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.casic.missiles.model.response.ResponseData; -import com.casic.missiles.modular.dao.AttendanceInfoMapper; -import com.casic.missiles.modular.dao.CaseInfoMapper; -import com.casic.missiles.modular.dao.HazardLevelMapper; -import com.casic.missiles.modular.dao.StaffInfoMapper; +import com.casic.missiles.modular.dao.*; +import com.casic.missiles.modular.dto.DeviceRepairLogDTO; +import com.casic.missiles.modular.dto.DeviceRepairRequest; import com.casic.missiles.modular.dto.statistics.*; +import com.casic.missiles.modular.enums.SecurityEventType; +import com.casic.missiles.modular.model.CaseCategoryLevel; import com.casic.missiles.modular.model.CaseHazardLevel; +import com.casic.missiles.modular.model.CaseInfo; import com.casic.missiles.modular.model.StaffInfo; +import com.casic.missiles.modular.service.DeviceInfoService; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.util.CollectionUtils; import org.springframework.web.bind.annotation.*; +import java.math.BigDecimal; import java.text.NumberFormat; import java.util.*; import java.util.stream.Collectors; @@ -40,6 +45,12 @@ @Autowired private HazardLevelMapper hazardLevelMapper; + @Autowired + private CategoryLevelMapper categoryLevelMapper; + + @Autowired + private DeviceInfoService deviceInfoService; + /** * 安防事件时域频次统计,每月的每天安防事件个数(原方案) * 月维度:展示每个月的每天的数据 @@ -89,15 +100,17 @@ List monthList = caseInfoMapper.selectPreMonthCountByYear(year); Map> collect = monthList.stream().collect(Collectors.groupingBy(PreMonthOrWeekCaseDTO::getHazardLevelCode)); HashMap strAvgMap = new HashMap<>(); + List resultList = new ArrayList<>(); for (String key : collect.keySet()) { List preMonthOrWeekCaseDTOS = collect.get(key); int sum = preMonthOrWeekCaseDTOS.stream().mapToInt(PreMonthOrWeekCaseDTO::getQuantity).sum(); //若年份是本年,则使用个安防级别数量/当前月份数 //若不是本年,除数为12 MonthAndWeekDTO monthAndWeekDTO = new MonthAndWeekDTO(); + String hazardName = hazardLevelMapper.selectHazardNameByCode(key); + monthAndWeekDTO.setLevelName(hazardName); if(year.equals(String.valueOf(DateUtil.thisYear()))){ monthAndWeekDTO.setMonthQuantity(sum / DateUtil.thisMonth()); -// monthAndWeekDTO.setLevelName(); strAvgMap.put(key, monthAndWeekDTO); }else{ monthAndWeekDTO.setMonthQuantity(sum / 12); @@ -113,27 +126,37 @@ if(year.equals(String.valueOf(DateUtil.thisYear()))){ if(!Objects.isNull(strAvgMap.get(key))){ MonthAndWeekDTO monthAndWeekDTO = strAvgMap.get(key); + String hazardName = hazardLevelMapper.selectHazardNameByCode(key); + monthAndWeekDTO.setLevelName(hazardName); monthAndWeekDTO.setWeekQuantity(sum / DateUtil.thisWeekOfYear()); strAvgMap.put(key, monthAndWeekDTO); }else{ MonthAndWeekDTO monthAndWeekDTO = new MonthAndWeekDTO(); + String hazardName = hazardLevelMapper.selectHazardNameByCode(key); + monthAndWeekDTO.setLevelName(hazardName); monthAndWeekDTO.setWeekQuantity(sum / DateUtil.thisWeekOfYear()); strAvgMap.put(key, monthAndWeekDTO); } }else{ if(!Objects.isNull(strAvgMap.get(key))){ MonthAndWeekDTO monthAndWeekDTO = strAvgMap.get(key); + String hazardName = hazardLevelMapper.selectHazardNameByCode(key); + monthAndWeekDTO.setLevelName(hazardName); monthAndWeekDTO.setWeekQuantity(sum / 52); strAvgMap.put(key, monthAndWeekDTO); }else{ MonthAndWeekDTO monthAndWeekDTO = new MonthAndWeekDTO(); + String hazardName = hazardLevelMapper.selectHazardNameByCode(key); + monthAndWeekDTO.setLevelName(hazardName); monthAndWeekDTO.setWeekQuantity(sum / 52); strAvgMap.put(key, monthAndWeekDTO); } } } - avgMonthAndWeekGroupDTO.setMap(strAvgMap); - return ResponseData.success(avgMonthAndWeekGroupDTO); + strAvgMap.keySet().forEach(key -> { + resultList.add(strAvgMap.get(key)); + }); + return ResponseData.success(resultList); } /** @@ -181,12 +204,178 @@ } /** - * 员工考勤人数变化,功能待定 + * 员工考勤人数变化,统计当天(横坐标为时)及近7天(横坐标为天)的考勤人数变化,只要发生一次考勤识别,次数的基数就正常增加(没有上班下班区分) */ + @PostMapping("/staff/attendanceNumber/{dimension}") + @ResponseBody + public Object attendanceNumber(@PathVariable("dimension") String dimension) { + List attendanceNumberDTOs = null; + List> resultList = new ArrayList<>(); + if("week".equals(dimension)){ + //近7天数据按天分组统计 + attendanceNumberDTOs = attendanceInfoMapper.getCountForWeek(); + }else if("day".equals(dimension)) { + //今天数据按小时分组统计 + attendanceNumberDTOs = attendanceInfoMapper.getCountForDay(); + } + if(CollectionUtils.isEmpty(attendanceNumberDTOs)){ + return ResponseData.error("该查询条件下,无员工出勤数据!"); + } + Map> collect = attendanceNumberDTOs.stream().collect(Collectors.groupingBy(AttendanceNumberDTO::getDate)); + collect.keySet().forEach(key -> { + List attendanceNumberDTOS = collect.get(key); + AttendanceNumberDTO attendanceNumberDTO = attendanceNumberDTOS.get(0); + AttendanceNumberDTO attendanceNumberDTO2 = attendanceNumberDTOS.get(1); + Map resultMap = new HashMap<>(); + resultMap.put(attendanceNumberDTO.getStaffType(), attendanceNumberDTO.getQuantity()); + resultMap.put(attendanceNumberDTO2.getStaffType(), attendanceNumberDTO2.getQuantity()); + resultMap.put("staticTime", attendanceNumberDTO.getDate()); + resultList.add(resultMap); + }); + return ResponseData.success(resultList); + } /** - * 近30天/近一周安保人员到岗排行 + * 早晚高峰区域安防评估 */ + @PostMapping("/security/assessment/{dimension}") + @ResponseBody + public Object securityAssessment(@PathVariable("dimension") String dimension) { + //查询各危险级别权重、各类别权重,放入map,避免循环中多次查数据库 + HashMap hazardScoreMap = new HashMap<>(); + List caseHazardLevelList = hazardLevelMapper.getCaseHazardLevelList(null); + caseHazardLevelList.forEach(hazardLevel -> { + hazardScoreMap.put(hazardLevel.getCode(), hazardLevel.getWeight()); + }); + HashMap categoryScoreMap = new HashMap<>(); + List categoryLevelList = categoryLevelMapper.getCaseCategoryLevelList(null); + categoryLevelList.forEach(categoryLevel -> { + categoryScoreMap.put(categoryLevel.getCode(), categoryLevel.getWeight()); + }); + HashMap hashMap = new HashMap<>(); + if("week".equals(dimension)){ + //近7天早晚高峰数据 + List caseInfos = caseInfoMapper.selectListBySevenDay(); + //按时间(天)进行分组 + caseInfos.forEach(caseInfo -> { + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); + Double score = Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + String[] array = caseInfo.getHappenTime().split(" "); + String dayTime = array[0]; + BigDecimal preScore; + if(hashMap.containsKey(dayTime)){ + Double aDouble = hashMap.get(dayTime); + preScore = new BigDecimal(aDouble.toString()); + + }else{ + preScore = new BigDecimal("100.0"); + } + BigDecimal nowScore = new BigDecimal(score.toString()); + hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); + }); + return ResponseData.success(hashMap); + }else if("day".equals(dimension)) { + //今天数据按小时分组统计 + List caseInfos = caseInfoMapper.selectListByToday(); + caseInfos.forEach(caseInfo -> { + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); + Double score = Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + String[] array = caseInfo.getHappenTime().split(":"); + String dayTime = array[0]; + BigDecimal preScore; + if(hashMap.containsKey(dayTime)){ + Double aDouble = hashMap.get(dayTime); + preScore = new BigDecimal(aDouble.toString()); + + }else{ + preScore = new BigDecimal("100.0"); + } + BigDecimal nowScore = new BigDecimal(score.toString()); + hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); + }); + return ResponseData.success(hashMap); + } + return null; + } + + /** + * 重点区域安防事态评估,统计重点区域6:00-23:00按小时分组数据 + */ + @GetMapping("/security/keyAreaStatistic") + @ResponseBody + public Object keyAreaStatistic() { + //查询各危险级别权重、各类别权重,放入map,避免循环中多次查数据库 + HashMap hazardScoreMap = new HashMap<>(); + List caseHazardLevelList = hazardLevelMapper.getCaseHazardLevelList(null); + caseHazardLevelList.forEach(hazardLevel -> { + hazardScoreMap.put(hazardLevel.getCode(), hazardLevel.getWeight()); + }); + HashMap categoryScoreMap = new HashMap<>(); + List categoryLevelList = categoryLevelMapper.getCaseCategoryLevelList(null); + categoryLevelList.forEach(categoryLevel -> { + categoryScoreMap.put(categoryLevel.getCode(), categoryLevel.getWeight()); + }); + HashMap hashMap = new HashMap<>(); + //今天数据按小时分组统计 + List caseInfos = caseInfoMapper.selectListByToday2(); + caseInfos.forEach(caseInfo -> { + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); + Double score = Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + String[] array = caseInfo.getHappenTime().split(":"); + String dayTime = array[0]; + BigDecimal preScore; + if(hashMap.containsKey(dayTime)){ + Double aDouble = hashMap.get(dayTime); + preScore = new BigDecimal(aDouble.toString()); + + }else{ + preScore = new BigDecimal("100.0"); + } + BigDecimal nowScore = new BigDecimal(score.toString()); + hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); + }); + return ResponseData.success(hashMap); + } + + /** + * 安防机动支援力量调配响应评估,根据事件已解决状态及已解决时间-发送时间,按时间(小时)分组统计 + */ + @GetMapping("/security/responseAssess") + @ResponseBody + public Object responseAssess() { + //查询各危险级别权重、各类别权重,放入map,避免循环中多次查数据库 + HashMap hazardScoreMap = new HashMap<>(); + List caseHazardLevelList = hazardLevelMapper.getCaseHazardLevelList(null); + caseHazardLevelList.forEach(hazardLevel -> { + hazardScoreMap.put(hazardLevel.getCode(), hazardLevel.getWeight()); + }); + HashMap hashMap = new HashMap<>(); + //今天数据按小时分组统计 + List caseInfos = caseInfoMapper.selectListByToday3(); + caseInfos.forEach(caseInfo -> { + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + //扣分=事件级别权重*未解决小时数 + Date updateTime = DateUtil.parse(caseInfo.getUpdateTime()); + Date happenTime = DateUtil.parse(caseInfo.getHappenTime()); + long between = DateUtil.between(updateTime, happenTime, DateUnit.HOUR); + Double score = Double.valueOf(hazardWeight)*between; + String[] array = caseInfo.getHappenTime().split(":"); + String dayTime = array[0]; + BigDecimal preScore; + if(hashMap.containsKey(dayTime)){ + Double aDouble = hashMap.get(dayTime); + preScore = new BigDecimal(aDouble.toString()); + }else{ + preScore = new BigDecimal("100.0"); + } + BigDecimal nowScore = new BigDecimal(score.toString()); + hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); + }); + return ResponseData.success(hashMap); + } /** * 重点区域威胁事件类型统计,优先级2,统计近7天和近30天 @@ -224,7 +413,34 @@ } /** - * 设备状态计算系数和评判,优先级3,需确认设备恢复时间是否可以获取 + * 近30天/近一周安保人员到岗排行 */ + + /** + * 安保等级评估,发生离岗事件减1分 + */ + @GetMapping("/security/levelAssess") + @ResponseBody + public Object securityLevelAssess() { + //今天数据按小时分组统计 + List resultList = caseInfoMapper.selectListByType(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); + resultList.forEach(result -> { + BigDecimal deScore = new BigDecimal(result.getQuantity()); + BigDecimal preScore = new BigDecimal("100.0"); + result.setScore(preScore.subtract(deScore).doubleValue()); + }); + return ResponseData.success(resultList); + } + + /** + * 设备状态计算系数和评判,即设备维修管理查询(不分页) + */ + @PostMapping("/device/repairList") + @ResponseBody + public Object repairList(@RequestBody DeviceRepairRequest deviceRepairRequest) { + List deviceRepairLogDTOS = deviceInfoService.deviceRepairListPage(deviceRepairRequest); + return ResponseData.success(deviceRepairLogDTOS); + } + } 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 fbf8ab6..c71a15a 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 @@ -1,13 +1,12 @@ package com.casic.missiles.modular.controller.hik; +import cn.hutool.core.date.DateTime; +import cn.hutool.core.date.DateUtil; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.casic.missiles.model.response.ResponseData; import com.casic.missiles.modular.dao.HikFaceGroupInfoMapper; -import com.casic.missiles.modular.dto.hik.EventSubscribeRequest; -import com.casic.missiles.modular.dto.hik.FaceGroupAdditionRequest; -import com.casic.missiles.modular.dto.hik.HikRecvEvent; -import com.casic.missiles.modular.dto.hik.OrgBatchAdd; +import com.casic.missiles.modular.dto.hik.*; import com.casic.missiles.modular.enums.HikUri; import com.casic.missiles.modular.enums.SecurityEventType; import com.casic.missiles.modular.model.CaseInfo; @@ -18,16 +17,20 @@ import com.casic.missiles.modular.util.CaseInfoFactoryUtil; import com.casic.missiles.modular.util.HikUtil; import com.casic.missiles.modular.util.ThreadPoolUtil; +import com.casic.missiles.modular.util.WebSocket; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; -import org.springframework.web.bind.annotation.*; +import org.springframework.util.CollectionUtils; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.RestController; -import java.net.InetAddress; -import java.net.UnknownHostException; import java.util.ArrayList; +import java.util.Iterator; import java.util.List; import java.util.Objects; @@ -38,7 +41,6 @@ */ @Slf4j @RestController -@RequestMapping("/hik") public class HikController { @Autowired @@ -53,28 +55,37 @@ @Autowired private HikService hikService; + @Autowired + private HikFaceGroupInfoMapper hikFaceGroupInfoMapper; + + @Autowired + private WebSocket webSocket; + @Value("${server.port}") private int serverPort; - @Autowired - private HikFaceGroupInfoMapper hikFaceGroupInfoMapper; /** * 海康事件订阅 */ - @PostMapping("/event/subscribe") + @PostMapping("/hik/event/subscribe") @ResponseBody - public Object eventSubscribe() throws UnknownHostException { + public Object eventSubscribe() { EventSubscribeRequest eventSubscribeRequest = new EventSubscribeRequest(); ArrayList list = new ArrayList<>(); list.add(SecurityEventType.DEVICE_OFFLINE); + list.add(SecurityEventType.DEVICE_ONLINE); list.add(SecurityEventType.KEY_PERSONNEL_IDENTIFY_EVENT); list.add(SecurityEventType.MONITORING_POINT_OFFLINE); + list.add(SecurityEventType.MONITORING_POINT_ONLINE); list.add(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); list.add(SecurityEventType.PERSONNEL_GATHER_EVENT); - InetAddress localHost = InetAddress.getLocalHost(); + list.add(SecurityEventType.VISITOR_REGISTER); + list.add(SecurityEventType.VISITOR_CHECKOUT); + list.add(SecurityEventType.HIGH_ALTITUDE_PARABOLIC); +// InetAddress localHost = InetAddress.getLocalHost(); eventSubscribeRequest.setEventTypes(list); - eventSubscribeRequest.setEventDest("https://" + localHost + ":" + serverPort + "/eventRcv"); + eventSubscribeRequest.setEventDest("http://" + "192.168.10.6" + ":" + serverPort + "/eventRcv"); //订阅类型,0-订阅原始事件,1-联动事件,2-原始事件和联动事件,不填使用默认值0 eventSubscribeRequest.setSubType(0); /** @@ -92,19 +103,25 @@ } /** + * 查询事件订阅信息 + */ + @PostMapping("/hik/event/query") + @ResponseBody + public Object eventQuery() { + String result = HikUtil.hikApi(HikUri.EVENT_INFO, ""); + return result; + } + + /** * 海康事件接收 */ @PostMapping("/eventRcv") @ResponseBody public Object eventRcv(@RequestBody HikRecvEvent hikRecvEvent) { //1、接收所需事件类型 - Long eventType = hikRecvEvent.getEventType(); + Number eventType = hikRecvEvent.getEventType(); log.info("接收到安防事件类型为:{}", eventType); CaseInfo caseInfo = caseInfoFactoryUtil.getCaseInfo(eventType); - //接收到不关心事件直接返回 - if(Objects.isNull(caseInfo)){ - return ResponseData.success(); - } //2、不同事件不同处理,caseInfoFactoryUtil已设置好事件基础定义信息 // 再为事件添加状态、设备编码、设备名称、位置、区域、时间 // 异步处理事件 @@ -114,19 +131,23 @@ caseHandle(hikRecvEvent, eventType, caseInfo); } })); +// caseHandle(hikRecvEvent, eventType, caseInfo); - return null; + return ResponseData.success(); } - private void caseHandle(HikRecvEvent hikRecvEvent, Long eventType, CaseInfo caseInfo) { + private void caseHandle(HikRecvEvent hikRecvEvent, Number eventType, CaseInfo caseInfo) { JSONArray eventArray = hikRecvEvent.getEventArray(); List caseInfos = new ArrayList<>(); - while (eventArray.stream().iterator().hasNext()) { + Iterator iterator = eventArray.iterator(); + while (iterator.hasNext()) { CaseInfo caseInfo1 = new CaseInfo(); - BeanUtils.copyProperties(caseInfo, caseInfo1); - JSONObject event = (JSONObject) eventArray.stream().iterator().next(); + if(!Objects.isNull(caseInfo)){ + BeanUtils.copyProperties(caseInfo, caseInfo1); + } + JSONObject event = (JSONObject) iterator.next(); //5种事件进行不同处理 - if(SecurityEventType.KEY_PERSONNEL_IDENTIFY_EVENT == eventType){ + if (SecurityEventType.KEY_PERSONNEL_IDENTIFY_EVENT.equals(eventType)) { //判断所属人脸分组 JSONObject data = (JSONObject) event.get("data"); JSONObject faceRecognitionResult = (JSONObject) data.get("faceRecognitionResult"); @@ -142,52 +163,101 @@ if (faceGroupCode.equals(blackListGroup.getFaceGroupCode())) { //黑名单分组处理 caseInfo1 = hikService.blackListHandle(event, caseInfo1); - }else if(faceGroupCode.equals(propertyPersonnelGroup.getFaceGroupCode())){ + } else if (faceGroupCode.equals(propertyPersonnelGroup.getFaceGroupCode())) { //考勤分组处理-物业人员,添加到考勤表 hikService.propertyAttendanceHandle(event); - }else if(faceGroupCode.equals(securityPersonnelGroup.getFaceGroupCode())){ + } else if (faceGroupCode.equals(securityPersonnelGroup.getFaceGroupCode())) { //考勤分组处理-安保人员,添加到考勤表 hikService.securityPersonnelHandle(event); - }else { + } else { return; } - }else if(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT == eventType){ + } else if (SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT.equals(eventType)) { //离岗事件处理 caseInfo1 = hikService.demobilizedHandle(event, caseInfo1); - }else if(SecurityEventType.PERSONNEL_GATHER_EVENT == eventType){ + } else if (SecurityEventType.PERSONNEL_GATHER_EVENT.equals(eventType)) { //人员聚集事件处理 caseInfo1 = hikService.personGatherHandle(event, caseInfo1); - }else if(SecurityEventType.MONITORING_POINT_OFFLINE == eventType){ + } else if (SecurityEventType.MONITORING_POINT_OFFLINE.equals(eventType)) { //监控点离线事件处理 caseInfo1 = hikService.monitorPointOfflineHandle(event, caseInfo1); - }else if(SecurityEventType.DEVICE_OFFLINE == eventType){ + } else if (SecurityEventType.MONITORING_POINT_ONLINE.equals(eventType)) { + //监控点上线事件处理 + hikService.monitorPointOnlineHandle(event); + } else if (SecurityEventType.DEVICE_OFFLINE.equals(eventType)) { //装置离线事件处理 caseInfo1 = hikService.deviceOfflineHandle(event, caseInfo1); - }else if(SecurityEventType.VISITOR_REGISTER == eventType){ + } else if (SecurityEventType.DEVICE_ONLINE.equals(eventType)) { + //装置上线处理 + hikService.deviceOnlineHandle(event); + } else if (SecurityEventType.VISITOR_REGISTER.equals(eventType)) { //记录访客登记记录,添加到访客记录表 hikService.visitorRegisterHandler(event); - }else if(SecurityEventType.VISITOR_CHECKOUT == eventType){ + } else if (SecurityEventType.VISITOR_CHECKOUT.equals(eventType)) { //记录访客签离记录 hikService.visitorCheckOutHandler(event); } - if(!Objects.isNull(caseInfo1) && !StringUtils.isEmpty(caseInfo1.getHappenTime())){ + if (!Objects.isNull(caseInfo1) && !StringUtils.isEmpty(caseInfo1.getHappenTime())) { caseInfos.add(caseInfo1); } } //3、安防事件入库 - if(!caseInfoService.insertCaseInfoBatch(caseInfos)){ - log.error("安防事件批量入库异常"); + if (!CollectionUtils.isEmpty(caseInfos) && !caseInfoService.insertCaseInfoBatch(caseInfos)) { + log.error("安防事件批量入库异常!"); } // TODO: 2022/8/15 webSocket推送 + if (CollectionUtils.isEmpty(caseInfos)) { + log.info("webSocket事件推送"); + webSocket.sendAllMessage(JSONObject.toJSONString(caseInfos)); + } return; } /** + * 以图搜图,前端用于轨迹追踪 + */ + @PostMapping("/hik/search/picture") + @ResponseBody + public Object searchPictures(@RequestBody SearchPicturesRequest searchPicturesRequest) { + DateTime startDateTime = DateUtil.parse(searchPicturesRequest.getStartTime()); + DateTime endDateTime = DateUtil.parse(searchPicturesRequest.getEndTime()); + String startTime = DateUtil.format(startDateTime, "yyyy-MM-dd'T'HH:mm:ss.SSSXXX"); + String endTime = DateUtil.format(endDateTime, "yyyy-MM-dd'T'HH:mm:ss.SSSXXX"); + searchPicturesRequest.setStartTime(startTime); + searchPicturesRequest.setEndTime(endTime); + String body = JSONObject.toJSONString(searchPicturesRequest); + String resultStr = HikUtil.hikApi(HikUri.SEARCH_PICTURES, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (!"0".equals(resultJson.get("code"))) { + log.error("请求海康,以图搜图失败,海康response:{}", resultStr); + return ResponseData.error("以图搜图失败"); + } + return ResponseData.success(resultJson); + } + + + /** + * 海康事件取消订阅 + */ + @PostMapping("/hik/event/cancel") + @ResponseBody + public Object eventCancelSubscribe(@RequestBody CancelSubscribeRequest cancelSubscribeRequest) { + String body = JSONObject.toJSONString(cancelSubscribeRequest); + String resultStr = HikUtil.hikApi(HikUri.EVENT_CANCEL, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (!"0".equals(resultJson.get("code"))) { + log.error("请求海康,取消订阅失败,海康response:{}", resultStr); + return ResponseData.error("取消订阅失败"); + } + return ResponseData.success(resultJson); + } + + /** * 单个添加海康人脸分组 * api->hik单个添加人脸分组api->response->mysql */ - @PostMapping("/faceGroup/single/add") + @PostMapping("/hik/faceGroup/single/add") @ResponseBody public Object faceGroupAddition(@RequestBody FaceGroupAdditionRequest faceGroupAdditionRequest) { String body = JSONObject.toJSONString(faceGroupAdditionRequest); @@ -212,7 +282,7 @@ * 批量添加海康组织 * api->hik批量添加组织api->response */ - @PostMapping("/org/batch/add") + @PostMapping("/hik/org/batch/add") @ResponseBody public Object orgBatchAdd(@RequestBody List orgBatchAddRequest) { String body = JSONObject.toJSONString(orgBatchAddRequest); @@ -232,4 +302,62 @@ return ResponseData.error("批量添加组织失败"); } + /** + * 获取人员列表 + */ + @PostMapping("/hik/person/personList") + @ResponseBody + public Object personList() { + PersonListRequest request = new PersonListRequest(); + request.setPageNo(1); + request.setPageSize(100); + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi("/api/resource/v2/person/personList", body); + return resultStr; + } + + /** + * 获取组织列表 + */ + @PostMapping("/hik/org/orgList") + @ResponseBody + public Object orgList() { + PersonListRequest request = new PersonListRequest(); + request.setPageNo(1); + request.setPageSize(100); + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi("/api/resource/v1/org/orgList", body); + return resultStr; + } + + /** + * 查询访客权限下载记录 + */ + @PostMapping("/hik/auth/result") + @ResponseBody + public Object authResult() { + PersonListRequest request = new PersonListRequest(); + request.setPageNo(1); + request.setPageSize(100); + request.setOrderId("ba101db6246711edaea66f7939a13638"); + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi("/api/visitor/v1/auth/result", body); + return resultStr; + } + + /** + * 人脸图片获取 + */ + @PostMapping("/hik/face/picture") + @ResponseBody + public Object facePicture() { + FaceRequest request = new FaceRequest(); +// List list = new ArrayList<>(); +// list.add(""); + request.setCertificateNum("wanggong"); + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi("/api/frs/v1/face", body); + return resultStr; + } + } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/AssetInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/AssetInfoMapper.java index 4f64e83..c0684ee 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/AssetInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/AssetInfoMapper.java @@ -17,6 +17,6 @@ @Mapper public interface AssetInfoMapper extends BaseMapper { - List getAssetInfoListPage(@Param("page") Page page, AssetInfoRequest assetInfoRequest); + List getAssetInfoListPage(@Param("page") Page page, @Param("assetInfoRequest") AssetInfoRequest assetInfoRequest); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/AttendanceInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/AttendanceInfoMapper.java index f9e793e..ec87e46 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/AttendanceInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/AttendanceInfoMapper.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.statistics.AttendanceNumberDTO; import com.casic.missiles.modular.dto.statistics.AttendanceRatioDTO; import com.casic.missiles.modular.model.AttendanceInfo; import org.apache.ibatis.annotations.Mapper; @@ -17,7 +18,7 @@ */ @Mapper public interface AttendanceInfoMapper extends BaseMapper { - List getAttendanceInfoListPage(@Param("page") Page page, StaffInfoRequest attendanceInfoRequest); + List getAttendanceInfoListPage(@Param("page") Page page, @Param("attendanceInfoRequest") StaffInfoRequest attendanceInfoRequest); AttendanceInfo selectByCodeAndDate(@Param("staffCode") String staffCode); @@ -26,4 +27,8 @@ List getCountByTypeAndDateForMonth(@Param("staffType")String staffType); List getCountByTypeAndDateForYear(@Param("staffType")String staffType); + + List getCountForWeek(); + + List getCountForDay(); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java index ce94b8f..6137a7d 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java @@ -17,5 +17,5 @@ @Mapper public interface BlackInfoMapper extends BaseMapper { - List getBlackInfoListPage(@Param("page") Page page, BlackInfoRequest blackInfoRequest); + List getBlackInfoListPage(@Param("page") Page page, @Param("blackInfoRequest") BlackInfoRequest blackInfoRequest); } 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 efda6b3..50aaa6f 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 @@ -20,7 +20,7 @@ List getCaseInfoListPage(@Param("page") Page page, @Param("caseInfoRequest") CaseInfoRequest caseInfoRequest); - int updateStatusById(CaseInfoRequest caseInfoRequest); + int updateStatusById(@Param("caseInfoRequest") CaseInfoRequest caseInfoRequest); List selectByLevelAndMonth(@Param("year") String year); @@ -47,4 +47,20 @@ List selectPreWeekCountByThirtyDay(); List selectPreDayCountBySevenDay(); + + Integer selectDemobilizedCount(@Param("eventType") Number personnelDemobilizedEvent); + + List selectPreMonthCount(); + + List selectListBySevenDay(); + + List selectListByToday(); + + List selectListByToday2(); + + List selectListByToday3(); + + List selectListByType(@Param("eventType") Number eventType); + + List selectDemobilizedCountByHour(@Param("eventType") Number eventType); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/CategoryLevelMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/CategoryLevelMapper.java index 52fc714..afe1650 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/CategoryLevelMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/CategoryLevelMapper.java @@ -17,9 +17,9 @@ @Mapper public interface CategoryLevelMapper extends BaseMapper { - List getCaseCategoryLevelListPage(@Param("page") Page page, CategoryLevelRequest categoryLevelRequest); + List getCaseCategoryLevelListPage(@Param("page") Page page, @Param("categoryLevelRequest") CategoryLevelRequest categoryLevelRequest); - List getCaseCategoryLevelList(CategoryLevelRequest categoryLevelRequest); + List getCaseCategoryLevelList(@Param("categoryLevelRequest") CategoryLevelRequest categoryLevelRequest); CaseCategoryLevel getCaseCategoryLevel(@Param("categoryLevelCode") String categoryLevelCode); 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 66353b1..2555a09 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 @@ -19,7 +19,7 @@ @Mapper public interface DeviceInfoMapper extends BaseMapper { - List getDeviceInfoListPage(@Param("page") Page page, DeviceInfoRequest deviceInfoRequest); + List getDeviceInfoListPage(@Param("page") Page page, @Param("deviceInfoRequest") DeviceInfoRequest deviceInfoRequest); List getDeviceInfoList(@Param("deviceInfoRequest") DeviceInfoRequest deviceInfoRequest); @@ -27,6 +27,8 @@ DeviceInfo getByIndexCode(@Param("srcIndex") String srcIndex); + DeviceInfo getByIp(@Param("ip") String ip); + List selectIndexCodesByCodes(@Param("deviceCodes") List deviceCodes); List selectByType(@Param("devType") String devType); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java index 41dd0af..5bfaf63 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java @@ -5,6 +5,7 @@ import com.casic.missiles.modular.dto.DeviceRepairRequest; import com.casic.missiles.modular.model.DeviceRepairLog; import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; import java.util.List; @@ -16,7 +17,7 @@ @Mapper public interface DeviceRepairLogMapper extends BaseMapper { - List getDeviceRepairListPage(Page page, DeviceRepairRequest deviceRepairRequest); + List getDeviceRepairListPage(@Param("page") Page page, @Param("deviceRepairRequest")DeviceRepairRequest deviceRepairRequest); - List getDeviceRepairList(DeviceRepairRequest deviceRepairRequest); + List getDeviceRepairList(@Param("deviceRepairRequest") DeviceRepairRequest deviceRepairRequest); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java index 9035c47..4823ac1 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java @@ -18,7 +18,7 @@ @Mapper public interface FireEquipInfoMapper extends BaseMapper { - List getFireEquipInfoListPage(@Param("page") Page page, FireEquipRequest fireEquipRequest); + List getFireEquipInfoListPage(@Param("page") Page page, @Param("fireEquipRequest") FireEquipRequest fireEquipRequest); FireEquipInfo getFireEquipInfo(@Param("equipCode") String equipCode); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/GateGroupMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/GateGroupMapper.java index d8c330d..977a427 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/GateGroupMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/GateGroupMapper.java @@ -17,7 +17,7 @@ */ @Mapper public interface GateGroupMapper extends BaseMapper { - List getGateGroupListPage(@Param("page") Page page, GateGroupRequest gateGroupRequest); + List getGateGroupListPage(@Param("page") Page page, @Param("gateGroupRequest") GateGroupRequest gateGroupRequest); GateGroup getGateGroupByName(@Param("groupName") String groupName); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/HazardLevelMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/HazardLevelMapper.java index 8957780..dcf47bb 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/HazardLevelMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/HazardLevelMapper.java @@ -17,11 +17,13 @@ @Mapper public interface HazardLevelMapper extends BaseMapper { - List getCaseHazardLevelListPage(@Param("page") Page page, HazardLevelRequest hazardLevelRequest); + List getCaseHazardLevelListPage(@Param("page") Page page, @Param("hazardLevelRequest") HazardLevelRequest hazardLevelRequest); - List getCaseHazardLevelList(HazardLevelRequest hazardLevelRequest); + List getCaseHazardLevelList(@Param("hazardLevelRequest") HazardLevelRequest hazardLevelRequest); CaseHazardLevel getCaseHazardLevel(@Param("hazardLevelCode") String hazardLevelCode); List selectHazardName(); + + String selectHazardNameByCode(@Param("hazardLevelCode") String hazardLevelCode); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/HikCaseDefineMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/HikCaseDefineMapper.java index 0dc47d1..f162fef 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/HikCaseDefineMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/HikCaseDefineMapper.java @@ -12,5 +12,5 @@ */ @Mapper public interface HikCaseDefineMapper extends BaseMapper { - HikCaseDefine getHikCaseDefine(@Param("caseTypeCode") Long caseTypeCode); + HikCaseDefine getHikCaseDefine(@Param("caseTypeCode") Number caseTypeCode); } 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 f8a674c..fe5afc2 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 @@ -17,11 +17,13 @@ @Mapper public interface StaffInfoMapper extends BaseMapper { - List getStaffInfoListPage(@Param("page") Page page, StaffInfoRequest staffInfoRequest); + List getStaffInfoListPage(@Param("page") Page page, @Param("staffInfoRequest") StaffInfoRequest staffInfoRequest); StaffInfo selectByCode(@Param("staffCode") String staffCode); - List getStaffInfoList(StaffInfoRequest staffInfoRequest); + List getStaffInfoList(@Param("staffInfoRequest") StaffInfoRequest staffInfoRequest); - List selectBatchCodes(List list); + List selectBatchCodes(@Param("list") List list); + + int updateByCodeForCard(@Param("staffCode") String staffCode, @Param("cardNo") String cardNo); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitInfoMapper.java index b1217c5..6c52542 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitInfoMapper.java @@ -16,7 +16,7 @@ */ @Mapper public interface VisitInfoMapper extends BaseMapper { - List getVisitInfoListPage(@Param("page") Page page, VisitorRequest visitorRequest); + List getVisitInfoListPage(@Param("page") Page page, @Param("visitorRequest") VisitorRequest visitorRequest); VisitInfo selectByOrderId(@Param("orderId") String orderId); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitorApplyMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitorApplyMapper.java index c09f3c0..6ea55bd 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitorApplyMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitorApplyMapper.java @@ -18,7 +18,7 @@ @Mapper public interface VisitorApplyMapper extends BaseMapper { - List getVisitorApplyListPage(@Param("page") Page page, VisitorApplyRequest visitorApplyRequest); + List getVisitorApplyListPage(@Param("page") Page page, @Param("visitorApplyRequest") VisitorApplyRequest visitorApplyRequest); List selectByVisitReason(); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/AttendanceInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/AttendanceInfoMapper.xml index b2ece71..f8bdd6e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/AttendanceInfoMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/AttendanceInfoMapper.xml @@ -43,7 +43,8 @@ and staff_type = #{staffType} - and YEARWEEK(date_format(atte_date, '%Y-%m-%d'), 1) = YEARWEEK(now(),1); + AND DATE_SUB(CURDATE(), INTERVAL 7 DAY) <= DATE(atte_date) + GROUP BY DATE_FORMAT(atte_date, '%Y-%m-%d') @@ -69,4 +70,20 @@ GROUP BY DATE_FORMAT(atte_date, '%Y-%m') + + + \ No newline at end of file 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 2b6953f..06ec0a8 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 @@ -28,7 +28,9 @@ @@ -87,7 +89,8 @@ SELECT hazard_level_code as levelCode, count(id) as quantity FROM bus_case_info WHERE hazard_level_code is not null - AND DATE_SUB(CURDATE(), INTERVAL 7 DAY) <= date(happen_time); + AND is_key_area = 1 + AND DATE_SUB(CURDATE(), INTERVAL 7 DAY) <= date(happen_time) GROUP BY hazard_level_code @@ -95,7 +98,8 @@ SELECT hazard_level_code as levelCode, count(id) as quantity FROM bus_case_info WHERE hazard_level_code is not null - AND DATE_SUB(CURDATE(), INTERVAL 30 DAY) <= date(happen_time); + AND is_key_area = 1 + AND DATE_SUB(CURDATE(), INTERVAL 30 DAY) <= date(happen_time) GROUP BY hazard_level_code @@ -122,4 +126,71 @@ AND hazard_level_code is not null GROUP BY DATE_FORMAT(happen_time,'%Y-%m-%d') + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/CategoryLevelMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/CategoryLevelMapper.xml index 4670b1f..1d25cbd 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/CategoryLevelMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/CategoryLevelMapper.xml @@ -20,11 +20,11 @@ SELECT * FROM bus_case_category_level WHERE 1=1 - - and code = #{code} + + and code = #{categoryLevelRequest.code} - - and name = #{name} + + and name = #{categoryLevelRequest.name} ORDER by create_time DESC 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 9b66fd8..bfd84b7 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 @@ -98,4 +98,10 @@ #{item} + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceRepairLogMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceRepairLogMapper.xml index 078ed3c..cf1a481 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceRepairLogMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceRepairLogMapper.xml @@ -22,14 +22,14 @@ SELECT * FROM bus_device_repair_log WHERE 1=1 - - and device_code = #{devCode} + + and device_code = #{deviceRepairRequest.devCode} - - and device_name = #{devName} + + and device_name = #{deviceRepairRequest.devName} - - and DATE_FORMAT(create_time,"%y%m%d") = DATE_FORMAT(#{createTime},"%y%m%d") + + and DATE_FORMAT(create_time,"%y%m%d") = DATE_FORMAT(#{deviceRepairRequest.createTime},"%y%m%d") ORDER by create_time DESC diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/HazardLevelMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/HazardLevelMapper.xml index f16f2b9..458322b 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/HazardLevelMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/HazardLevelMapper.xml @@ -20,11 +20,11 @@ SELECT * FROM bus_case_hazard_level WHERE 1=1 - - and code = #{code} + + and code = #{hazardLevelRequest.code} - - and name = #{name} + + and name = #{hazardLevelRequest.name} ORDER by create_time DESC @@ -42,4 +42,10 @@ SELECT name FROM bus_case_hazard_level + + \ 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 557237e..b6a183a 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 @@ -50,4 +50,10 @@ + + + UPDATE bus_staff_info + SET card_no = #{cardNo} + WHERE staff_code = #{staffCode} + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitInfoMapper.xml index 84aa84f..230529a 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitInfoMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitInfoMapper.xml @@ -27,5 +27,6 @@ SELECT * FROM bus_visit_info WHERE order_id = #{orderId} and DATE_FORMAT(in_time,'%Y-%m-%d') = CURRENT_DATE + limit 1 \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/BlackPictureRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/BlackPictureRequest.java new file mode 100644 index 0000000..fc92701 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/BlackPictureRequest.java @@ -0,0 +1,14 @@ +package com.casic.missiles.modular.dto; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/29 19:26 + */ +@Data +public class BlackPictureRequest { + private String picUri; + private String serverIndexCode; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/CancelSubscribeRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/CancelSubscribeRequest.java new file mode 100644 index 0000000..e2d390a --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/CancelSubscribeRequest.java @@ -0,0 +1,15 @@ +package com.casic.missiles.modular.dto.hik; + +import lombok.Data; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/24 15:14 + */ +@Data +public class CancelSubscribeRequest { + private List eventTypes; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/CardInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/CardInfo.java new file mode 100644 index 0000000..341457d --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/CardInfo.java @@ -0,0 +1,24 @@ +package com.casic.missiles.modular.dto.hik; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/26 16:08 + */ +@Data +public class CardInfo { + //卡号,8~20个字符,支持数字和大写字母 + private String cardNo; + //人员ID,员工工号 + private String personId; + //人员所属组织IndexCode + private String orgIndexCode; + //卡片类型,默认是1:IC卡 + //1:IC卡 + //2:CPU卡 + //3:远距离卡 + //4:MIFARE卡 + private Number cardType; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/FaceRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/FaceRequest.java new file mode 100644 index 0000000..edc04bf --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/FaceRequest.java @@ -0,0 +1,16 @@ +package com.casic.missiles.modular.dto.hik; + +import lombok.Data; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/25 16:53 + */ +@Data +public class FaceRequest { + private String certificateNum; + private List indexCodes; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/HikRecvEvent.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/HikRecvEvent.java index a3e9845..1b2b2b1 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/HikRecvEvent.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/HikRecvEvent.java @@ -28,12 +28,12 @@ /** * 事件类型,用于判断所需接收到的事件类型 */ - public Long getEventType(){ + public Number getEventType(){ JSONObject jsonObject = (JSONObject)JSONObject.toJSON(params); //事件类别对应SecurityEventTypeEnum JSONArray eventTypeArray = (JSONArray)jsonObject.get("events"); JSONObject eventJsonObject = (JSONObject)JSONObject.toJSON(eventTypeArray.get(0)); - Long eventType = (Long) eventJsonObject.get("eventType"); + Number eventType = (Number) eventJsonObject.get("eventType"); return eventType; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonBatchDeleteRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonBatchDeleteRequest.java index 027d31d..9751929 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonBatchDeleteRequest.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonBatchDeleteRequest.java @@ -12,4 +12,6 @@ @Data public class PersonBatchDeleteRequest { private List personIds; + //删除人脸接口使用 + private String faceId; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonInfoRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonInfoRequest.java new file mode 100644 index 0000000..05dc9e1 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonInfoRequest.java @@ -0,0 +1,20 @@ +package com.casic.missiles.modular.dto.hik; + +import lombok.Data; + +import java.util.List; + +/** + * @Description: 获取员工照片请求实体 + * @Author: wangpeng + * @Date: 2022/8/25 16:53 + */ +@Data +public class PersonInfoRequest { + //获取员工详细信息使用 + private String paramName; + private List paramValue; + //获取照片使用 + private String picUri; + private String serverIndexCode; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonListRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonListRequest.java new file mode 100644 index 0000000..3f7149b --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonListRequest.java @@ -0,0 +1,16 @@ +package com.casic.missiles.modular.dto.hik; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/25 16:53 + */ +@Data +public class PersonListRequest { + private Number pageNo; + private Number pageSize; + + private String orderId; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/SearchPicturesRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/SearchPicturesRequest.java new file mode 100644 index 0000000..0a95966 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/SearchPicturesRequest.java @@ -0,0 +1,24 @@ +package com.casic.missiles.modular.dto.hik; + +import lombok.Data; + +import java.util.List; + +/** + * @Description: 以图搜图请求 + * @Author: wangpeng + * @Date: 2022/8/29 10:46 + */ +@Data +public class SearchPicturesRequest { + private String facePicBinaryData; + private String facePicUrl; + private List cameraIndexCodes; + private String startTime; + private String endTime; + //指定搜图的最小相似度,最小为1,最大为100 + private String minSimilarity; + private Number age; + //male-男性,female-女性 + private String sex; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/StaffCardRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/StaffCardRequest.java new file mode 100644 index 0000000..4052e6d --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/StaffCardRequest.java @@ -0,0 +1,20 @@ +package com.casic.missiles.modular.dto.hik; + +import lombok.Data; + +import java.util.List; + +/** + * @Description: 人员开卡请求实体 + * @Author: wangpeng + * @Date: 2022/8/26 16:05 + */ +@Data +public class StaffCardRequest { + //卡片开始有效时间,时间格式:yyyy-MM-dd + private String startDate; + //卡片截止有效时间,时间格式:yyyy-MM-dd,不能大于2037年12月31日 + private String endDate; + //cardList,待开卡列表,最大支持50张卡 + private List cardList; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/VisitorInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/VisitorInfo.java index 73aa316..b99f301 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/VisitorInfo.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/VisitorInfo.java @@ -14,7 +14,7 @@ //访客性别 //1: 男 //2: 女 - private String gender; + private Integer gender; //联系电话建议填写手机号码 private String phoneNo; //证件类型 diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/ApplyReasonGroupDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/ApplyReasonGroupDTO.java index 514f382..786143e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/ApplyReasonGroupDTO.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/ApplyReasonGroupDTO.java @@ -13,4 +13,6 @@ private String visitReason; //访问人数 private Integer quantity; + //占比 + private String ratio; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/AttendanceNumberDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/AttendanceNumberDTO.java new file mode 100644 index 0000000..a494321 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/AttendanceNumberDTO.java @@ -0,0 +1,24 @@ +package com.casic.missiles.modular.dto.statistics; + +import com.fasterxml.jackson.annotation.JsonIgnore; +import lombok.Data; + +/** + * @Description: 出勤人数统计实体 + * @Author: wangpeng + * @Date: 2022/8/31 19:24 + */ +@Data +public class AttendanceNumberDTO { + //日期维度,周、今日,入参 + @JsonIgnore + private String dateDimension; + + //日期,具体天/小时,出参 + private String date; + //出勤人数 + private String quantity; + //员工类型 + private String staffType; + +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/AvgMonthAndWeekGroupDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/AvgMonthAndWeekGroupDTO.java index 4366916..331a9a9 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/AvgMonthAndWeekGroupDTO.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/AvgMonthAndWeekGroupDTO.java @@ -2,8 +2,6 @@ import lombok.Data; -import java.util.Map; - /** * @Description: 平均每月和每周的数据实体 * @Author: wangpeng @@ -13,6 +11,4 @@ public class AvgMonthAndWeekGroupDTO { //入参 private String year; - //出参,key:事件类型,value:周和月数据平均值 - private Map map; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/GateStatusGroupResponse.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/GateStatusGroupResponse.java new file mode 100644 index 0000000..d16f4e5 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/GateStatusGroupResponse.java @@ -0,0 +1,16 @@ +package com.casic.missiles.modular.dto.statistics; + +import lombok.Data; + +/** + * @Description: 闸机/摄像机统计响应实体 + * @Author: wangpeng + * @Date: 2022/8/30 14:22 + */ +@Data +public class GateStatusGroupResponse { + //设备状态 + private String status; + //占比 + private String ratio; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/MonthAndWeekDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/MonthAndWeekDTO.java index 7482b2a..284115a 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/MonthAndWeekDTO.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/MonthAndWeekDTO.java @@ -9,7 +9,7 @@ */ @Data public class MonthAndWeekDTO { -// private String levelName; + private String levelName; private Integer monthQuantity; private Integer weekQuantity; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/OnDutyRatioDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/OnDutyRatioDTO.java new file mode 100644 index 0000000..4f6a65d --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/OnDutyRatioDTO.java @@ -0,0 +1,15 @@ +package com.casic.missiles.modular.dto.statistics; + +import lombok.Data; + +/** + * @Description: 在岗率统计实体 + * @Author: wangpeng + * @Date: 2022/9/2 21:24 + */ +@Data +public class OnDutyRatioDTO { + private String date; + private String quantity; + private String ratio; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/SecurityLevelAssessDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/SecurityLevelAssessDTO.java new file mode 100644 index 0000000..40a0738 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/SecurityLevelAssessDTO.java @@ -0,0 +1,15 @@ +package com.casic.missiles.modular.dto.statistics; + +import lombok.Data; + +/** + * @Description: 出勤人数统计实体 + * @Author: wangpeng + * @Date: 2022/8/31 19:24 + */ +@Data +public class SecurityLevelAssessDTO { + private String date; + private String quantity; + private Double score; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/SecurityScoreDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/SecurityScoreDTO.java index 304d169..f7bd4a2 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/SecurityScoreDTO.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/SecurityScoreDTO.java @@ -14,5 +14,5 @@ //楼层,出参 private String area; //评分,出参 - private String score; + private Double score; } 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 6a30786..e5e613d 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 @@ -8,6 +8,10 @@ public interface HikUri { //事件订阅 String EVENT_SUBSCRIBE = "/api/eventService/v1/eventSubscriptionByEventTypes"; + //事件订阅信息查询 + String EVENT_INFO = "/api/eventService/v1/eventSubscriptionView"; + //事件订阅取消 + String EVENT_CANCEL = "/api/eventService/v1/eventUnSubscriptionByEventTypes"; //预约免登记 String APPOINTMENT_FREE_REGISTER = "/api/visitor/v1/appointment/registration"; //修改访客预约 @@ -32,8 +36,18 @@ String PERSON_SINGLE_UPDATE = "/api/resource/v1/person/single/update"; //批量删除人员 String PERSON_BATCH_DELETE = "/api/resource/v1/person/batch/delete"; + //根据人脸Id删除人脸 + String PERSON_SINGLE_DELETE = "/api/resource/v1/face/single/delete"; //门禁点反控 String DOOR_CONTROL = "/api/acs/v1/door/doControl"; //查询海康门禁点事件v2 String DOOR_EVENTS = "/api/acs/v2/door/events"; + //批量开卡 + String CARD_BINDING = "/api/cis/v1/card/binding"; + //提取人员照片 + String PERSON_PICTURE = "/api/resource/v1/person/picture"; + //根据人员唯一字段获取人员详细信息 + String PERSON_INFO = "/api/resource/v1/person/condition/personInfo"; + //以图搜图 + String SEARCH_PICTURES = "/api/frs/v1/application/captureSearch"; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/enums/SecurityEventType.java b/casic-server/src/main/java/com/casic/missiles/modular/enums/SecurityEventType.java index d51034c..42eacf8 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/enums/SecurityEventType.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/enums/SecurityEventType.java @@ -14,18 +14,27 @@ Number PERSONNEL_GATHER_EVENT = 131593; //监控点离线事件 Number MONITORING_POINT_OFFLINE = 889196545; + //监控点上线事件 + Number MONITORING_POINT_ONLINE = 889196546; //装置离线 Number DEVICE_OFFLINE = 199710; + //装置连线 + Number DEVICE_ONLINE = 199711; //访客登记 Number VISITOR_REGISTER = 1392513025; //访客签离 Number VISITOR_CHECKOUT = 1392513026; + //高空抛物 + Number HIGH_ALTITUDE_PARABOLIC = 930335; + //下面两个查询海康门禁点事件使用 //合法卡比对通过 Number CARD_COMPARE_PASS = 198914; //人脸认证通过 Number FACE_COMPARE_PASS = 196893; + + // //正常开门 // Number NORMAL_OPENING = 198913; // //按钮开门 @@ -46,7 +55,6 @@ // Number FIREWORKS_DETECTION = 192514; // //陌生人识别事件 // Number STRANGER_RECOGNITION = 1644171265; -// //高空抛物 -// Number HIGH_ALTITUDE_PARABOLIC = 930335; + } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/job/CockpitJob.java b/casic-server/src/main/java/com/casic/missiles/modular/job/CockpitJob.java index 7490a27..85dd016 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/job/CockpitJob.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/job/CockpitJob.java @@ -79,14 +79,6 @@ } }); } - } - /** - * 机动力量实时在岗率,在岗人数除以总应在岗人数,功能待定 - */ -// @Scheduled(cron = "0 0/1 * * * ?") - public void BeOnDutyRatio() { - - } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/service/HikCaseDefineService.java b/casic-server/src/main/java/com/casic/missiles/modular/service/HikCaseDefineService.java index d9bb3a9..18e2936 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/service/HikCaseDefineService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/service/HikCaseDefineService.java @@ -9,5 +9,5 @@ * @Date: 2022/7/21 17:20 */ public interface HikCaseDefineService extends IService { - HikCaseDefine getHikCaseDefine(Long caseTypeCode); + HikCaseDefine getHikCaseDefine(Number caseTypeCode); } 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 dd24101..bcc3b5d 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 @@ -18,6 +18,8 @@ CaseInfo monitorPointOfflineHandle(JSONObject event, CaseInfo caseInfo); + void monitorPointOnlineHandle(JSONObject event); + CaseInfo deviceOfflineHandle(JSONObject event, CaseInfo caseInfo); void propertyAttendanceHandle(JSONObject event); @@ -27,4 +29,6 @@ void visitorRegisterHandler(JSONObject event); void visitorCheckOutHandler(JSONObject event); + + void deviceOnlineHandle(JSONObject event); } 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 e55c016..01870bd 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.StaffCardRequest; import com.casic.missiles.modular.model.StaffInfo; import java.util.List; @@ -28,4 +29,6 @@ StaffInfo selectStaffInfoByCode(StaffInfo staffInfo); List staffInfoList(StaffInfoRequest staffInfoRequest); + + int saveCardInfo(StaffCardRequest staffCardRequest); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/service/impl/BlackInfoServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/service/impl/BlackInfoServiceImpl.java index 8f47b37..981b4cd 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/service/impl/BlackInfoServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/service/impl/BlackInfoServiceImpl.java @@ -17,7 +17,6 @@ import com.casic.missiles.modular.model.BlackInfo; import com.casic.missiles.modular.model.HikFaceGroupInfo; import com.casic.missiles.modular.service.BlackInfoService; -import com.casic.missiles.modular.system.service.ICasicFileService; import com.casic.missiles.modular.util.HikUtil; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; @@ -43,9 +42,6 @@ private HikFaceGroupInfoMapper hikFaceGroupInfoMapper; @Resource - private ICasicFileService fileService; - - @Resource private AbstractDictService dictService; @Override @@ -90,9 +86,6 @@ //设置海康人脸唯一标识、人脸分组唯一标识 blackInfo.setIndexCode(String.valueOf(dataJson.get("indexCode"))); blackInfo.setFaceGroupIndexCode(String.valueOf(dataJson.get("faceGroupIndexCode"))); - //保存图片到本地 - String picUrl = fileService.saveFile(blackInfo.getPicture()); - blackInfo.setPicture(picUrl); //插入数据库 if(blackInfoMapper.insert(blackInfo) > 0){ return ResponseData.success(); @@ -141,8 +134,6 @@ log.error("请求海康,单个修改人脸失败,海康response:{}", resultStr); return ResponseData.error("单个修改人脸失败"); } - String picUrl = fileService.saveFile(blackInfo.getPicture()); - blackInfo.setPicture(picUrl); if(blackInfoMapper.updateById(blackInfo) > 0){ return ResponseData.success(); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/service/impl/CockpitServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/service/impl/CockpitServiceImpl.java index 6e6076e..7402991 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/service/impl/CockpitServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/service/impl/CockpitServiceImpl.java @@ -4,15 +4,12 @@ import cn.hutool.core.date.DateUtil; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.core.application.service.AbstractDictService; import com.casic.missiles.modular.dto.hik.DoorEventsRequest; import com.casic.missiles.modular.enums.HikUri; -import com.casic.missiles.modular.enums.SecurityEventDict; import com.casic.missiles.modular.enums.SecurityEventType; import com.casic.missiles.modular.service.CockpitService; import com.casic.missiles.modular.util.HikUtil; import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.*; @@ -25,8 +22,6 @@ @Slf4j @Service public class CockpitServiceImpl implements CockpitService { - @Autowired - private AbstractDictService dictService; @Override public HashMap dataHandle(DoorEventsRequest doorEventsRequest, HashMap> configMap, HashMap jsonMap, HashMap resultMap) { @@ -36,8 +31,8 @@ Date date = new Date(); DateTime startTimeDate = DateUtil.beginOfDay(date); DateTime endTimeDate = DateUtil.endOfDay(date); - String startTime = DateUtil.format(startTimeDate, "yyyy-MM-dd'T'HH:mm:ss'Z'"); - String endTime = DateUtil.format(endTimeDate, "yyyy-MM-dd'T'HH:mm:ss'Z'"); + String startTime = DateUtil.format(startTimeDate, "yyyy-MM-dd'T'HH:mm:ssXXX"); + String endTime = DateUtil.format(endTimeDate, "yyyy-MM-dd'T'HH:mm:ssXXX"); configMap.keySet().stream().forEach(key -> { List doorIndexCodes = configMap.get(key); doorEventsRequest.setPageNo(1); @@ -95,8 +90,9 @@ return; } Integer num = 0; - while (list.stream().iterator().hasNext()) { - JSONObject next = (JSONObject) list.stream().iterator().next(); + Iterator iterator = list.stream().iterator(); + while (iterator.hasNext()) { + JSONObject next = (JSONObject) iterator.next(); Integer inAndOutType = next.getInteger("inAndOutType"); //进门 if (1 == inAndOutType) { @@ -105,8 +101,8 @@ --num; } } - String dictName = dictService.getDictNameByCode(SecurityEventDict.DEVICE_POSITION, String.valueOf(key)); - resultMap.put(dictName, num); +// String dictName = dictService.getDictNameByCode(SecurityEventDict.DEVICE_POSITION, String.valueOf(key)); + resultMap.put(String.valueOf(key), num); }); return resultMap; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/service/impl/HikCaseDefineServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/service/impl/HikCaseDefineServiceImpl.java index 98ab2a4..1a59c7e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/service/impl/HikCaseDefineServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/service/impl/HikCaseDefineServiceImpl.java @@ -16,7 +16,7 @@ private HikCaseDefineMapper hikCaseDefineMapper; @Override - public HikCaseDefine getHikCaseDefine(Long caseTypeCode) { + public HikCaseDefine getHikCaseDefine(Number caseTypeCode) { return hikCaseDefineMapper.getHikCaseDefine(caseTypeCode); } } 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 b47f78f..dbad48f 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 @@ -58,10 +58,16 @@ 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.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; } @@ -76,10 +82,16 @@ 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.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; } @@ -94,10 +106,16 @@ 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.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; } @@ -109,24 +127,44 @@ 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()); //事件状态(未解决的字典值) + // TODO: 2022/7/28 事件状态字典值选择 + caseInfo.setStatus(dict.get(0).getCode()); //事件状态("未解决"的字典值) DeviceInfo deviceInfo = deviceInfoMapper.getByIndexCode(srcIndex); + if(Objects.isNull(deviceInfo)){ + log.info("接收到监控点离线事件,但数据库中无该事件发生的设备信息"); + return caseInfo; + } 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()); //更新设备状态 // TODO: 2022/7/28 设备离线字典值选择 -// deviceInfo.setStatus(); + List deviceDict = dictService.findInDictByCode(SecurityEventDict.DEVICE_STATUS); + deviceInfo.setStatus(deviceDict.get(1).getCode()); if(deviceInfoMapper.updateById(deviceInfo) <= 0){ + log.error("海康回调,更新监控点离线线状态失败!"); return null; } return caseInfo; } @Override + public void monitorPointOnlineHandle(JSONObject event) { + String srcIndex = event.getString("srcIndex"); + DeviceInfo deviceInfo = deviceInfoMapper.getByIndexCode(srcIndex); + // TODO: 2022/7/28 设备在线字典值选择 + List deviceDict = dictService.findInDictByCode(SecurityEventDict.DEVICE_STATUS); + deviceInfo.setStatus(deviceDict.get(0).getCode()); + if(deviceInfoMapper.updateById(deviceInfo) <= 0){ + log.error("海康回调,更新监控点在线状态失败!"); + } + } + + @Override public CaseInfo deviceOfflineHandle(JSONObject event, CaseInfo caseInfo) { //加入到安防事件 String srcIndex = event.getString("srcIndex"); //海康资源唯一标识 @@ -138,19 +176,40 @@ 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.setDeviceCode(deviceInfo.getDevCode()); //设备code caseInfo.setDevName(deviceInfo.getDevName()); //设备名 caseInfo.setPosition(deviceInfo.getPosition()); //事件位置 caseInfo.setArea(deviceInfo.getArea()); //区域 + caseInfo.setIsKeyArea(deviceInfo.getIsKeyArea()); + caseInfo.setDetailLocation(deviceInfo.getDetailLocation()); //更新设备状态 // TODO: 2022/7/28 设备离线字典值选择 -// deviceInfo.setStatus(); + List deviceDict = dictService.findInDictByCode(SecurityEventDict.DEVICE_STATUS); + deviceInfo.setStatus(deviceDict.get(1).getCode()); if(deviceInfoMapper.updateById(deviceInfo) <= 0){ + log.error("海康回调,更新设备离线状态失败!"); return null; } return caseInfo; } + + @Override + public void deviceOnlineHandle(JSONObject event) { + String srcIndex = event.getString("srcIndex"); + DeviceInfo deviceInfo = deviceInfoMapper.getByIndexCode(srcIndex); + // TODO: 2022/7/28 设备在线字典值选择 + List deviceDict = dictService.findInDictByCode(SecurityEventDict.DEVICE_STATUS); + deviceInfo.setStatus(deviceDict.get(0).getCode()); + if(deviceInfoMapper.updateById(deviceInfo) <= 0){ + log.error("海康回调,更新门禁点装置在线状态失败!"); + } + } + @Override public void propertyAttendanceHandle(JSONObject event) { String srcIndex = event.getString("srcIndex"); @@ -182,8 +241,9 @@ info.setStaffName(staffInfo.getStaffName()); info.setStaffGender(staffInfo.getStaffGender()); // TODO: 2022/7/29 物业人员字典值选择 -// info.setStaffType(); -// info.setStaffTypeName(); + List staffDict = dictService.findInDictByCode(SecurityEventDict.STAFF_TYPE); + info.setStaffType(staffDict.get(0).getCode()); + info.setStaffTypeName(staffDict.get(0).getName()); info.setAtteDate(DateUtil.today()); info.setAtteStartTime(happenTime); info.setAtteStartDev(deviceInfo.getDevCode()); @@ -226,8 +286,9 @@ info.setStaffName(staffInfo.getStaffName()); info.setStaffGender(staffInfo.getStaffGender()); // TODO: 2022/7/29 安保人员字典值选择 -// info.setStaffType(); -// info.setStaffTypeName(); + List staffDict = dictService.findInDictByCode(SecurityEventDict.STAFF_TYPE); + info.setStaffType(staffDict.get(1).getCode()); + info.setStaffTypeName(staffDict.get(1).getName()); info.setAtteDate(DateUtil.today()); info.setAtteStartTime(happenTime); info.setAtteStartDev(deviceInfo.getDevCode()); @@ -259,8 +320,12 @@ visitInfo.setVisitReason(data.getString("purpose")); visitInfo.setPicUri(data.getString("captureUrl")); visitInfo.setServerIndexCode(data.getString("svrIndexCode")); - visitInfo.setVisitPosition(deviceInfo.getPosition()); - + visitInfo.setOrderId(data.getString("visitorId")); + if(!Objects.isNull(deviceInfo)){ + visitInfo.setVisitPosition(deviceInfo.getPosition()); + } else{ + log.info("识别访客的门禁不在数据库中"); + } if(visitInfoMapper.insert(visitInfo) <= 0){ log.error("新增访客记录异常"); } 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 b416f5c..d19dceb 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 @@ -10,12 +10,12 @@ import com.casic.missiles.modular.dto.StaffInfoRequest; import com.casic.missiles.modular.dto.hik.PersonBatchDeleteRequest; import com.casic.missiles.modular.dto.hik.PersonSingleAddOrUpdateRequest; +import com.casic.missiles.modular.dto.hik.StaffCardRequest; import com.casic.missiles.modular.enums.HikUri; import com.casic.missiles.modular.enums.SecurityEventDict; import com.casic.missiles.modular.model.DeviceInfo; import com.casic.missiles.modular.model.StaffInfo; import com.casic.missiles.modular.service.StaffInfoService; -import com.casic.missiles.modular.system.service.ICasicFileService; import com.casic.missiles.modular.util.Base64Util; import com.casic.missiles.modular.util.HikUtil; import lombok.extern.slf4j.Slf4j; @@ -51,9 +51,6 @@ @Resource private Validator validator; - @Resource - private ICasicFileService fileService; - @Value("${casic.file.uploadPath}") private String uploadPath; @@ -80,8 +77,6 @@ if(!Objects.isNull(staff)){ return ResponseData.error("数据已存在"); } - String picUrl = fileService.saveFile(staffInfo.getPicture()); - staffInfo.setPicture(picUrl); //添加人员到海康 PersonSingleAddOrUpdateRequest personSingleAddOrUpdateRequest = new PersonSingleAddOrUpdateRequest(); @@ -117,9 +112,6 @@ @Override @Transactional(rollbackFor = Exception.class) public Object updateStaffInfo(StaffInfo staffInfo) { - String picUrl = fileService.saveFile(staffInfo.getPicture()); - staffInfo.setPicture(picUrl); - //修改人员到海康 PersonSingleAddOrUpdateRequest personSingleAddOrUpdateRequest = new PersonSingleAddOrUpdateRequest(); personSingleAddOrUpdateRequest.setPersonId(staffInfo.getStaffCode()); @@ -162,7 +154,13 @@ String body = JSONObject.toJSONString(personBatchDeleteRequest); String resultStr = HikUtil.hikApi(HikUri.PERSON_BATCH_DELETE, body); JSONObject resultJson = (JSONObject)JSONObject.parse(resultStr); - if (!"0".equals(resultJson.get("code"))) { + //人脸要单独删除 + PersonBatchDeleteRequest personBatchDeleteRequest2 = new PersonBatchDeleteRequest(); + personBatchDeleteRequest2.setFaceId(staffInfo.getStaffFaceId()); + String body2 = JSONObject.toJSONString(personBatchDeleteRequest2); + String resultStr2 = HikUtil.hikApi(HikUri.PERSON_SINGLE_DELETE, body2); + JSONObject resultJson2 = (JSONObject)JSONObject.parse(resultStr2); + if (!"0".equals(resultJson.get("code")) && !"0".equals(resultJson2.get("code")) ) { log.error("请求海康,单个删除人员失败,海康response:{}", resultStr); return ResponseData.error("单个删除人员失败"); } @@ -269,4 +267,21 @@ } return null; } + + @Override + @Transactional(rollbackFor = Exception.class) + public int saveCardInfo(StaffCardRequest staffCardRequest) { + List numFlag = new ArrayList<>(); + staffCardRequest.getCardList().forEach(cardInfo -> { + String staffCode = cardInfo.getPersonId(); + String cardNo = cardInfo.getCardNo(); + if(staffInfoMapper.updateByCodeForCard(staffCode, cardNo) > 0){ + numFlag.add(cardNo); + } + }); + if(staffCardRequest.getCardList().size() != numFlag.size()){ + return 0; + } + return 1; + } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/BlackListController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/BlackListController.java index a27f9f8..0c06661 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/BlackListController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/BlackListController.java @@ -1,13 +1,18 @@ package com.casic.missiles.modular.controller; +import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.base.controller.ExportController; import com.casic.missiles.core.page.PageFactory; import com.casic.missiles.model.response.ResponseData; import com.casic.missiles.modular.dto.BlackInfoRequest; +import com.casic.missiles.modular.dto.BlackPictureRequest; +import com.casic.missiles.modular.dto.hik.PersonInfoRequest; +import com.casic.missiles.modular.enums.HikUri; import com.casic.missiles.modular.enums.OperateTypeEnum; import com.casic.missiles.modular.model.BlackInfo; import com.casic.missiles.modular.service.BlackInfoService; +import com.casic.missiles.modular.util.HikUtil; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; @@ -56,4 +61,22 @@ return null; } + /** + * 黑名单人员照片 + */ + @PostMapping("/personPicture") + @ResponseBody + public Object personPicture(@RequestBody BlackPictureRequest blackPictureRequest){ + //获取照片 + String picUri = blackPictureRequest.getPicUri(); + String serverIndexCode = blackPictureRequest.getServerIndexCode(); + PersonInfoRequest picRequest = new PersonInfoRequest(); + picRequest.setPicUri(picUri); + picRequest.setServerIndexCode(serverIndexCode); + String reBody = JSONObject.toJSONString(picRequest); + //重定向地址获取 + String url = HikUtil.hikApiFor302(HikUri.PERSON_PICTURE, reBody); + return ResponseData.success(url); + } + } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/DeviceController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/DeviceController.java index e1c4eba..666bbee 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/DeviceController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/DeviceController.java @@ -107,7 +107,7 @@ } /** - * 设备维修管理查询(分页),需计算MTTR=总维修时间/故障次数 + * 设备状态计算与评判/设备维修管理查询(分页),需计算MTTR=总维修时间/故障次数 */ @PostMapping("/repair/listPage") @ResponseBody @@ -211,7 +211,7 @@ //需根据设备编号获取到对应的门禁点唯一标识 doorControlRequest.setDoorIndexCodes(indexCodes); doorControlRequest.setControlType(Integer.valueOf(gateGroupDTO.getStatus())); - String body = JSONObject.toJSONString(deviceCodes); + String body = JSONObject.toJSONString(doorControlRequest); String resultStr = HikUtil.hikApi(HikUri.DOOR_CONTROL, body); JSONObject resultJson = (JSONObject)JSONObject.parse(resultStr); if (!"0".equals(resultJson.get("code"))) { diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/StaffController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/StaffController.java index b58ccab..704093c 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/StaffController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/StaffController.java @@ -2,15 +2,21 @@ import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.util.StrUtil; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.base.controller.ExportController; import com.casic.missiles.core.page.PageFactory; import com.casic.missiles.model.response.ErrorResponseData; import com.casic.missiles.model.response.ResponseData; import com.casic.missiles.modular.dto.StaffInfoRequest; +import com.casic.missiles.modular.dto.hik.PersonInfoRequest; +import com.casic.missiles.modular.dto.hik.StaffCardRequest; +import com.casic.missiles.modular.enums.HikUri; import com.casic.missiles.modular.enums.OperateTypeEnum; import com.casic.missiles.modular.model.StaffInfo; import com.casic.missiles.modular.service.StaffInfoService; +import com.casic.missiles.modular.util.HikUtil; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; @@ -110,4 +116,60 @@ } return ResponseData.success(); } + + /** + * 批量开卡,添加人员之后调用,若在一个接口中添加人员成功开卡失败则第二次添加时会有问题 + */ + @PostMapping("/cardBinding") + @ResponseBody + public Object cardBinding(@RequestBody StaffCardRequest staffCardRequest) { + String body = JSONObject.toJSONString(staffCardRequest); + String resultStr = HikUtil.hikApi(HikUri.CARD_BINDING, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (!"0".equals(resultJson.get("code"))) { + log.error("请求海康,批量开卡失败,海康response:{}", resultStr); + return ResponseData.error("批量开卡失败"); + } + //保存卡号 + if(staffInfoService.saveCardInfo(staffCardRequest) > 0){ + return ResponseData.success(); + } + return ResponseData.error("批量开卡失败"); + } + + /** + * 获取员工照片,海康存储 + */ + @PostMapping("/personPicture/{staffCode}") + @ResponseBody + public Object personPicture(@PathVariable("staffCode") String staffCode){ + //获取员工详细信息,含图片服务器、uri + PersonInfoRequest request = new PersonInfoRequest(); + List list = new ArrayList<>(); + list.add(staffCode); + request.setParamName("personId"); + request.setParamValue(list); + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi(HikUri.PERSON_INFO, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (!"0".equals(resultJson.get("code"))) { + log.error("请求海康,根据人员唯一字段获取人员详细信息失败,海康response:{}", resultStr); + return ResponseData.error("获取员工照片失败"); + } + //获取照片 + JSONObject data = (JSONObject) resultJson.get("data"); + JSONArray dataArray = (JSONArray) data.get("list"); + JSONObject jsonObject = (JSONObject) dataArray.get(0); + JSONArray personPhoto = (JSONArray) jsonObject.get("personPhoto"); + JSONObject photo = (JSONObject) personPhoto.get(0); + String picUri = photo.getString("picUri"); + String serverIndexCode = photo.getString("serverIndexCode"); + PersonInfoRequest picRequest = new PersonInfoRequest(); + picRequest.setPicUri(picUri); + picRequest.setServerIndexCode(serverIndexCode); + String reBody = JSONObject.toJSONString(picRequest); + //重定向地址获取 + String url = HikUtil.hikApiFor302(HikUri.PERSON_PICTURE, reBody); + return ResponseData.success(url); + } } 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 4a07dd9..7b1dcf6 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 @@ -16,6 +16,7 @@ import com.casic.missiles.modular.redis.key.CacheKeys; import com.casic.missiles.modular.service.CockpitService; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.util.CollectionUtils; import org.springframework.web.bind.annotation.*; @@ -24,10 +25,7 @@ import java.text.NumberFormat; import java.time.LocalDateTime; import java.time.temporal.ChronoUnit; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.util.*; import java.util.stream.Collectors; /** @@ -73,6 +71,9 @@ private StatisticNumberMapper numberMapper; @Autowired + private HazardLevelMapper hazardLevelMapper; + + @Autowired private AccessGroupConfig accessGroupConfig; /** @@ -104,8 +105,24 @@ public Object buildingNumberPerHour(){ //当天按小时分组的人数 List list = numberMapper.selectListByTime(); - Map> collect = list.stream().collect(Collectors.groupingBy(BuildingNumberDTO::getStatisticPosition)); - return ResponseData.success(collect); + Map> collect = list.stream().collect(Collectors.groupingBy(BuildingNumberDTO::getStatisticTime)); + //定时任务中已将每小时三栋楼人数存到数据库 + //将一期主楼和录制楼人数合并,二期单算 + List> resultList = new ArrayList<>(); + collect.keySet().forEach(key -> { + List buildingNumberDTOS = collect.get(key); + BuildingNumberDTO mainBuildingOne = buildingNumberDTOS.get(0); + BuildingNumberDTO mainBuildingTwo = buildingNumberDTOS.get(1); + BuildingNumberDTO recordingBuilding = buildingNumberDTOS.get(2); + HashMap resultMap = new HashMap<>(); + Integer oneQuantity = Integer.valueOf(mainBuildingOne.getStatisticQuantity()); + Integer recordingQuantity = Integer.valueOf(recordingBuilding.getStatisticQuantity()); + resultMap.put("staticTime", mainBuildingOne.getStatisticTime()); + resultMap.put(mainBuildingOne.getStatisticPositionName()+"、"+recordingBuilding.getStatisticPositionName(), String.valueOf(oneQuantity+recordingQuantity)); + resultMap.put(mainBuildingTwo.getStatisticPositionName(), mainBuildingTwo.getStatisticQuantity()); + resultList.add(resultMap); + }); + return ResponseData.success(resultList); } /** @@ -151,12 +168,11 @@ public Object securityNumber() { QueryWrapper wrapper = new QueryWrapper<>(); wrapper.eq("staff_type", 2); + // TODO: 2022/9/2 后续使用产品确定的每天出勤的安保人员的数量 Integer total = staffInfoMapper.selectCount(wrapper); - //当日离岗事件个数 - QueryWrapper wrapper1 = new QueryWrapper<>(); - wrapper1.eq("hik_event_type", SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); - wrapper1.apply("date_format(now(),'%Y-%m-%d') = date_format(happen_time,'%Y-%m-%d')"); - Integer leave = caseInfoMapper.selectCount(wrapper1); + //当日离岗事件按设备去重后的个数 + // TODO: 2022/9/2 目前相当于24小时内的计算,之后看需要可改成自定义小时数计算离岗率,即离岗+6小时内仅一次离岗则恢复为100%,多次则累加离岗次数计算离岗率 + Integer leave = caseInfoMapper.selectDemobilizedCount(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); NumberFormat numberFormat = NumberFormat.getInstance(); // 设置精确到小数点后2位 numberFormat.setMaximumFractionDigits(2); @@ -179,7 +195,6 @@ @ResponseBody public Object visitorApplyDetail() { List reasonGroup = applyMapper.selectByVisitReason(); - HashMap resultMap = new HashMap<>(); NumberFormat numberFormat = NumberFormat.getInstance(); // 设置精确到小数点后2位 numberFormat.setMaximumFractionDigits(2); @@ -187,12 +202,17 @@ if(0 == sum){ return ResponseData.success(); } + List resultList = new ArrayList<>(); reasonGroup.forEach(group -> { String reasonName = dictService.getDictNameByCode(SecurityEventDict.VISIT_REASON, group.getVisitReason()); String result = numberFormat.format((float) group.getQuantity() / (float) sum * 100); - resultMap.put(reasonName, result+"%"); + ApplyReasonGroupDTO applyReasonGroupDTO = new ApplyReasonGroupDTO(); + applyReasonGroupDTO.setQuantity(group.getQuantity()); + applyReasonGroupDTO.setVisitReason(reasonName); + applyReasonGroupDTO.setRatio(result+"%"); + resultList.add(applyReasonGroupDTO); }); - return ResponseData.success(resultMap); + return ResponseData.success(resultList); } /** @@ -247,6 +267,32 @@ } /** + * 机动力量实时在岗率,在岗人数除以总应在岗人数,用离岗+6小时内恢复为100%,6小时外再计算 + */ + @GetMapping("/staff/beOnDutyRatio") + @ResponseBody + public Object beOnDutyRatio() { + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("staff_type", 2); + // TODO: 2022/9/2 后续使用产品确定的每天出勤的安保人员的数量 + Integer total = staffInfoMapper.selectCount(wrapper); + if(0 == total){ + return ResponseData.success(null); + } + //当日离岗事件按设备去重后的个数 + // TODO: 2022/9/2 目前相当于24小时内的计算,之后看需要可改成自定义小时数计算离岗率,即离岗+6小时内仅一次离岗则恢复为100%,多次则累加离岗次数计算离岗率 + List onDutyRatioDTOS = caseInfoMapper.selectDemobilizedCountByHour(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); + onDutyRatioDTOS.forEach(dto -> { + NumberFormat numberFormat = NumberFormat.getInstance(); + // 设置精确到小数点后2位 + numberFormat.setMaximumFractionDigits(2); + String result = numberFormat.format(100 - Float.valueOf(dto.getQuantity()) / (float) total * 100); + dto.setRatio(result+"%"); + }); + return ResponseData.success(onDutyRatioDTOS); + } + + /** * 闸机速通门统计-设备状态分组计算数量,devType传闸机字典key * 视频频监控摄像机统计-设备状态分组计算数量,devType传摄像头字典key */ @@ -262,12 +308,17 @@ if(sum <= 0){ return ResponseData.error("无该类设备信息"); } + List resultList = new ArrayList<>(); gateStatusGroup.forEach(group -> { String devStatus = dictService.getDictNameByCode(SecurityEventDict.DEVICE_STATUS, group.getStatus()); String result = numberFormat.format((float) group.getQuantity() / (float) sum * 100); - resultMap.put(devStatus, result+"%"); + GateStatusGroupResponse gateStatusGroupResponse = new GateStatusGroupResponse(); + gateStatusGroupResponse.setStatus(devStatus); + gateStatusGroupResponse.setRatio(result+"%"); + resultList.add(gateStatusGroupResponse); }); - resultMap.put("总", sum); + resultMap.put("total", sum); + resultMap.put("list", resultList); return ResponseData.success(resultMap); } @@ -282,17 +333,38 @@ String position = securityScoreDTO.getPosition(); List caseInfos = caseInfoMapper.selectByPosition(position); //查询各危险级别权重、各类别权重,放入map,避免循环中多次查数据库 - + HashMap hazardScoreMap = new HashMap<>(); + List caseHazardLevelList = hazardLevelMapper.getCaseHazardLevelList(null); + caseHazardLevelList.forEach(hazardLevel -> { + hazardScoreMap.put(hazardLevel.getCode(), hazardLevel.getWeight()); + }); + HashMap categoryScoreMap = new HashMap<>(); + List categoryLevelList = categoryLevelMapper.getCaseCategoryLevelList(null); + categoryLevelList.forEach(categoryLevel -> { + categoryScoreMap.put(categoryLevel.getCode(), categoryLevel.getWeight()); + }); + //事件按楼层分组,计算 List securityScoreDTOs = new ArrayList<>(); caseInfos.forEach(caseInfo -> { SecurityScoreDTO securityScoreDTO1 = new SecurityScoreDTO(); + securityScoreDTO1.setPosition(caseInfo.getPosition()); securityScoreDTO1.setArea(caseInfo.getArea()); - // TODO: 2022/8/4 楼层评分计算根据产品定义调整 -// caseInfo.get -// securityScoreDTO1.setScore(); + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); + Double score = 100 - Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + securityScoreDTO1.setScore(score); + securityScoreDTOs.add(securityScoreDTO1); }); - - return null; + 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); + }); + return ResponseData.success(securityScoreDTOs); } /** @@ -303,9 +375,13 @@ public Object SecurityFrequency(@RequestBody SecurityFrequencyDTO securityFrequencyDTO) { String year = securityFrequencyDTO.getYear(); String month = securityFrequencyDTO.getMonth(); - Integer quantity = caseInfoMapper.selectCountByMonth(year, month); - securityFrequencyDTO.setQuantity(quantity); - return ResponseData.success(securityFrequencyDTO); + if(!StringUtils.isEmpty(year) && StringUtils.isEmpty(month)){ + Integer quantity = caseInfoMapper.selectCountByMonth(year, month); + securityFrequencyDTO.setQuantity(quantity); + return ResponseData.success(securityFrequencyDTO); + } + List list = caseInfoMapper.selectPreMonthCount(); + return ResponseData.success(list); } } 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 ae4d770..f4f075c 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 @@ -1,20 +1,25 @@ package com.casic.missiles.modular.controller.cockpit; +import cn.hutool.core.date.DateUnit; import cn.hutool.core.date.DateUtil; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.casic.missiles.model.response.ResponseData; -import com.casic.missiles.modular.dao.AttendanceInfoMapper; -import com.casic.missiles.modular.dao.CaseInfoMapper; -import com.casic.missiles.modular.dao.HazardLevelMapper; -import com.casic.missiles.modular.dao.StaffInfoMapper; +import com.casic.missiles.modular.dao.*; +import com.casic.missiles.modular.dto.DeviceRepairLogDTO; +import com.casic.missiles.modular.dto.DeviceRepairRequest; import com.casic.missiles.modular.dto.statistics.*; +import com.casic.missiles.modular.enums.SecurityEventType; +import com.casic.missiles.modular.model.CaseCategoryLevel; import com.casic.missiles.modular.model.CaseHazardLevel; +import com.casic.missiles.modular.model.CaseInfo; import com.casic.missiles.modular.model.StaffInfo; +import com.casic.missiles.modular.service.DeviceInfoService; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.util.CollectionUtils; import org.springframework.web.bind.annotation.*; +import java.math.BigDecimal; import java.text.NumberFormat; import java.util.*; import java.util.stream.Collectors; @@ -40,6 +45,12 @@ @Autowired private HazardLevelMapper hazardLevelMapper; + @Autowired + private CategoryLevelMapper categoryLevelMapper; + + @Autowired + private DeviceInfoService deviceInfoService; + /** * 安防事件时域频次统计,每月的每天安防事件个数(原方案) * 月维度:展示每个月的每天的数据 @@ -89,15 +100,17 @@ List monthList = caseInfoMapper.selectPreMonthCountByYear(year); Map> collect = monthList.stream().collect(Collectors.groupingBy(PreMonthOrWeekCaseDTO::getHazardLevelCode)); HashMap strAvgMap = new HashMap<>(); + List resultList = new ArrayList<>(); for (String key : collect.keySet()) { List preMonthOrWeekCaseDTOS = collect.get(key); int sum = preMonthOrWeekCaseDTOS.stream().mapToInt(PreMonthOrWeekCaseDTO::getQuantity).sum(); //若年份是本年,则使用个安防级别数量/当前月份数 //若不是本年,除数为12 MonthAndWeekDTO monthAndWeekDTO = new MonthAndWeekDTO(); + String hazardName = hazardLevelMapper.selectHazardNameByCode(key); + monthAndWeekDTO.setLevelName(hazardName); if(year.equals(String.valueOf(DateUtil.thisYear()))){ monthAndWeekDTO.setMonthQuantity(sum / DateUtil.thisMonth()); -// monthAndWeekDTO.setLevelName(); strAvgMap.put(key, monthAndWeekDTO); }else{ monthAndWeekDTO.setMonthQuantity(sum / 12); @@ -113,27 +126,37 @@ if(year.equals(String.valueOf(DateUtil.thisYear()))){ if(!Objects.isNull(strAvgMap.get(key))){ MonthAndWeekDTO monthAndWeekDTO = strAvgMap.get(key); + String hazardName = hazardLevelMapper.selectHazardNameByCode(key); + monthAndWeekDTO.setLevelName(hazardName); monthAndWeekDTO.setWeekQuantity(sum / DateUtil.thisWeekOfYear()); strAvgMap.put(key, monthAndWeekDTO); }else{ MonthAndWeekDTO monthAndWeekDTO = new MonthAndWeekDTO(); + String hazardName = hazardLevelMapper.selectHazardNameByCode(key); + monthAndWeekDTO.setLevelName(hazardName); monthAndWeekDTO.setWeekQuantity(sum / DateUtil.thisWeekOfYear()); strAvgMap.put(key, monthAndWeekDTO); } }else{ if(!Objects.isNull(strAvgMap.get(key))){ MonthAndWeekDTO monthAndWeekDTO = strAvgMap.get(key); + String hazardName = hazardLevelMapper.selectHazardNameByCode(key); + monthAndWeekDTO.setLevelName(hazardName); monthAndWeekDTO.setWeekQuantity(sum / 52); strAvgMap.put(key, monthAndWeekDTO); }else{ MonthAndWeekDTO monthAndWeekDTO = new MonthAndWeekDTO(); + String hazardName = hazardLevelMapper.selectHazardNameByCode(key); + monthAndWeekDTO.setLevelName(hazardName); monthAndWeekDTO.setWeekQuantity(sum / 52); strAvgMap.put(key, monthAndWeekDTO); } } } - avgMonthAndWeekGroupDTO.setMap(strAvgMap); - return ResponseData.success(avgMonthAndWeekGroupDTO); + strAvgMap.keySet().forEach(key -> { + resultList.add(strAvgMap.get(key)); + }); + return ResponseData.success(resultList); } /** @@ -181,12 +204,178 @@ } /** - * 员工考勤人数变化,功能待定 + * 员工考勤人数变化,统计当天(横坐标为时)及近7天(横坐标为天)的考勤人数变化,只要发生一次考勤识别,次数的基数就正常增加(没有上班下班区分) */ + @PostMapping("/staff/attendanceNumber/{dimension}") + @ResponseBody + public Object attendanceNumber(@PathVariable("dimension") String dimension) { + List attendanceNumberDTOs = null; + List> resultList = new ArrayList<>(); + if("week".equals(dimension)){ + //近7天数据按天分组统计 + attendanceNumberDTOs = attendanceInfoMapper.getCountForWeek(); + }else if("day".equals(dimension)) { + //今天数据按小时分组统计 + attendanceNumberDTOs = attendanceInfoMapper.getCountForDay(); + } + if(CollectionUtils.isEmpty(attendanceNumberDTOs)){ + return ResponseData.error("该查询条件下,无员工出勤数据!"); + } + Map> collect = attendanceNumberDTOs.stream().collect(Collectors.groupingBy(AttendanceNumberDTO::getDate)); + collect.keySet().forEach(key -> { + List attendanceNumberDTOS = collect.get(key); + AttendanceNumberDTO attendanceNumberDTO = attendanceNumberDTOS.get(0); + AttendanceNumberDTO attendanceNumberDTO2 = attendanceNumberDTOS.get(1); + Map resultMap = new HashMap<>(); + resultMap.put(attendanceNumberDTO.getStaffType(), attendanceNumberDTO.getQuantity()); + resultMap.put(attendanceNumberDTO2.getStaffType(), attendanceNumberDTO2.getQuantity()); + resultMap.put("staticTime", attendanceNumberDTO.getDate()); + resultList.add(resultMap); + }); + return ResponseData.success(resultList); + } /** - * 近30天/近一周安保人员到岗排行 + * 早晚高峰区域安防评估 */ + @PostMapping("/security/assessment/{dimension}") + @ResponseBody + public Object securityAssessment(@PathVariable("dimension") String dimension) { + //查询各危险级别权重、各类别权重,放入map,避免循环中多次查数据库 + HashMap hazardScoreMap = new HashMap<>(); + List caseHazardLevelList = hazardLevelMapper.getCaseHazardLevelList(null); + caseHazardLevelList.forEach(hazardLevel -> { + hazardScoreMap.put(hazardLevel.getCode(), hazardLevel.getWeight()); + }); + HashMap categoryScoreMap = new HashMap<>(); + List categoryLevelList = categoryLevelMapper.getCaseCategoryLevelList(null); + categoryLevelList.forEach(categoryLevel -> { + categoryScoreMap.put(categoryLevel.getCode(), categoryLevel.getWeight()); + }); + HashMap hashMap = new HashMap<>(); + if("week".equals(dimension)){ + //近7天早晚高峰数据 + List caseInfos = caseInfoMapper.selectListBySevenDay(); + //按时间(天)进行分组 + caseInfos.forEach(caseInfo -> { + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); + Double score = Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + String[] array = caseInfo.getHappenTime().split(" "); + String dayTime = array[0]; + BigDecimal preScore; + if(hashMap.containsKey(dayTime)){ + Double aDouble = hashMap.get(dayTime); + preScore = new BigDecimal(aDouble.toString()); + + }else{ + preScore = new BigDecimal("100.0"); + } + BigDecimal nowScore = new BigDecimal(score.toString()); + hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); + }); + return ResponseData.success(hashMap); + }else if("day".equals(dimension)) { + //今天数据按小时分组统计 + List caseInfos = caseInfoMapper.selectListByToday(); + caseInfos.forEach(caseInfo -> { + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); + Double score = Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + String[] array = caseInfo.getHappenTime().split(":"); + String dayTime = array[0]; + BigDecimal preScore; + if(hashMap.containsKey(dayTime)){ + Double aDouble = hashMap.get(dayTime); + preScore = new BigDecimal(aDouble.toString()); + + }else{ + preScore = new BigDecimal("100.0"); + } + BigDecimal nowScore = new BigDecimal(score.toString()); + hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); + }); + return ResponseData.success(hashMap); + } + return null; + } + + /** + * 重点区域安防事态评估,统计重点区域6:00-23:00按小时分组数据 + */ + @GetMapping("/security/keyAreaStatistic") + @ResponseBody + public Object keyAreaStatistic() { + //查询各危险级别权重、各类别权重,放入map,避免循环中多次查数据库 + HashMap hazardScoreMap = new HashMap<>(); + List caseHazardLevelList = hazardLevelMapper.getCaseHazardLevelList(null); + caseHazardLevelList.forEach(hazardLevel -> { + hazardScoreMap.put(hazardLevel.getCode(), hazardLevel.getWeight()); + }); + HashMap categoryScoreMap = new HashMap<>(); + List categoryLevelList = categoryLevelMapper.getCaseCategoryLevelList(null); + categoryLevelList.forEach(categoryLevel -> { + categoryScoreMap.put(categoryLevel.getCode(), categoryLevel.getWeight()); + }); + HashMap hashMap = new HashMap<>(); + //今天数据按小时分组统计 + List caseInfos = caseInfoMapper.selectListByToday2(); + caseInfos.forEach(caseInfo -> { + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); + Double score = Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + String[] array = caseInfo.getHappenTime().split(":"); + String dayTime = array[0]; + BigDecimal preScore; + if(hashMap.containsKey(dayTime)){ + Double aDouble = hashMap.get(dayTime); + preScore = new BigDecimal(aDouble.toString()); + + }else{ + preScore = new BigDecimal("100.0"); + } + BigDecimal nowScore = new BigDecimal(score.toString()); + hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); + }); + return ResponseData.success(hashMap); + } + + /** + * 安防机动支援力量调配响应评估,根据事件已解决状态及已解决时间-发送时间,按时间(小时)分组统计 + */ + @GetMapping("/security/responseAssess") + @ResponseBody + public Object responseAssess() { + //查询各危险级别权重、各类别权重,放入map,避免循环中多次查数据库 + HashMap hazardScoreMap = new HashMap<>(); + List caseHazardLevelList = hazardLevelMapper.getCaseHazardLevelList(null); + caseHazardLevelList.forEach(hazardLevel -> { + hazardScoreMap.put(hazardLevel.getCode(), hazardLevel.getWeight()); + }); + HashMap hashMap = new HashMap<>(); + //今天数据按小时分组统计 + List caseInfos = caseInfoMapper.selectListByToday3(); + caseInfos.forEach(caseInfo -> { + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + //扣分=事件级别权重*未解决小时数 + Date updateTime = DateUtil.parse(caseInfo.getUpdateTime()); + Date happenTime = DateUtil.parse(caseInfo.getHappenTime()); + long between = DateUtil.between(updateTime, happenTime, DateUnit.HOUR); + Double score = Double.valueOf(hazardWeight)*between; + String[] array = caseInfo.getHappenTime().split(":"); + String dayTime = array[0]; + BigDecimal preScore; + if(hashMap.containsKey(dayTime)){ + Double aDouble = hashMap.get(dayTime); + preScore = new BigDecimal(aDouble.toString()); + }else{ + preScore = new BigDecimal("100.0"); + } + BigDecimal nowScore = new BigDecimal(score.toString()); + hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); + }); + return ResponseData.success(hashMap); + } /** * 重点区域威胁事件类型统计,优先级2,统计近7天和近30天 @@ -224,7 +413,34 @@ } /** - * 设备状态计算系数和评判,优先级3,需确认设备恢复时间是否可以获取 + * 近30天/近一周安保人员到岗排行 */ + + /** + * 安保等级评估,发生离岗事件减1分 + */ + @GetMapping("/security/levelAssess") + @ResponseBody + public Object securityLevelAssess() { + //今天数据按小时分组统计 + List resultList = caseInfoMapper.selectListByType(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); + resultList.forEach(result -> { + BigDecimal deScore = new BigDecimal(result.getQuantity()); + BigDecimal preScore = new BigDecimal("100.0"); + result.setScore(preScore.subtract(deScore).doubleValue()); + }); + return ResponseData.success(resultList); + } + + /** + * 设备状态计算系数和评判,即设备维修管理查询(不分页) + */ + @PostMapping("/device/repairList") + @ResponseBody + public Object repairList(@RequestBody DeviceRepairRequest deviceRepairRequest) { + List deviceRepairLogDTOS = deviceInfoService.deviceRepairListPage(deviceRepairRequest); + return ResponseData.success(deviceRepairLogDTOS); + } + } 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 fbf8ab6..c71a15a 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 @@ -1,13 +1,12 @@ package com.casic.missiles.modular.controller.hik; +import cn.hutool.core.date.DateTime; +import cn.hutool.core.date.DateUtil; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.casic.missiles.model.response.ResponseData; import com.casic.missiles.modular.dao.HikFaceGroupInfoMapper; -import com.casic.missiles.modular.dto.hik.EventSubscribeRequest; -import com.casic.missiles.modular.dto.hik.FaceGroupAdditionRequest; -import com.casic.missiles.modular.dto.hik.HikRecvEvent; -import com.casic.missiles.modular.dto.hik.OrgBatchAdd; +import com.casic.missiles.modular.dto.hik.*; import com.casic.missiles.modular.enums.HikUri; import com.casic.missiles.modular.enums.SecurityEventType; import com.casic.missiles.modular.model.CaseInfo; @@ -18,16 +17,20 @@ import com.casic.missiles.modular.util.CaseInfoFactoryUtil; import com.casic.missiles.modular.util.HikUtil; import com.casic.missiles.modular.util.ThreadPoolUtil; +import com.casic.missiles.modular.util.WebSocket; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; -import org.springframework.web.bind.annotation.*; +import org.springframework.util.CollectionUtils; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.RestController; -import java.net.InetAddress; -import java.net.UnknownHostException; import java.util.ArrayList; +import java.util.Iterator; import java.util.List; import java.util.Objects; @@ -38,7 +41,6 @@ */ @Slf4j @RestController -@RequestMapping("/hik") public class HikController { @Autowired @@ -53,28 +55,37 @@ @Autowired private HikService hikService; + @Autowired + private HikFaceGroupInfoMapper hikFaceGroupInfoMapper; + + @Autowired + private WebSocket webSocket; + @Value("${server.port}") private int serverPort; - @Autowired - private HikFaceGroupInfoMapper hikFaceGroupInfoMapper; /** * 海康事件订阅 */ - @PostMapping("/event/subscribe") + @PostMapping("/hik/event/subscribe") @ResponseBody - public Object eventSubscribe() throws UnknownHostException { + public Object eventSubscribe() { EventSubscribeRequest eventSubscribeRequest = new EventSubscribeRequest(); ArrayList list = new ArrayList<>(); list.add(SecurityEventType.DEVICE_OFFLINE); + list.add(SecurityEventType.DEVICE_ONLINE); list.add(SecurityEventType.KEY_PERSONNEL_IDENTIFY_EVENT); list.add(SecurityEventType.MONITORING_POINT_OFFLINE); + list.add(SecurityEventType.MONITORING_POINT_ONLINE); list.add(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); list.add(SecurityEventType.PERSONNEL_GATHER_EVENT); - InetAddress localHost = InetAddress.getLocalHost(); + list.add(SecurityEventType.VISITOR_REGISTER); + list.add(SecurityEventType.VISITOR_CHECKOUT); + list.add(SecurityEventType.HIGH_ALTITUDE_PARABOLIC); +// InetAddress localHost = InetAddress.getLocalHost(); eventSubscribeRequest.setEventTypes(list); - eventSubscribeRequest.setEventDest("https://" + localHost + ":" + serverPort + "/eventRcv"); + eventSubscribeRequest.setEventDest("http://" + "192.168.10.6" + ":" + serverPort + "/eventRcv"); //订阅类型,0-订阅原始事件,1-联动事件,2-原始事件和联动事件,不填使用默认值0 eventSubscribeRequest.setSubType(0); /** @@ -92,19 +103,25 @@ } /** + * 查询事件订阅信息 + */ + @PostMapping("/hik/event/query") + @ResponseBody + public Object eventQuery() { + String result = HikUtil.hikApi(HikUri.EVENT_INFO, ""); + return result; + } + + /** * 海康事件接收 */ @PostMapping("/eventRcv") @ResponseBody public Object eventRcv(@RequestBody HikRecvEvent hikRecvEvent) { //1、接收所需事件类型 - Long eventType = hikRecvEvent.getEventType(); + Number eventType = hikRecvEvent.getEventType(); log.info("接收到安防事件类型为:{}", eventType); CaseInfo caseInfo = caseInfoFactoryUtil.getCaseInfo(eventType); - //接收到不关心事件直接返回 - if(Objects.isNull(caseInfo)){ - return ResponseData.success(); - } //2、不同事件不同处理,caseInfoFactoryUtil已设置好事件基础定义信息 // 再为事件添加状态、设备编码、设备名称、位置、区域、时间 // 异步处理事件 @@ -114,19 +131,23 @@ caseHandle(hikRecvEvent, eventType, caseInfo); } })); +// caseHandle(hikRecvEvent, eventType, caseInfo); - return null; + return ResponseData.success(); } - private void caseHandle(HikRecvEvent hikRecvEvent, Long eventType, CaseInfo caseInfo) { + private void caseHandle(HikRecvEvent hikRecvEvent, Number eventType, CaseInfo caseInfo) { JSONArray eventArray = hikRecvEvent.getEventArray(); List caseInfos = new ArrayList<>(); - while (eventArray.stream().iterator().hasNext()) { + Iterator iterator = eventArray.iterator(); + while (iterator.hasNext()) { CaseInfo caseInfo1 = new CaseInfo(); - BeanUtils.copyProperties(caseInfo, caseInfo1); - JSONObject event = (JSONObject) eventArray.stream().iterator().next(); + if(!Objects.isNull(caseInfo)){ + BeanUtils.copyProperties(caseInfo, caseInfo1); + } + JSONObject event = (JSONObject) iterator.next(); //5种事件进行不同处理 - if(SecurityEventType.KEY_PERSONNEL_IDENTIFY_EVENT == eventType){ + if (SecurityEventType.KEY_PERSONNEL_IDENTIFY_EVENT.equals(eventType)) { //判断所属人脸分组 JSONObject data = (JSONObject) event.get("data"); JSONObject faceRecognitionResult = (JSONObject) data.get("faceRecognitionResult"); @@ -142,52 +163,101 @@ if (faceGroupCode.equals(blackListGroup.getFaceGroupCode())) { //黑名单分组处理 caseInfo1 = hikService.blackListHandle(event, caseInfo1); - }else if(faceGroupCode.equals(propertyPersonnelGroup.getFaceGroupCode())){ + } else if (faceGroupCode.equals(propertyPersonnelGroup.getFaceGroupCode())) { //考勤分组处理-物业人员,添加到考勤表 hikService.propertyAttendanceHandle(event); - }else if(faceGroupCode.equals(securityPersonnelGroup.getFaceGroupCode())){ + } else if (faceGroupCode.equals(securityPersonnelGroup.getFaceGroupCode())) { //考勤分组处理-安保人员,添加到考勤表 hikService.securityPersonnelHandle(event); - }else { + } else { return; } - }else if(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT == eventType){ + } else if (SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT.equals(eventType)) { //离岗事件处理 caseInfo1 = hikService.demobilizedHandle(event, caseInfo1); - }else if(SecurityEventType.PERSONNEL_GATHER_EVENT == eventType){ + } else if (SecurityEventType.PERSONNEL_GATHER_EVENT.equals(eventType)) { //人员聚集事件处理 caseInfo1 = hikService.personGatherHandle(event, caseInfo1); - }else if(SecurityEventType.MONITORING_POINT_OFFLINE == eventType){ + } else if (SecurityEventType.MONITORING_POINT_OFFLINE.equals(eventType)) { //监控点离线事件处理 caseInfo1 = hikService.monitorPointOfflineHandle(event, caseInfo1); - }else if(SecurityEventType.DEVICE_OFFLINE == eventType){ + } else if (SecurityEventType.MONITORING_POINT_ONLINE.equals(eventType)) { + //监控点上线事件处理 + hikService.monitorPointOnlineHandle(event); + } else if (SecurityEventType.DEVICE_OFFLINE.equals(eventType)) { //装置离线事件处理 caseInfo1 = hikService.deviceOfflineHandle(event, caseInfo1); - }else if(SecurityEventType.VISITOR_REGISTER == eventType){ + } else if (SecurityEventType.DEVICE_ONLINE.equals(eventType)) { + //装置上线处理 + hikService.deviceOnlineHandle(event); + } else if (SecurityEventType.VISITOR_REGISTER.equals(eventType)) { //记录访客登记记录,添加到访客记录表 hikService.visitorRegisterHandler(event); - }else if(SecurityEventType.VISITOR_CHECKOUT == eventType){ + } else if (SecurityEventType.VISITOR_CHECKOUT.equals(eventType)) { //记录访客签离记录 hikService.visitorCheckOutHandler(event); } - if(!Objects.isNull(caseInfo1) && !StringUtils.isEmpty(caseInfo1.getHappenTime())){ + if (!Objects.isNull(caseInfo1) && !StringUtils.isEmpty(caseInfo1.getHappenTime())) { caseInfos.add(caseInfo1); } } //3、安防事件入库 - if(!caseInfoService.insertCaseInfoBatch(caseInfos)){ - log.error("安防事件批量入库异常"); + if (!CollectionUtils.isEmpty(caseInfos) && !caseInfoService.insertCaseInfoBatch(caseInfos)) { + log.error("安防事件批量入库异常!"); } // TODO: 2022/8/15 webSocket推送 + if (CollectionUtils.isEmpty(caseInfos)) { + log.info("webSocket事件推送"); + webSocket.sendAllMessage(JSONObject.toJSONString(caseInfos)); + } return; } /** + * 以图搜图,前端用于轨迹追踪 + */ + @PostMapping("/hik/search/picture") + @ResponseBody + public Object searchPictures(@RequestBody SearchPicturesRequest searchPicturesRequest) { + DateTime startDateTime = DateUtil.parse(searchPicturesRequest.getStartTime()); + DateTime endDateTime = DateUtil.parse(searchPicturesRequest.getEndTime()); + String startTime = DateUtil.format(startDateTime, "yyyy-MM-dd'T'HH:mm:ss.SSSXXX"); + String endTime = DateUtil.format(endDateTime, "yyyy-MM-dd'T'HH:mm:ss.SSSXXX"); + searchPicturesRequest.setStartTime(startTime); + searchPicturesRequest.setEndTime(endTime); + String body = JSONObject.toJSONString(searchPicturesRequest); + String resultStr = HikUtil.hikApi(HikUri.SEARCH_PICTURES, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (!"0".equals(resultJson.get("code"))) { + log.error("请求海康,以图搜图失败,海康response:{}", resultStr); + return ResponseData.error("以图搜图失败"); + } + return ResponseData.success(resultJson); + } + + + /** + * 海康事件取消订阅 + */ + @PostMapping("/hik/event/cancel") + @ResponseBody + public Object eventCancelSubscribe(@RequestBody CancelSubscribeRequest cancelSubscribeRequest) { + String body = JSONObject.toJSONString(cancelSubscribeRequest); + String resultStr = HikUtil.hikApi(HikUri.EVENT_CANCEL, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (!"0".equals(resultJson.get("code"))) { + log.error("请求海康,取消订阅失败,海康response:{}", resultStr); + return ResponseData.error("取消订阅失败"); + } + return ResponseData.success(resultJson); + } + + /** * 单个添加海康人脸分组 * api->hik单个添加人脸分组api->response->mysql */ - @PostMapping("/faceGroup/single/add") + @PostMapping("/hik/faceGroup/single/add") @ResponseBody public Object faceGroupAddition(@RequestBody FaceGroupAdditionRequest faceGroupAdditionRequest) { String body = JSONObject.toJSONString(faceGroupAdditionRequest); @@ -212,7 +282,7 @@ * 批量添加海康组织 * api->hik批量添加组织api->response */ - @PostMapping("/org/batch/add") + @PostMapping("/hik/org/batch/add") @ResponseBody public Object orgBatchAdd(@RequestBody List orgBatchAddRequest) { String body = JSONObject.toJSONString(orgBatchAddRequest); @@ -232,4 +302,62 @@ return ResponseData.error("批量添加组织失败"); } + /** + * 获取人员列表 + */ + @PostMapping("/hik/person/personList") + @ResponseBody + public Object personList() { + PersonListRequest request = new PersonListRequest(); + request.setPageNo(1); + request.setPageSize(100); + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi("/api/resource/v2/person/personList", body); + return resultStr; + } + + /** + * 获取组织列表 + */ + @PostMapping("/hik/org/orgList") + @ResponseBody + public Object orgList() { + PersonListRequest request = new PersonListRequest(); + request.setPageNo(1); + request.setPageSize(100); + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi("/api/resource/v1/org/orgList", body); + return resultStr; + } + + /** + * 查询访客权限下载记录 + */ + @PostMapping("/hik/auth/result") + @ResponseBody + public Object authResult() { + PersonListRequest request = new PersonListRequest(); + request.setPageNo(1); + request.setPageSize(100); + request.setOrderId("ba101db6246711edaea66f7939a13638"); + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi("/api/visitor/v1/auth/result", body); + return resultStr; + } + + /** + * 人脸图片获取 + */ + @PostMapping("/hik/face/picture") + @ResponseBody + public Object facePicture() { + FaceRequest request = new FaceRequest(); +// List list = new ArrayList<>(); +// list.add(""); + request.setCertificateNum("wanggong"); + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi("/api/frs/v1/face", body); + return resultStr; + } + } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/AssetInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/AssetInfoMapper.java index 4f64e83..c0684ee 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/AssetInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/AssetInfoMapper.java @@ -17,6 +17,6 @@ @Mapper public interface AssetInfoMapper extends BaseMapper { - List getAssetInfoListPage(@Param("page") Page page, AssetInfoRequest assetInfoRequest); + List getAssetInfoListPage(@Param("page") Page page, @Param("assetInfoRequest") AssetInfoRequest assetInfoRequest); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/AttendanceInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/AttendanceInfoMapper.java index f9e793e..ec87e46 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/AttendanceInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/AttendanceInfoMapper.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.statistics.AttendanceNumberDTO; import com.casic.missiles.modular.dto.statistics.AttendanceRatioDTO; import com.casic.missiles.modular.model.AttendanceInfo; import org.apache.ibatis.annotations.Mapper; @@ -17,7 +18,7 @@ */ @Mapper public interface AttendanceInfoMapper extends BaseMapper { - List getAttendanceInfoListPage(@Param("page") Page page, StaffInfoRequest attendanceInfoRequest); + List getAttendanceInfoListPage(@Param("page") Page page, @Param("attendanceInfoRequest") StaffInfoRequest attendanceInfoRequest); AttendanceInfo selectByCodeAndDate(@Param("staffCode") String staffCode); @@ -26,4 +27,8 @@ List getCountByTypeAndDateForMonth(@Param("staffType")String staffType); List getCountByTypeAndDateForYear(@Param("staffType")String staffType); + + List getCountForWeek(); + + List getCountForDay(); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java index ce94b8f..6137a7d 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java @@ -17,5 +17,5 @@ @Mapper public interface BlackInfoMapper extends BaseMapper { - List getBlackInfoListPage(@Param("page") Page page, BlackInfoRequest blackInfoRequest); + List getBlackInfoListPage(@Param("page") Page page, @Param("blackInfoRequest") BlackInfoRequest blackInfoRequest); } 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 efda6b3..50aaa6f 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 @@ -20,7 +20,7 @@ List getCaseInfoListPage(@Param("page") Page page, @Param("caseInfoRequest") CaseInfoRequest caseInfoRequest); - int updateStatusById(CaseInfoRequest caseInfoRequest); + int updateStatusById(@Param("caseInfoRequest") CaseInfoRequest caseInfoRequest); List selectByLevelAndMonth(@Param("year") String year); @@ -47,4 +47,20 @@ List selectPreWeekCountByThirtyDay(); List selectPreDayCountBySevenDay(); + + Integer selectDemobilizedCount(@Param("eventType") Number personnelDemobilizedEvent); + + List selectPreMonthCount(); + + List selectListBySevenDay(); + + List selectListByToday(); + + List selectListByToday2(); + + List selectListByToday3(); + + List selectListByType(@Param("eventType") Number eventType); + + List selectDemobilizedCountByHour(@Param("eventType") Number eventType); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/CategoryLevelMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/CategoryLevelMapper.java index 52fc714..afe1650 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/CategoryLevelMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/CategoryLevelMapper.java @@ -17,9 +17,9 @@ @Mapper public interface CategoryLevelMapper extends BaseMapper { - List getCaseCategoryLevelListPage(@Param("page") Page page, CategoryLevelRequest categoryLevelRequest); + List getCaseCategoryLevelListPage(@Param("page") Page page, @Param("categoryLevelRequest") CategoryLevelRequest categoryLevelRequest); - List getCaseCategoryLevelList(CategoryLevelRequest categoryLevelRequest); + List getCaseCategoryLevelList(@Param("categoryLevelRequest") CategoryLevelRequest categoryLevelRequest); CaseCategoryLevel getCaseCategoryLevel(@Param("categoryLevelCode") String categoryLevelCode); 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 66353b1..2555a09 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 @@ -19,7 +19,7 @@ @Mapper public interface DeviceInfoMapper extends BaseMapper { - List getDeviceInfoListPage(@Param("page") Page page, DeviceInfoRequest deviceInfoRequest); + List getDeviceInfoListPage(@Param("page") Page page, @Param("deviceInfoRequest") DeviceInfoRequest deviceInfoRequest); List getDeviceInfoList(@Param("deviceInfoRequest") DeviceInfoRequest deviceInfoRequest); @@ -27,6 +27,8 @@ DeviceInfo getByIndexCode(@Param("srcIndex") String srcIndex); + DeviceInfo getByIp(@Param("ip") String ip); + List selectIndexCodesByCodes(@Param("deviceCodes") List deviceCodes); List selectByType(@Param("devType") String devType); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java index 41dd0af..5bfaf63 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java @@ -5,6 +5,7 @@ import com.casic.missiles.modular.dto.DeviceRepairRequest; import com.casic.missiles.modular.model.DeviceRepairLog; import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; import java.util.List; @@ -16,7 +17,7 @@ @Mapper public interface DeviceRepairLogMapper extends BaseMapper { - List getDeviceRepairListPage(Page page, DeviceRepairRequest deviceRepairRequest); + List getDeviceRepairListPage(@Param("page") Page page, @Param("deviceRepairRequest")DeviceRepairRequest deviceRepairRequest); - List getDeviceRepairList(DeviceRepairRequest deviceRepairRequest); + List getDeviceRepairList(@Param("deviceRepairRequest") DeviceRepairRequest deviceRepairRequest); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java index 9035c47..4823ac1 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java @@ -18,7 +18,7 @@ @Mapper public interface FireEquipInfoMapper extends BaseMapper { - List getFireEquipInfoListPage(@Param("page") Page page, FireEquipRequest fireEquipRequest); + List getFireEquipInfoListPage(@Param("page") Page page, @Param("fireEquipRequest") FireEquipRequest fireEquipRequest); FireEquipInfo getFireEquipInfo(@Param("equipCode") String equipCode); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/GateGroupMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/GateGroupMapper.java index d8c330d..977a427 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/GateGroupMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/GateGroupMapper.java @@ -17,7 +17,7 @@ */ @Mapper public interface GateGroupMapper extends BaseMapper { - List getGateGroupListPage(@Param("page") Page page, GateGroupRequest gateGroupRequest); + List getGateGroupListPage(@Param("page") Page page, @Param("gateGroupRequest") GateGroupRequest gateGroupRequest); GateGroup getGateGroupByName(@Param("groupName") String groupName); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/HazardLevelMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/HazardLevelMapper.java index 8957780..dcf47bb 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/HazardLevelMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/HazardLevelMapper.java @@ -17,11 +17,13 @@ @Mapper public interface HazardLevelMapper extends BaseMapper { - List getCaseHazardLevelListPage(@Param("page") Page page, HazardLevelRequest hazardLevelRequest); + List getCaseHazardLevelListPage(@Param("page") Page page, @Param("hazardLevelRequest") HazardLevelRequest hazardLevelRequest); - List getCaseHazardLevelList(HazardLevelRequest hazardLevelRequest); + List getCaseHazardLevelList(@Param("hazardLevelRequest") HazardLevelRequest hazardLevelRequest); CaseHazardLevel getCaseHazardLevel(@Param("hazardLevelCode") String hazardLevelCode); List selectHazardName(); + + String selectHazardNameByCode(@Param("hazardLevelCode") String hazardLevelCode); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/HikCaseDefineMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/HikCaseDefineMapper.java index 0dc47d1..f162fef 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/HikCaseDefineMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/HikCaseDefineMapper.java @@ -12,5 +12,5 @@ */ @Mapper public interface HikCaseDefineMapper extends BaseMapper { - HikCaseDefine getHikCaseDefine(@Param("caseTypeCode") Long caseTypeCode); + HikCaseDefine getHikCaseDefine(@Param("caseTypeCode") Number caseTypeCode); } 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 f8a674c..fe5afc2 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 @@ -17,11 +17,13 @@ @Mapper public interface StaffInfoMapper extends BaseMapper { - List getStaffInfoListPage(@Param("page") Page page, StaffInfoRequest staffInfoRequest); + List getStaffInfoListPage(@Param("page") Page page, @Param("staffInfoRequest") StaffInfoRequest staffInfoRequest); StaffInfo selectByCode(@Param("staffCode") String staffCode); - List getStaffInfoList(StaffInfoRequest staffInfoRequest); + List getStaffInfoList(@Param("staffInfoRequest") StaffInfoRequest staffInfoRequest); - List selectBatchCodes(List list); + List selectBatchCodes(@Param("list") List list); + + int updateByCodeForCard(@Param("staffCode") String staffCode, @Param("cardNo") String cardNo); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitInfoMapper.java index b1217c5..6c52542 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitInfoMapper.java @@ -16,7 +16,7 @@ */ @Mapper public interface VisitInfoMapper extends BaseMapper { - List getVisitInfoListPage(@Param("page") Page page, VisitorRequest visitorRequest); + List getVisitInfoListPage(@Param("page") Page page, @Param("visitorRequest") VisitorRequest visitorRequest); VisitInfo selectByOrderId(@Param("orderId") String orderId); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitorApplyMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitorApplyMapper.java index c09f3c0..6ea55bd 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitorApplyMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitorApplyMapper.java @@ -18,7 +18,7 @@ @Mapper public interface VisitorApplyMapper extends BaseMapper { - List getVisitorApplyListPage(@Param("page") Page page, VisitorApplyRequest visitorApplyRequest); + List getVisitorApplyListPage(@Param("page") Page page, @Param("visitorApplyRequest") VisitorApplyRequest visitorApplyRequest); List selectByVisitReason(); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/AttendanceInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/AttendanceInfoMapper.xml index b2ece71..f8bdd6e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/AttendanceInfoMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/AttendanceInfoMapper.xml @@ -43,7 +43,8 @@ and staff_type = #{staffType} - and YEARWEEK(date_format(atte_date, '%Y-%m-%d'), 1) = YEARWEEK(now(),1); + AND DATE_SUB(CURDATE(), INTERVAL 7 DAY) <= DATE(atte_date) + GROUP BY DATE_FORMAT(atte_date, '%Y-%m-%d') @@ -69,4 +70,20 @@ GROUP BY DATE_FORMAT(atte_date, '%Y-%m') + + + \ No newline at end of file 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 2b6953f..06ec0a8 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 @@ -28,7 +28,9 @@ @@ -87,7 +89,8 @@ SELECT hazard_level_code as levelCode, count(id) as quantity FROM bus_case_info WHERE hazard_level_code is not null - AND DATE_SUB(CURDATE(), INTERVAL 7 DAY) <= date(happen_time); + AND is_key_area = 1 + AND DATE_SUB(CURDATE(), INTERVAL 7 DAY) <= date(happen_time) GROUP BY hazard_level_code @@ -95,7 +98,8 @@ SELECT hazard_level_code as levelCode, count(id) as quantity FROM bus_case_info WHERE hazard_level_code is not null - AND DATE_SUB(CURDATE(), INTERVAL 30 DAY) <= date(happen_time); + AND is_key_area = 1 + AND DATE_SUB(CURDATE(), INTERVAL 30 DAY) <= date(happen_time) GROUP BY hazard_level_code @@ -122,4 +126,71 @@ AND hazard_level_code is not null GROUP BY DATE_FORMAT(happen_time,'%Y-%m-%d') + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/CategoryLevelMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/CategoryLevelMapper.xml index 4670b1f..1d25cbd 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/CategoryLevelMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/CategoryLevelMapper.xml @@ -20,11 +20,11 @@ SELECT * FROM bus_case_category_level WHERE 1=1 - - and code = #{code} + + and code = #{categoryLevelRequest.code} - - and name = #{name} + + and name = #{categoryLevelRequest.name} ORDER by create_time DESC 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 9b66fd8..bfd84b7 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 @@ -98,4 +98,10 @@ #{item} + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceRepairLogMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceRepairLogMapper.xml index 078ed3c..cf1a481 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceRepairLogMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceRepairLogMapper.xml @@ -22,14 +22,14 @@ SELECT * FROM bus_device_repair_log WHERE 1=1 - - and device_code = #{devCode} + + and device_code = #{deviceRepairRequest.devCode} - - and device_name = #{devName} + + and device_name = #{deviceRepairRequest.devName} - - and DATE_FORMAT(create_time,"%y%m%d") = DATE_FORMAT(#{createTime},"%y%m%d") + + and DATE_FORMAT(create_time,"%y%m%d") = DATE_FORMAT(#{deviceRepairRequest.createTime},"%y%m%d") ORDER by create_time DESC diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/HazardLevelMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/HazardLevelMapper.xml index f16f2b9..458322b 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/HazardLevelMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/HazardLevelMapper.xml @@ -20,11 +20,11 @@ SELECT * FROM bus_case_hazard_level WHERE 1=1 - - and code = #{code} + + and code = #{hazardLevelRequest.code} - - and name = #{name} + + and name = #{hazardLevelRequest.name} ORDER by create_time DESC @@ -42,4 +42,10 @@ SELECT name FROM bus_case_hazard_level + + \ 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 557237e..b6a183a 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 @@ -50,4 +50,10 @@ + + + UPDATE bus_staff_info + SET card_no = #{cardNo} + WHERE staff_code = #{staffCode} + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitInfoMapper.xml index 84aa84f..230529a 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitInfoMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitInfoMapper.xml @@ -27,5 +27,6 @@ SELECT * FROM bus_visit_info WHERE order_id = #{orderId} and DATE_FORMAT(in_time,'%Y-%m-%d') = CURRENT_DATE + limit 1 \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/BlackPictureRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/BlackPictureRequest.java new file mode 100644 index 0000000..fc92701 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/BlackPictureRequest.java @@ -0,0 +1,14 @@ +package com.casic.missiles.modular.dto; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/29 19:26 + */ +@Data +public class BlackPictureRequest { + private String picUri; + private String serverIndexCode; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/CancelSubscribeRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/CancelSubscribeRequest.java new file mode 100644 index 0000000..e2d390a --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/CancelSubscribeRequest.java @@ -0,0 +1,15 @@ +package com.casic.missiles.modular.dto.hik; + +import lombok.Data; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/24 15:14 + */ +@Data +public class CancelSubscribeRequest { + private List eventTypes; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/CardInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/CardInfo.java new file mode 100644 index 0000000..341457d --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/CardInfo.java @@ -0,0 +1,24 @@ +package com.casic.missiles.modular.dto.hik; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/26 16:08 + */ +@Data +public class CardInfo { + //卡号,8~20个字符,支持数字和大写字母 + private String cardNo; + //人员ID,员工工号 + private String personId; + //人员所属组织IndexCode + private String orgIndexCode; + //卡片类型,默认是1:IC卡 + //1:IC卡 + //2:CPU卡 + //3:远距离卡 + //4:MIFARE卡 + private Number cardType; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/FaceRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/FaceRequest.java new file mode 100644 index 0000000..edc04bf --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/FaceRequest.java @@ -0,0 +1,16 @@ +package com.casic.missiles.modular.dto.hik; + +import lombok.Data; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/25 16:53 + */ +@Data +public class FaceRequest { + private String certificateNum; + private List indexCodes; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/HikRecvEvent.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/HikRecvEvent.java index a3e9845..1b2b2b1 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/HikRecvEvent.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/HikRecvEvent.java @@ -28,12 +28,12 @@ /** * 事件类型,用于判断所需接收到的事件类型 */ - public Long getEventType(){ + public Number getEventType(){ JSONObject jsonObject = (JSONObject)JSONObject.toJSON(params); //事件类别对应SecurityEventTypeEnum JSONArray eventTypeArray = (JSONArray)jsonObject.get("events"); JSONObject eventJsonObject = (JSONObject)JSONObject.toJSON(eventTypeArray.get(0)); - Long eventType = (Long) eventJsonObject.get("eventType"); + Number eventType = (Number) eventJsonObject.get("eventType"); return eventType; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonBatchDeleteRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonBatchDeleteRequest.java index 027d31d..9751929 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonBatchDeleteRequest.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonBatchDeleteRequest.java @@ -12,4 +12,6 @@ @Data public class PersonBatchDeleteRequest { private List personIds; + //删除人脸接口使用 + private String faceId; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonInfoRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonInfoRequest.java new file mode 100644 index 0000000..05dc9e1 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonInfoRequest.java @@ -0,0 +1,20 @@ +package com.casic.missiles.modular.dto.hik; + +import lombok.Data; + +import java.util.List; + +/** + * @Description: 获取员工照片请求实体 + * @Author: wangpeng + * @Date: 2022/8/25 16:53 + */ +@Data +public class PersonInfoRequest { + //获取员工详细信息使用 + private String paramName; + private List paramValue; + //获取照片使用 + private String picUri; + private String serverIndexCode; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonListRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonListRequest.java new file mode 100644 index 0000000..3f7149b --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonListRequest.java @@ -0,0 +1,16 @@ +package com.casic.missiles.modular.dto.hik; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/25 16:53 + */ +@Data +public class PersonListRequest { + private Number pageNo; + private Number pageSize; + + private String orderId; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/SearchPicturesRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/SearchPicturesRequest.java new file mode 100644 index 0000000..0a95966 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/SearchPicturesRequest.java @@ -0,0 +1,24 @@ +package com.casic.missiles.modular.dto.hik; + +import lombok.Data; + +import java.util.List; + +/** + * @Description: 以图搜图请求 + * @Author: wangpeng + * @Date: 2022/8/29 10:46 + */ +@Data +public class SearchPicturesRequest { + private String facePicBinaryData; + private String facePicUrl; + private List cameraIndexCodes; + private String startTime; + private String endTime; + //指定搜图的最小相似度,最小为1,最大为100 + private String minSimilarity; + private Number age; + //male-男性,female-女性 + private String sex; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/StaffCardRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/StaffCardRequest.java new file mode 100644 index 0000000..4052e6d --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/StaffCardRequest.java @@ -0,0 +1,20 @@ +package com.casic.missiles.modular.dto.hik; + +import lombok.Data; + +import java.util.List; + +/** + * @Description: 人员开卡请求实体 + * @Author: wangpeng + * @Date: 2022/8/26 16:05 + */ +@Data +public class StaffCardRequest { + //卡片开始有效时间,时间格式:yyyy-MM-dd + private String startDate; + //卡片截止有效时间,时间格式:yyyy-MM-dd,不能大于2037年12月31日 + private String endDate; + //cardList,待开卡列表,最大支持50张卡 + private List cardList; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/VisitorInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/VisitorInfo.java index 73aa316..b99f301 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/VisitorInfo.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/VisitorInfo.java @@ -14,7 +14,7 @@ //访客性别 //1: 男 //2: 女 - private String gender; + private Integer gender; //联系电话建议填写手机号码 private String phoneNo; //证件类型 diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/ApplyReasonGroupDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/ApplyReasonGroupDTO.java index 514f382..786143e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/ApplyReasonGroupDTO.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/ApplyReasonGroupDTO.java @@ -13,4 +13,6 @@ private String visitReason; //访问人数 private Integer quantity; + //占比 + private String ratio; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/AttendanceNumberDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/AttendanceNumberDTO.java new file mode 100644 index 0000000..a494321 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/AttendanceNumberDTO.java @@ -0,0 +1,24 @@ +package com.casic.missiles.modular.dto.statistics; + +import com.fasterxml.jackson.annotation.JsonIgnore; +import lombok.Data; + +/** + * @Description: 出勤人数统计实体 + * @Author: wangpeng + * @Date: 2022/8/31 19:24 + */ +@Data +public class AttendanceNumberDTO { + //日期维度,周、今日,入参 + @JsonIgnore + private String dateDimension; + + //日期,具体天/小时,出参 + private String date; + //出勤人数 + private String quantity; + //员工类型 + private String staffType; + +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/AvgMonthAndWeekGroupDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/AvgMonthAndWeekGroupDTO.java index 4366916..331a9a9 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/AvgMonthAndWeekGroupDTO.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/AvgMonthAndWeekGroupDTO.java @@ -2,8 +2,6 @@ import lombok.Data; -import java.util.Map; - /** * @Description: 平均每月和每周的数据实体 * @Author: wangpeng @@ -13,6 +11,4 @@ public class AvgMonthAndWeekGroupDTO { //入参 private String year; - //出参,key:事件类型,value:周和月数据平均值 - private Map map; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/GateStatusGroupResponse.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/GateStatusGroupResponse.java new file mode 100644 index 0000000..d16f4e5 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/GateStatusGroupResponse.java @@ -0,0 +1,16 @@ +package com.casic.missiles.modular.dto.statistics; + +import lombok.Data; + +/** + * @Description: 闸机/摄像机统计响应实体 + * @Author: wangpeng + * @Date: 2022/8/30 14:22 + */ +@Data +public class GateStatusGroupResponse { + //设备状态 + private String status; + //占比 + private String ratio; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/MonthAndWeekDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/MonthAndWeekDTO.java index 7482b2a..284115a 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/MonthAndWeekDTO.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/MonthAndWeekDTO.java @@ -9,7 +9,7 @@ */ @Data public class MonthAndWeekDTO { -// private String levelName; + private String levelName; private Integer monthQuantity; private Integer weekQuantity; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/OnDutyRatioDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/OnDutyRatioDTO.java new file mode 100644 index 0000000..4f6a65d --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/OnDutyRatioDTO.java @@ -0,0 +1,15 @@ +package com.casic.missiles.modular.dto.statistics; + +import lombok.Data; + +/** + * @Description: 在岗率统计实体 + * @Author: wangpeng + * @Date: 2022/9/2 21:24 + */ +@Data +public class OnDutyRatioDTO { + private String date; + private String quantity; + private String ratio; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/SecurityLevelAssessDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/SecurityLevelAssessDTO.java new file mode 100644 index 0000000..40a0738 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/SecurityLevelAssessDTO.java @@ -0,0 +1,15 @@ +package com.casic.missiles.modular.dto.statistics; + +import lombok.Data; + +/** + * @Description: 出勤人数统计实体 + * @Author: wangpeng + * @Date: 2022/8/31 19:24 + */ +@Data +public class SecurityLevelAssessDTO { + private String date; + private String quantity; + private Double score; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/SecurityScoreDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/SecurityScoreDTO.java index 304d169..f7bd4a2 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/SecurityScoreDTO.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/SecurityScoreDTO.java @@ -14,5 +14,5 @@ //楼层,出参 private String area; //评分,出参 - private String score; + private Double score; } 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 6a30786..e5e613d 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 @@ -8,6 +8,10 @@ public interface HikUri { //事件订阅 String EVENT_SUBSCRIBE = "/api/eventService/v1/eventSubscriptionByEventTypes"; + //事件订阅信息查询 + String EVENT_INFO = "/api/eventService/v1/eventSubscriptionView"; + //事件订阅取消 + String EVENT_CANCEL = "/api/eventService/v1/eventUnSubscriptionByEventTypes"; //预约免登记 String APPOINTMENT_FREE_REGISTER = "/api/visitor/v1/appointment/registration"; //修改访客预约 @@ -32,8 +36,18 @@ String PERSON_SINGLE_UPDATE = "/api/resource/v1/person/single/update"; //批量删除人员 String PERSON_BATCH_DELETE = "/api/resource/v1/person/batch/delete"; + //根据人脸Id删除人脸 + String PERSON_SINGLE_DELETE = "/api/resource/v1/face/single/delete"; //门禁点反控 String DOOR_CONTROL = "/api/acs/v1/door/doControl"; //查询海康门禁点事件v2 String DOOR_EVENTS = "/api/acs/v2/door/events"; + //批量开卡 + String CARD_BINDING = "/api/cis/v1/card/binding"; + //提取人员照片 + String PERSON_PICTURE = "/api/resource/v1/person/picture"; + //根据人员唯一字段获取人员详细信息 + String PERSON_INFO = "/api/resource/v1/person/condition/personInfo"; + //以图搜图 + String SEARCH_PICTURES = "/api/frs/v1/application/captureSearch"; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/enums/SecurityEventType.java b/casic-server/src/main/java/com/casic/missiles/modular/enums/SecurityEventType.java index d51034c..42eacf8 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/enums/SecurityEventType.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/enums/SecurityEventType.java @@ -14,18 +14,27 @@ Number PERSONNEL_GATHER_EVENT = 131593; //监控点离线事件 Number MONITORING_POINT_OFFLINE = 889196545; + //监控点上线事件 + Number MONITORING_POINT_ONLINE = 889196546; //装置离线 Number DEVICE_OFFLINE = 199710; + //装置连线 + Number DEVICE_ONLINE = 199711; //访客登记 Number VISITOR_REGISTER = 1392513025; //访客签离 Number VISITOR_CHECKOUT = 1392513026; + //高空抛物 + Number HIGH_ALTITUDE_PARABOLIC = 930335; + //下面两个查询海康门禁点事件使用 //合法卡比对通过 Number CARD_COMPARE_PASS = 198914; //人脸认证通过 Number FACE_COMPARE_PASS = 196893; + + // //正常开门 // Number NORMAL_OPENING = 198913; // //按钮开门 @@ -46,7 +55,6 @@ // Number FIREWORKS_DETECTION = 192514; // //陌生人识别事件 // Number STRANGER_RECOGNITION = 1644171265; -// //高空抛物 -// Number HIGH_ALTITUDE_PARABOLIC = 930335; + } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/job/CockpitJob.java b/casic-server/src/main/java/com/casic/missiles/modular/job/CockpitJob.java index 7490a27..85dd016 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/job/CockpitJob.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/job/CockpitJob.java @@ -79,14 +79,6 @@ } }); } - } - /** - * 机动力量实时在岗率,在岗人数除以总应在岗人数,功能待定 - */ -// @Scheduled(cron = "0 0/1 * * * ?") - public void BeOnDutyRatio() { - - } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/service/HikCaseDefineService.java b/casic-server/src/main/java/com/casic/missiles/modular/service/HikCaseDefineService.java index d9bb3a9..18e2936 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/service/HikCaseDefineService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/service/HikCaseDefineService.java @@ -9,5 +9,5 @@ * @Date: 2022/7/21 17:20 */ public interface HikCaseDefineService extends IService { - HikCaseDefine getHikCaseDefine(Long caseTypeCode); + HikCaseDefine getHikCaseDefine(Number caseTypeCode); } 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 dd24101..bcc3b5d 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 @@ -18,6 +18,8 @@ CaseInfo monitorPointOfflineHandle(JSONObject event, CaseInfo caseInfo); + void monitorPointOnlineHandle(JSONObject event); + CaseInfo deviceOfflineHandle(JSONObject event, CaseInfo caseInfo); void propertyAttendanceHandle(JSONObject event); @@ -27,4 +29,6 @@ void visitorRegisterHandler(JSONObject event); void visitorCheckOutHandler(JSONObject event); + + void deviceOnlineHandle(JSONObject event); } 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 e55c016..01870bd 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.StaffCardRequest; import com.casic.missiles.modular.model.StaffInfo; import java.util.List; @@ -28,4 +29,6 @@ StaffInfo selectStaffInfoByCode(StaffInfo staffInfo); List staffInfoList(StaffInfoRequest staffInfoRequest); + + int saveCardInfo(StaffCardRequest staffCardRequest); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/service/impl/BlackInfoServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/service/impl/BlackInfoServiceImpl.java index 8f47b37..981b4cd 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/service/impl/BlackInfoServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/service/impl/BlackInfoServiceImpl.java @@ -17,7 +17,6 @@ import com.casic.missiles.modular.model.BlackInfo; import com.casic.missiles.modular.model.HikFaceGroupInfo; import com.casic.missiles.modular.service.BlackInfoService; -import com.casic.missiles.modular.system.service.ICasicFileService; import com.casic.missiles.modular.util.HikUtil; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; @@ -43,9 +42,6 @@ private HikFaceGroupInfoMapper hikFaceGroupInfoMapper; @Resource - private ICasicFileService fileService; - - @Resource private AbstractDictService dictService; @Override @@ -90,9 +86,6 @@ //设置海康人脸唯一标识、人脸分组唯一标识 blackInfo.setIndexCode(String.valueOf(dataJson.get("indexCode"))); blackInfo.setFaceGroupIndexCode(String.valueOf(dataJson.get("faceGroupIndexCode"))); - //保存图片到本地 - String picUrl = fileService.saveFile(blackInfo.getPicture()); - blackInfo.setPicture(picUrl); //插入数据库 if(blackInfoMapper.insert(blackInfo) > 0){ return ResponseData.success(); @@ -141,8 +134,6 @@ log.error("请求海康,单个修改人脸失败,海康response:{}", resultStr); return ResponseData.error("单个修改人脸失败"); } - String picUrl = fileService.saveFile(blackInfo.getPicture()); - blackInfo.setPicture(picUrl); if(blackInfoMapper.updateById(blackInfo) > 0){ return ResponseData.success(); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/service/impl/CockpitServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/service/impl/CockpitServiceImpl.java index 6e6076e..7402991 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/service/impl/CockpitServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/service/impl/CockpitServiceImpl.java @@ -4,15 +4,12 @@ import cn.hutool.core.date.DateUtil; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.core.application.service.AbstractDictService; import com.casic.missiles.modular.dto.hik.DoorEventsRequest; import com.casic.missiles.modular.enums.HikUri; -import com.casic.missiles.modular.enums.SecurityEventDict; import com.casic.missiles.modular.enums.SecurityEventType; import com.casic.missiles.modular.service.CockpitService; import com.casic.missiles.modular.util.HikUtil; import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.*; @@ -25,8 +22,6 @@ @Slf4j @Service public class CockpitServiceImpl implements CockpitService { - @Autowired - private AbstractDictService dictService; @Override public HashMap dataHandle(DoorEventsRequest doorEventsRequest, HashMap> configMap, HashMap jsonMap, HashMap resultMap) { @@ -36,8 +31,8 @@ Date date = new Date(); DateTime startTimeDate = DateUtil.beginOfDay(date); DateTime endTimeDate = DateUtil.endOfDay(date); - String startTime = DateUtil.format(startTimeDate, "yyyy-MM-dd'T'HH:mm:ss'Z'"); - String endTime = DateUtil.format(endTimeDate, "yyyy-MM-dd'T'HH:mm:ss'Z'"); + String startTime = DateUtil.format(startTimeDate, "yyyy-MM-dd'T'HH:mm:ssXXX"); + String endTime = DateUtil.format(endTimeDate, "yyyy-MM-dd'T'HH:mm:ssXXX"); configMap.keySet().stream().forEach(key -> { List doorIndexCodes = configMap.get(key); doorEventsRequest.setPageNo(1); @@ -95,8 +90,9 @@ return; } Integer num = 0; - while (list.stream().iterator().hasNext()) { - JSONObject next = (JSONObject) list.stream().iterator().next(); + Iterator iterator = list.stream().iterator(); + while (iterator.hasNext()) { + JSONObject next = (JSONObject) iterator.next(); Integer inAndOutType = next.getInteger("inAndOutType"); //进门 if (1 == inAndOutType) { @@ -105,8 +101,8 @@ --num; } } - String dictName = dictService.getDictNameByCode(SecurityEventDict.DEVICE_POSITION, String.valueOf(key)); - resultMap.put(dictName, num); +// String dictName = dictService.getDictNameByCode(SecurityEventDict.DEVICE_POSITION, String.valueOf(key)); + resultMap.put(String.valueOf(key), num); }); return resultMap; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/service/impl/HikCaseDefineServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/service/impl/HikCaseDefineServiceImpl.java index 98ab2a4..1a59c7e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/service/impl/HikCaseDefineServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/service/impl/HikCaseDefineServiceImpl.java @@ -16,7 +16,7 @@ private HikCaseDefineMapper hikCaseDefineMapper; @Override - public HikCaseDefine getHikCaseDefine(Long caseTypeCode) { + public HikCaseDefine getHikCaseDefine(Number caseTypeCode) { return hikCaseDefineMapper.getHikCaseDefine(caseTypeCode); } } 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 b47f78f..dbad48f 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 @@ -58,10 +58,16 @@ 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.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; } @@ -76,10 +82,16 @@ 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.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; } @@ -94,10 +106,16 @@ 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.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; } @@ -109,24 +127,44 @@ 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()); //事件状态(未解决的字典值) + // TODO: 2022/7/28 事件状态字典值选择 + caseInfo.setStatus(dict.get(0).getCode()); //事件状态("未解决"的字典值) DeviceInfo deviceInfo = deviceInfoMapper.getByIndexCode(srcIndex); + if(Objects.isNull(deviceInfo)){ + log.info("接收到监控点离线事件,但数据库中无该事件发生的设备信息"); + return caseInfo; + } 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()); //更新设备状态 // TODO: 2022/7/28 设备离线字典值选择 -// deviceInfo.setStatus(); + List deviceDict = dictService.findInDictByCode(SecurityEventDict.DEVICE_STATUS); + deviceInfo.setStatus(deviceDict.get(1).getCode()); if(deviceInfoMapper.updateById(deviceInfo) <= 0){ + log.error("海康回调,更新监控点离线线状态失败!"); return null; } return caseInfo; } @Override + public void monitorPointOnlineHandle(JSONObject event) { + String srcIndex = event.getString("srcIndex"); + DeviceInfo deviceInfo = deviceInfoMapper.getByIndexCode(srcIndex); + // TODO: 2022/7/28 设备在线字典值选择 + List deviceDict = dictService.findInDictByCode(SecurityEventDict.DEVICE_STATUS); + deviceInfo.setStatus(deviceDict.get(0).getCode()); + if(deviceInfoMapper.updateById(deviceInfo) <= 0){ + log.error("海康回调,更新监控点在线状态失败!"); + } + } + + @Override public CaseInfo deviceOfflineHandle(JSONObject event, CaseInfo caseInfo) { //加入到安防事件 String srcIndex = event.getString("srcIndex"); //海康资源唯一标识 @@ -138,19 +176,40 @@ 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.setDeviceCode(deviceInfo.getDevCode()); //设备code caseInfo.setDevName(deviceInfo.getDevName()); //设备名 caseInfo.setPosition(deviceInfo.getPosition()); //事件位置 caseInfo.setArea(deviceInfo.getArea()); //区域 + caseInfo.setIsKeyArea(deviceInfo.getIsKeyArea()); + caseInfo.setDetailLocation(deviceInfo.getDetailLocation()); //更新设备状态 // TODO: 2022/7/28 设备离线字典值选择 -// deviceInfo.setStatus(); + List deviceDict = dictService.findInDictByCode(SecurityEventDict.DEVICE_STATUS); + deviceInfo.setStatus(deviceDict.get(1).getCode()); if(deviceInfoMapper.updateById(deviceInfo) <= 0){ + log.error("海康回调,更新设备离线状态失败!"); return null; } return caseInfo; } + + @Override + public void deviceOnlineHandle(JSONObject event) { + String srcIndex = event.getString("srcIndex"); + DeviceInfo deviceInfo = deviceInfoMapper.getByIndexCode(srcIndex); + // TODO: 2022/7/28 设备在线字典值选择 + List deviceDict = dictService.findInDictByCode(SecurityEventDict.DEVICE_STATUS); + deviceInfo.setStatus(deviceDict.get(0).getCode()); + if(deviceInfoMapper.updateById(deviceInfo) <= 0){ + log.error("海康回调,更新门禁点装置在线状态失败!"); + } + } + @Override public void propertyAttendanceHandle(JSONObject event) { String srcIndex = event.getString("srcIndex"); @@ -182,8 +241,9 @@ info.setStaffName(staffInfo.getStaffName()); info.setStaffGender(staffInfo.getStaffGender()); // TODO: 2022/7/29 物业人员字典值选择 -// info.setStaffType(); -// info.setStaffTypeName(); + List staffDict = dictService.findInDictByCode(SecurityEventDict.STAFF_TYPE); + info.setStaffType(staffDict.get(0).getCode()); + info.setStaffTypeName(staffDict.get(0).getName()); info.setAtteDate(DateUtil.today()); info.setAtteStartTime(happenTime); info.setAtteStartDev(deviceInfo.getDevCode()); @@ -226,8 +286,9 @@ info.setStaffName(staffInfo.getStaffName()); info.setStaffGender(staffInfo.getStaffGender()); // TODO: 2022/7/29 安保人员字典值选择 -// info.setStaffType(); -// info.setStaffTypeName(); + List staffDict = dictService.findInDictByCode(SecurityEventDict.STAFF_TYPE); + info.setStaffType(staffDict.get(1).getCode()); + info.setStaffTypeName(staffDict.get(1).getName()); info.setAtteDate(DateUtil.today()); info.setAtteStartTime(happenTime); info.setAtteStartDev(deviceInfo.getDevCode()); @@ -259,8 +320,12 @@ visitInfo.setVisitReason(data.getString("purpose")); visitInfo.setPicUri(data.getString("captureUrl")); visitInfo.setServerIndexCode(data.getString("svrIndexCode")); - visitInfo.setVisitPosition(deviceInfo.getPosition()); - + visitInfo.setOrderId(data.getString("visitorId")); + if(!Objects.isNull(deviceInfo)){ + visitInfo.setVisitPosition(deviceInfo.getPosition()); + } else{ + log.info("识别访客的门禁不在数据库中"); + } if(visitInfoMapper.insert(visitInfo) <= 0){ log.error("新增访客记录异常"); } 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 b416f5c..d19dceb 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 @@ -10,12 +10,12 @@ import com.casic.missiles.modular.dto.StaffInfoRequest; import com.casic.missiles.modular.dto.hik.PersonBatchDeleteRequest; import com.casic.missiles.modular.dto.hik.PersonSingleAddOrUpdateRequest; +import com.casic.missiles.modular.dto.hik.StaffCardRequest; import com.casic.missiles.modular.enums.HikUri; import com.casic.missiles.modular.enums.SecurityEventDict; import com.casic.missiles.modular.model.DeviceInfo; import com.casic.missiles.modular.model.StaffInfo; import com.casic.missiles.modular.service.StaffInfoService; -import com.casic.missiles.modular.system.service.ICasicFileService; import com.casic.missiles.modular.util.Base64Util; import com.casic.missiles.modular.util.HikUtil; import lombok.extern.slf4j.Slf4j; @@ -51,9 +51,6 @@ @Resource private Validator validator; - @Resource - private ICasicFileService fileService; - @Value("${casic.file.uploadPath}") private String uploadPath; @@ -80,8 +77,6 @@ if(!Objects.isNull(staff)){ return ResponseData.error("数据已存在"); } - String picUrl = fileService.saveFile(staffInfo.getPicture()); - staffInfo.setPicture(picUrl); //添加人员到海康 PersonSingleAddOrUpdateRequest personSingleAddOrUpdateRequest = new PersonSingleAddOrUpdateRequest(); @@ -117,9 +112,6 @@ @Override @Transactional(rollbackFor = Exception.class) public Object updateStaffInfo(StaffInfo staffInfo) { - String picUrl = fileService.saveFile(staffInfo.getPicture()); - staffInfo.setPicture(picUrl); - //修改人员到海康 PersonSingleAddOrUpdateRequest personSingleAddOrUpdateRequest = new PersonSingleAddOrUpdateRequest(); personSingleAddOrUpdateRequest.setPersonId(staffInfo.getStaffCode()); @@ -162,7 +154,13 @@ String body = JSONObject.toJSONString(personBatchDeleteRequest); String resultStr = HikUtil.hikApi(HikUri.PERSON_BATCH_DELETE, body); JSONObject resultJson = (JSONObject)JSONObject.parse(resultStr); - if (!"0".equals(resultJson.get("code"))) { + //人脸要单独删除 + PersonBatchDeleteRequest personBatchDeleteRequest2 = new PersonBatchDeleteRequest(); + personBatchDeleteRequest2.setFaceId(staffInfo.getStaffFaceId()); + String body2 = JSONObject.toJSONString(personBatchDeleteRequest2); + String resultStr2 = HikUtil.hikApi(HikUri.PERSON_SINGLE_DELETE, body2); + JSONObject resultJson2 = (JSONObject)JSONObject.parse(resultStr2); + if (!"0".equals(resultJson.get("code")) && !"0".equals(resultJson2.get("code")) ) { log.error("请求海康,单个删除人员失败,海康response:{}", resultStr); return ResponseData.error("单个删除人员失败"); } @@ -269,4 +267,21 @@ } return null; } + + @Override + @Transactional(rollbackFor = Exception.class) + public int saveCardInfo(StaffCardRequest staffCardRequest) { + List numFlag = new ArrayList<>(); + staffCardRequest.getCardList().forEach(cardInfo -> { + String staffCode = cardInfo.getPersonId(); + String cardNo = cardInfo.getCardNo(); + if(staffInfoMapper.updateByCodeForCard(staffCode, cardNo) > 0){ + numFlag.add(cardNo); + } + }); + if(staffCardRequest.getCardList().size() != numFlag.size()){ + return 0; + } + return 1; + } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/service/impl/VisitorApplyServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/service/impl/VisitorApplyServiceImpl.java index 497003a..b219984 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/service/impl/VisitorApplyServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/service/impl/VisitorApplyServiceImpl.java @@ -74,9 +74,9 @@ AppointmentFreeRegisterRequest appointmentFreeRegisterRequest = new AppointmentFreeRegisterRequest(); //将时间转换为海康ISO8601格式 DateTime inTimeDate = DateUtil.parse(visitorApply.getInTime()); - String inTimeISODate = DateUtil.format(inTimeDate, "yyyy-MM-dd'T'HH:mm:ss'Z'"); + String inTimeISODate = DateUtil.format(inTimeDate, "yyyy-MM-dd'T'HH:mm:ssXXX"); DateTime outTimeDate = DateUtil.parse(visitorApply.getOutTime()); - String outTimeISODate = DateUtil.format(outTimeDate, "yyyy-MM-dd'T'HH:mm:ss'Z'"); + String outTimeISODate = DateUtil.format(outTimeDate, "yyyy-MM-dd'T'HH:mm:ssXXX"); //海康员工唯一标识receptionistId就是我们录入的到海康的员工号 appointmentFreeRegisterRequest.setReceptionistId(visitorApply.getStaffCode()); appointmentFreeRegisterRequest.setPersonNum(1); @@ -86,7 +86,7 @@ VisitorInfo visitorInfo = new VisitorInfo(); visitorInfo.setVisitorName(visitorApply.getVisitorName()); - visitorInfo.setGender(visitorApply.getVisitorGender()); + visitorInfo.setGender(Integer.valueOf(visitorApply.getVisitorGender())); visitorInfo.setPhoneNo(visitorApply.getVisitorPhone()); visitorInfo.setCertificateNo(visitorApply.getIdCard()); visitorInfo.setCertificateType(111); @@ -121,15 +121,15 @@ appointmentFreeRegisterRequest.setAppointRecordId(visitorApply1.getAppointRecordId()); appointmentFreeRegisterRequest.setReceptionistId(visitorApply1.getStaffCode()); DateTime inTimeDate = DateUtil.parse(visitorApply.getInTime()); - String inTimeISODate = DateUtil.format(inTimeDate, "yyyy-MM-dd'T'HH:mm:ss'Z'"); + String inTimeISODate = DateUtil.format(inTimeDate, "yyyy-MM-dd'T'HH:mm:ssXXX"); DateTime outTimeDate = DateUtil.parse(visitorApply.getOutTime()); - String outTimeISODate = DateUtil.format(outTimeDate, "yyyy-MM-dd'T'HH:mm:ss'Z'"); + String outTimeISODate = DateUtil.format(outTimeDate, "yyyy-MM-dd'T'HH:mm:ssXXX"); appointmentFreeRegisterRequest.setVisitStartTime(inTimeISODate); appointmentFreeRegisterRequest.setVisitEndTime(outTimeISODate); appointmentFreeRegisterRequest.setVisitPurpose(visitorApply.getVisitReason()); VisitorInfo visitorInfo = new VisitorInfo(); visitorInfo.setVisitorName(visitorApply.getVisitorName()); - visitorInfo.setGender(visitorApply.getVisitorGender()); + visitorInfo.setGender(Integer.valueOf(visitorApply.getVisitorGender())); visitorInfo.setPhoneNo(visitorApply.getVisitorPhone()); visitorInfo.setCertificateNo(visitorApply.getIdCard()); visitorInfo.setCertificateType(111); @@ -236,9 +236,9 @@ } } DateTime inTimeDate = DateUtil.parse(busConcentrator.getInTime()); - String inTimeISODate = DateUtil.format(inTimeDate, "yyyy-MM-dd'T'HH:mm:ss'Z'"); + String inTimeISODate = DateUtil.format(inTimeDate, "yyyy-MM-dd'T'HH:mm:ssXXX"); DateTime outTimeDate = DateUtil.parse(busConcentrator.getOutTime()); - String outTimeISODate = DateUtil.format(outTimeDate, "yyyy-MM-dd'T'HH:mm:ss'Z'"); + String outTimeISODate = DateUtil.format(outTimeDate, "yyyy-MM-dd'T'HH:mm:ssXXX"); AppointmentFreeRegisterRequest appointmentFreeRegisterRequest = new AppointmentFreeRegisterRequest(); appointmentFreeRegisterRequest.setReceptionistId(busConcentrator.getStaffCode()); appointmentFreeRegisterRequest.setPersonNum(1); @@ -247,7 +247,7 @@ appointmentFreeRegisterRequest.setVisitPurpose(busConcentrator.getVisitReason()); VisitorInfo visitorInfo = new VisitorInfo(); visitorInfo.setVisitorName(busConcentrator.getVisitorName()); - visitorInfo.setGender(busConcentrator.getVisitorGender()); + visitorInfo.setGender(Integer.valueOf(busConcentrator.getVisitorGender())); visitorInfo.setPhoneNo(busConcentrator.getVisitorPhone()); visitorInfo.setCertificateNo(busConcentrator.getIdCard()); visitorInfo.setCertificateType(111); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/BlackListController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/BlackListController.java index a27f9f8..0c06661 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/BlackListController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/BlackListController.java @@ -1,13 +1,18 @@ package com.casic.missiles.modular.controller; +import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.base.controller.ExportController; import com.casic.missiles.core.page.PageFactory; import com.casic.missiles.model.response.ResponseData; import com.casic.missiles.modular.dto.BlackInfoRequest; +import com.casic.missiles.modular.dto.BlackPictureRequest; +import com.casic.missiles.modular.dto.hik.PersonInfoRequest; +import com.casic.missiles.modular.enums.HikUri; import com.casic.missiles.modular.enums.OperateTypeEnum; import com.casic.missiles.modular.model.BlackInfo; import com.casic.missiles.modular.service.BlackInfoService; +import com.casic.missiles.modular.util.HikUtil; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; @@ -56,4 +61,22 @@ return null; } + /** + * 黑名单人员照片 + */ + @PostMapping("/personPicture") + @ResponseBody + public Object personPicture(@RequestBody BlackPictureRequest blackPictureRequest){ + //获取照片 + String picUri = blackPictureRequest.getPicUri(); + String serverIndexCode = blackPictureRequest.getServerIndexCode(); + PersonInfoRequest picRequest = new PersonInfoRequest(); + picRequest.setPicUri(picUri); + picRequest.setServerIndexCode(serverIndexCode); + String reBody = JSONObject.toJSONString(picRequest); + //重定向地址获取 + String url = HikUtil.hikApiFor302(HikUri.PERSON_PICTURE, reBody); + return ResponseData.success(url); + } + } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/DeviceController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/DeviceController.java index e1c4eba..666bbee 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/DeviceController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/DeviceController.java @@ -107,7 +107,7 @@ } /** - * 设备维修管理查询(分页),需计算MTTR=总维修时间/故障次数 + * 设备状态计算与评判/设备维修管理查询(分页),需计算MTTR=总维修时间/故障次数 */ @PostMapping("/repair/listPage") @ResponseBody @@ -211,7 +211,7 @@ //需根据设备编号获取到对应的门禁点唯一标识 doorControlRequest.setDoorIndexCodes(indexCodes); doorControlRequest.setControlType(Integer.valueOf(gateGroupDTO.getStatus())); - String body = JSONObject.toJSONString(deviceCodes); + String body = JSONObject.toJSONString(doorControlRequest); String resultStr = HikUtil.hikApi(HikUri.DOOR_CONTROL, body); JSONObject resultJson = (JSONObject)JSONObject.parse(resultStr); if (!"0".equals(resultJson.get("code"))) { diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/StaffController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/StaffController.java index b58ccab..704093c 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/StaffController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/StaffController.java @@ -2,15 +2,21 @@ import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.util.StrUtil; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.base.controller.ExportController; import com.casic.missiles.core.page.PageFactory; import com.casic.missiles.model.response.ErrorResponseData; import com.casic.missiles.model.response.ResponseData; import com.casic.missiles.modular.dto.StaffInfoRequest; +import com.casic.missiles.modular.dto.hik.PersonInfoRequest; +import com.casic.missiles.modular.dto.hik.StaffCardRequest; +import com.casic.missiles.modular.enums.HikUri; import com.casic.missiles.modular.enums.OperateTypeEnum; import com.casic.missiles.modular.model.StaffInfo; import com.casic.missiles.modular.service.StaffInfoService; +import com.casic.missiles.modular.util.HikUtil; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; @@ -110,4 +116,60 @@ } return ResponseData.success(); } + + /** + * 批量开卡,添加人员之后调用,若在一个接口中添加人员成功开卡失败则第二次添加时会有问题 + */ + @PostMapping("/cardBinding") + @ResponseBody + public Object cardBinding(@RequestBody StaffCardRequest staffCardRequest) { + String body = JSONObject.toJSONString(staffCardRequest); + String resultStr = HikUtil.hikApi(HikUri.CARD_BINDING, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (!"0".equals(resultJson.get("code"))) { + log.error("请求海康,批量开卡失败,海康response:{}", resultStr); + return ResponseData.error("批量开卡失败"); + } + //保存卡号 + if(staffInfoService.saveCardInfo(staffCardRequest) > 0){ + return ResponseData.success(); + } + return ResponseData.error("批量开卡失败"); + } + + /** + * 获取员工照片,海康存储 + */ + @PostMapping("/personPicture/{staffCode}") + @ResponseBody + public Object personPicture(@PathVariable("staffCode") String staffCode){ + //获取员工详细信息,含图片服务器、uri + PersonInfoRequest request = new PersonInfoRequest(); + List list = new ArrayList<>(); + list.add(staffCode); + request.setParamName("personId"); + request.setParamValue(list); + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi(HikUri.PERSON_INFO, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (!"0".equals(resultJson.get("code"))) { + log.error("请求海康,根据人员唯一字段获取人员详细信息失败,海康response:{}", resultStr); + return ResponseData.error("获取员工照片失败"); + } + //获取照片 + JSONObject data = (JSONObject) resultJson.get("data"); + JSONArray dataArray = (JSONArray) data.get("list"); + JSONObject jsonObject = (JSONObject) dataArray.get(0); + JSONArray personPhoto = (JSONArray) jsonObject.get("personPhoto"); + JSONObject photo = (JSONObject) personPhoto.get(0); + String picUri = photo.getString("picUri"); + String serverIndexCode = photo.getString("serverIndexCode"); + PersonInfoRequest picRequest = new PersonInfoRequest(); + picRequest.setPicUri(picUri); + picRequest.setServerIndexCode(serverIndexCode); + String reBody = JSONObject.toJSONString(picRequest); + //重定向地址获取 + String url = HikUtil.hikApiFor302(HikUri.PERSON_PICTURE, reBody); + return ResponseData.success(url); + } } 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 4a07dd9..7b1dcf6 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 @@ -16,6 +16,7 @@ import com.casic.missiles.modular.redis.key.CacheKeys; import com.casic.missiles.modular.service.CockpitService; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.util.CollectionUtils; import org.springframework.web.bind.annotation.*; @@ -24,10 +25,7 @@ import java.text.NumberFormat; import java.time.LocalDateTime; import java.time.temporal.ChronoUnit; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.util.*; import java.util.stream.Collectors; /** @@ -73,6 +71,9 @@ private StatisticNumberMapper numberMapper; @Autowired + private HazardLevelMapper hazardLevelMapper; + + @Autowired private AccessGroupConfig accessGroupConfig; /** @@ -104,8 +105,24 @@ public Object buildingNumberPerHour(){ //当天按小时分组的人数 List list = numberMapper.selectListByTime(); - Map> collect = list.stream().collect(Collectors.groupingBy(BuildingNumberDTO::getStatisticPosition)); - return ResponseData.success(collect); + Map> collect = list.stream().collect(Collectors.groupingBy(BuildingNumberDTO::getStatisticTime)); + //定时任务中已将每小时三栋楼人数存到数据库 + //将一期主楼和录制楼人数合并,二期单算 + List> resultList = new ArrayList<>(); + collect.keySet().forEach(key -> { + List buildingNumberDTOS = collect.get(key); + BuildingNumberDTO mainBuildingOne = buildingNumberDTOS.get(0); + BuildingNumberDTO mainBuildingTwo = buildingNumberDTOS.get(1); + BuildingNumberDTO recordingBuilding = buildingNumberDTOS.get(2); + HashMap resultMap = new HashMap<>(); + Integer oneQuantity = Integer.valueOf(mainBuildingOne.getStatisticQuantity()); + Integer recordingQuantity = Integer.valueOf(recordingBuilding.getStatisticQuantity()); + resultMap.put("staticTime", mainBuildingOne.getStatisticTime()); + resultMap.put(mainBuildingOne.getStatisticPositionName()+"、"+recordingBuilding.getStatisticPositionName(), String.valueOf(oneQuantity+recordingQuantity)); + resultMap.put(mainBuildingTwo.getStatisticPositionName(), mainBuildingTwo.getStatisticQuantity()); + resultList.add(resultMap); + }); + return ResponseData.success(resultList); } /** @@ -151,12 +168,11 @@ public Object securityNumber() { QueryWrapper wrapper = new QueryWrapper<>(); wrapper.eq("staff_type", 2); + // TODO: 2022/9/2 后续使用产品确定的每天出勤的安保人员的数量 Integer total = staffInfoMapper.selectCount(wrapper); - //当日离岗事件个数 - QueryWrapper wrapper1 = new QueryWrapper<>(); - wrapper1.eq("hik_event_type", SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); - wrapper1.apply("date_format(now(),'%Y-%m-%d') = date_format(happen_time,'%Y-%m-%d')"); - Integer leave = caseInfoMapper.selectCount(wrapper1); + //当日离岗事件按设备去重后的个数 + // TODO: 2022/9/2 目前相当于24小时内的计算,之后看需要可改成自定义小时数计算离岗率,即离岗+6小时内仅一次离岗则恢复为100%,多次则累加离岗次数计算离岗率 + Integer leave = caseInfoMapper.selectDemobilizedCount(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); NumberFormat numberFormat = NumberFormat.getInstance(); // 设置精确到小数点后2位 numberFormat.setMaximumFractionDigits(2); @@ -179,7 +195,6 @@ @ResponseBody public Object visitorApplyDetail() { List reasonGroup = applyMapper.selectByVisitReason(); - HashMap resultMap = new HashMap<>(); NumberFormat numberFormat = NumberFormat.getInstance(); // 设置精确到小数点后2位 numberFormat.setMaximumFractionDigits(2); @@ -187,12 +202,17 @@ if(0 == sum){ return ResponseData.success(); } + List resultList = new ArrayList<>(); reasonGroup.forEach(group -> { String reasonName = dictService.getDictNameByCode(SecurityEventDict.VISIT_REASON, group.getVisitReason()); String result = numberFormat.format((float) group.getQuantity() / (float) sum * 100); - resultMap.put(reasonName, result+"%"); + ApplyReasonGroupDTO applyReasonGroupDTO = new ApplyReasonGroupDTO(); + applyReasonGroupDTO.setQuantity(group.getQuantity()); + applyReasonGroupDTO.setVisitReason(reasonName); + applyReasonGroupDTO.setRatio(result+"%"); + resultList.add(applyReasonGroupDTO); }); - return ResponseData.success(resultMap); + return ResponseData.success(resultList); } /** @@ -247,6 +267,32 @@ } /** + * 机动力量实时在岗率,在岗人数除以总应在岗人数,用离岗+6小时内恢复为100%,6小时外再计算 + */ + @GetMapping("/staff/beOnDutyRatio") + @ResponseBody + public Object beOnDutyRatio() { + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("staff_type", 2); + // TODO: 2022/9/2 后续使用产品确定的每天出勤的安保人员的数量 + Integer total = staffInfoMapper.selectCount(wrapper); + if(0 == total){ + return ResponseData.success(null); + } + //当日离岗事件按设备去重后的个数 + // TODO: 2022/9/2 目前相当于24小时内的计算,之后看需要可改成自定义小时数计算离岗率,即离岗+6小时内仅一次离岗则恢复为100%,多次则累加离岗次数计算离岗率 + List onDutyRatioDTOS = caseInfoMapper.selectDemobilizedCountByHour(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); + onDutyRatioDTOS.forEach(dto -> { + NumberFormat numberFormat = NumberFormat.getInstance(); + // 设置精确到小数点后2位 + numberFormat.setMaximumFractionDigits(2); + String result = numberFormat.format(100 - Float.valueOf(dto.getQuantity()) / (float) total * 100); + dto.setRatio(result+"%"); + }); + return ResponseData.success(onDutyRatioDTOS); + } + + /** * 闸机速通门统计-设备状态分组计算数量,devType传闸机字典key * 视频频监控摄像机统计-设备状态分组计算数量,devType传摄像头字典key */ @@ -262,12 +308,17 @@ if(sum <= 0){ return ResponseData.error("无该类设备信息"); } + List resultList = new ArrayList<>(); gateStatusGroup.forEach(group -> { String devStatus = dictService.getDictNameByCode(SecurityEventDict.DEVICE_STATUS, group.getStatus()); String result = numberFormat.format((float) group.getQuantity() / (float) sum * 100); - resultMap.put(devStatus, result+"%"); + GateStatusGroupResponse gateStatusGroupResponse = new GateStatusGroupResponse(); + gateStatusGroupResponse.setStatus(devStatus); + gateStatusGroupResponse.setRatio(result+"%"); + resultList.add(gateStatusGroupResponse); }); - resultMap.put("总", sum); + resultMap.put("total", sum); + resultMap.put("list", resultList); return ResponseData.success(resultMap); } @@ -282,17 +333,38 @@ String position = securityScoreDTO.getPosition(); List caseInfos = caseInfoMapper.selectByPosition(position); //查询各危险级别权重、各类别权重,放入map,避免循环中多次查数据库 - + HashMap hazardScoreMap = new HashMap<>(); + List caseHazardLevelList = hazardLevelMapper.getCaseHazardLevelList(null); + caseHazardLevelList.forEach(hazardLevel -> { + hazardScoreMap.put(hazardLevel.getCode(), hazardLevel.getWeight()); + }); + HashMap categoryScoreMap = new HashMap<>(); + List categoryLevelList = categoryLevelMapper.getCaseCategoryLevelList(null); + categoryLevelList.forEach(categoryLevel -> { + categoryScoreMap.put(categoryLevel.getCode(), categoryLevel.getWeight()); + }); + //事件按楼层分组,计算 List securityScoreDTOs = new ArrayList<>(); caseInfos.forEach(caseInfo -> { SecurityScoreDTO securityScoreDTO1 = new SecurityScoreDTO(); + securityScoreDTO1.setPosition(caseInfo.getPosition()); securityScoreDTO1.setArea(caseInfo.getArea()); - // TODO: 2022/8/4 楼层评分计算根据产品定义调整 -// caseInfo.get -// securityScoreDTO1.setScore(); + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); + Double score = 100 - Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + securityScoreDTO1.setScore(score); + securityScoreDTOs.add(securityScoreDTO1); }); - - return null; + 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); + }); + return ResponseData.success(securityScoreDTOs); } /** @@ -303,9 +375,13 @@ public Object SecurityFrequency(@RequestBody SecurityFrequencyDTO securityFrequencyDTO) { String year = securityFrequencyDTO.getYear(); String month = securityFrequencyDTO.getMonth(); - Integer quantity = caseInfoMapper.selectCountByMonth(year, month); - securityFrequencyDTO.setQuantity(quantity); - return ResponseData.success(securityFrequencyDTO); + if(!StringUtils.isEmpty(year) && StringUtils.isEmpty(month)){ + Integer quantity = caseInfoMapper.selectCountByMonth(year, month); + securityFrequencyDTO.setQuantity(quantity); + return ResponseData.success(securityFrequencyDTO); + } + List list = caseInfoMapper.selectPreMonthCount(); + return ResponseData.success(list); } } 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 ae4d770..f4f075c 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 @@ -1,20 +1,25 @@ package com.casic.missiles.modular.controller.cockpit; +import cn.hutool.core.date.DateUnit; import cn.hutool.core.date.DateUtil; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.casic.missiles.model.response.ResponseData; -import com.casic.missiles.modular.dao.AttendanceInfoMapper; -import com.casic.missiles.modular.dao.CaseInfoMapper; -import com.casic.missiles.modular.dao.HazardLevelMapper; -import com.casic.missiles.modular.dao.StaffInfoMapper; +import com.casic.missiles.modular.dao.*; +import com.casic.missiles.modular.dto.DeviceRepairLogDTO; +import com.casic.missiles.modular.dto.DeviceRepairRequest; import com.casic.missiles.modular.dto.statistics.*; +import com.casic.missiles.modular.enums.SecurityEventType; +import com.casic.missiles.modular.model.CaseCategoryLevel; import com.casic.missiles.modular.model.CaseHazardLevel; +import com.casic.missiles.modular.model.CaseInfo; import com.casic.missiles.modular.model.StaffInfo; +import com.casic.missiles.modular.service.DeviceInfoService; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.util.CollectionUtils; import org.springframework.web.bind.annotation.*; +import java.math.BigDecimal; import java.text.NumberFormat; import java.util.*; import java.util.stream.Collectors; @@ -40,6 +45,12 @@ @Autowired private HazardLevelMapper hazardLevelMapper; + @Autowired + private CategoryLevelMapper categoryLevelMapper; + + @Autowired + private DeviceInfoService deviceInfoService; + /** * 安防事件时域频次统计,每月的每天安防事件个数(原方案) * 月维度:展示每个月的每天的数据 @@ -89,15 +100,17 @@ List monthList = caseInfoMapper.selectPreMonthCountByYear(year); Map> collect = monthList.stream().collect(Collectors.groupingBy(PreMonthOrWeekCaseDTO::getHazardLevelCode)); HashMap strAvgMap = new HashMap<>(); + List resultList = new ArrayList<>(); for (String key : collect.keySet()) { List preMonthOrWeekCaseDTOS = collect.get(key); int sum = preMonthOrWeekCaseDTOS.stream().mapToInt(PreMonthOrWeekCaseDTO::getQuantity).sum(); //若年份是本年,则使用个安防级别数量/当前月份数 //若不是本年,除数为12 MonthAndWeekDTO monthAndWeekDTO = new MonthAndWeekDTO(); + String hazardName = hazardLevelMapper.selectHazardNameByCode(key); + monthAndWeekDTO.setLevelName(hazardName); if(year.equals(String.valueOf(DateUtil.thisYear()))){ monthAndWeekDTO.setMonthQuantity(sum / DateUtil.thisMonth()); -// monthAndWeekDTO.setLevelName(); strAvgMap.put(key, monthAndWeekDTO); }else{ monthAndWeekDTO.setMonthQuantity(sum / 12); @@ -113,27 +126,37 @@ if(year.equals(String.valueOf(DateUtil.thisYear()))){ if(!Objects.isNull(strAvgMap.get(key))){ MonthAndWeekDTO monthAndWeekDTO = strAvgMap.get(key); + String hazardName = hazardLevelMapper.selectHazardNameByCode(key); + monthAndWeekDTO.setLevelName(hazardName); monthAndWeekDTO.setWeekQuantity(sum / DateUtil.thisWeekOfYear()); strAvgMap.put(key, monthAndWeekDTO); }else{ MonthAndWeekDTO monthAndWeekDTO = new MonthAndWeekDTO(); + String hazardName = hazardLevelMapper.selectHazardNameByCode(key); + monthAndWeekDTO.setLevelName(hazardName); monthAndWeekDTO.setWeekQuantity(sum / DateUtil.thisWeekOfYear()); strAvgMap.put(key, monthAndWeekDTO); } }else{ if(!Objects.isNull(strAvgMap.get(key))){ MonthAndWeekDTO monthAndWeekDTO = strAvgMap.get(key); + String hazardName = hazardLevelMapper.selectHazardNameByCode(key); + monthAndWeekDTO.setLevelName(hazardName); monthAndWeekDTO.setWeekQuantity(sum / 52); strAvgMap.put(key, monthAndWeekDTO); }else{ MonthAndWeekDTO monthAndWeekDTO = new MonthAndWeekDTO(); + String hazardName = hazardLevelMapper.selectHazardNameByCode(key); + monthAndWeekDTO.setLevelName(hazardName); monthAndWeekDTO.setWeekQuantity(sum / 52); strAvgMap.put(key, monthAndWeekDTO); } } } - avgMonthAndWeekGroupDTO.setMap(strAvgMap); - return ResponseData.success(avgMonthAndWeekGroupDTO); + strAvgMap.keySet().forEach(key -> { + resultList.add(strAvgMap.get(key)); + }); + return ResponseData.success(resultList); } /** @@ -181,12 +204,178 @@ } /** - * 员工考勤人数变化,功能待定 + * 员工考勤人数变化,统计当天(横坐标为时)及近7天(横坐标为天)的考勤人数变化,只要发生一次考勤识别,次数的基数就正常增加(没有上班下班区分) */ + @PostMapping("/staff/attendanceNumber/{dimension}") + @ResponseBody + public Object attendanceNumber(@PathVariable("dimension") String dimension) { + List attendanceNumberDTOs = null; + List> resultList = new ArrayList<>(); + if("week".equals(dimension)){ + //近7天数据按天分组统计 + attendanceNumberDTOs = attendanceInfoMapper.getCountForWeek(); + }else if("day".equals(dimension)) { + //今天数据按小时分组统计 + attendanceNumberDTOs = attendanceInfoMapper.getCountForDay(); + } + if(CollectionUtils.isEmpty(attendanceNumberDTOs)){ + return ResponseData.error("该查询条件下,无员工出勤数据!"); + } + Map> collect = attendanceNumberDTOs.stream().collect(Collectors.groupingBy(AttendanceNumberDTO::getDate)); + collect.keySet().forEach(key -> { + List attendanceNumberDTOS = collect.get(key); + AttendanceNumberDTO attendanceNumberDTO = attendanceNumberDTOS.get(0); + AttendanceNumberDTO attendanceNumberDTO2 = attendanceNumberDTOS.get(1); + Map resultMap = new HashMap<>(); + resultMap.put(attendanceNumberDTO.getStaffType(), attendanceNumberDTO.getQuantity()); + resultMap.put(attendanceNumberDTO2.getStaffType(), attendanceNumberDTO2.getQuantity()); + resultMap.put("staticTime", attendanceNumberDTO.getDate()); + resultList.add(resultMap); + }); + return ResponseData.success(resultList); + } /** - * 近30天/近一周安保人员到岗排行 + * 早晚高峰区域安防评估 */ + @PostMapping("/security/assessment/{dimension}") + @ResponseBody + public Object securityAssessment(@PathVariable("dimension") String dimension) { + //查询各危险级别权重、各类别权重,放入map,避免循环中多次查数据库 + HashMap hazardScoreMap = new HashMap<>(); + List caseHazardLevelList = hazardLevelMapper.getCaseHazardLevelList(null); + caseHazardLevelList.forEach(hazardLevel -> { + hazardScoreMap.put(hazardLevel.getCode(), hazardLevel.getWeight()); + }); + HashMap categoryScoreMap = new HashMap<>(); + List categoryLevelList = categoryLevelMapper.getCaseCategoryLevelList(null); + categoryLevelList.forEach(categoryLevel -> { + categoryScoreMap.put(categoryLevel.getCode(), categoryLevel.getWeight()); + }); + HashMap hashMap = new HashMap<>(); + if("week".equals(dimension)){ + //近7天早晚高峰数据 + List caseInfos = caseInfoMapper.selectListBySevenDay(); + //按时间(天)进行分组 + caseInfos.forEach(caseInfo -> { + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); + Double score = Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + String[] array = caseInfo.getHappenTime().split(" "); + String dayTime = array[0]; + BigDecimal preScore; + if(hashMap.containsKey(dayTime)){ + Double aDouble = hashMap.get(dayTime); + preScore = new BigDecimal(aDouble.toString()); + + }else{ + preScore = new BigDecimal("100.0"); + } + BigDecimal nowScore = new BigDecimal(score.toString()); + hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); + }); + return ResponseData.success(hashMap); + }else if("day".equals(dimension)) { + //今天数据按小时分组统计 + List caseInfos = caseInfoMapper.selectListByToday(); + caseInfos.forEach(caseInfo -> { + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); + Double score = Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + String[] array = caseInfo.getHappenTime().split(":"); + String dayTime = array[0]; + BigDecimal preScore; + if(hashMap.containsKey(dayTime)){ + Double aDouble = hashMap.get(dayTime); + preScore = new BigDecimal(aDouble.toString()); + + }else{ + preScore = new BigDecimal("100.0"); + } + BigDecimal nowScore = new BigDecimal(score.toString()); + hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); + }); + return ResponseData.success(hashMap); + } + return null; + } + + /** + * 重点区域安防事态评估,统计重点区域6:00-23:00按小时分组数据 + */ + @GetMapping("/security/keyAreaStatistic") + @ResponseBody + public Object keyAreaStatistic() { + //查询各危险级别权重、各类别权重,放入map,避免循环中多次查数据库 + HashMap hazardScoreMap = new HashMap<>(); + List caseHazardLevelList = hazardLevelMapper.getCaseHazardLevelList(null); + caseHazardLevelList.forEach(hazardLevel -> { + hazardScoreMap.put(hazardLevel.getCode(), hazardLevel.getWeight()); + }); + HashMap categoryScoreMap = new HashMap<>(); + List categoryLevelList = categoryLevelMapper.getCaseCategoryLevelList(null); + categoryLevelList.forEach(categoryLevel -> { + categoryScoreMap.put(categoryLevel.getCode(), categoryLevel.getWeight()); + }); + HashMap hashMap = new HashMap<>(); + //今天数据按小时分组统计 + List caseInfos = caseInfoMapper.selectListByToday2(); + caseInfos.forEach(caseInfo -> { + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); + Double score = Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + String[] array = caseInfo.getHappenTime().split(":"); + String dayTime = array[0]; + BigDecimal preScore; + if(hashMap.containsKey(dayTime)){ + Double aDouble = hashMap.get(dayTime); + preScore = new BigDecimal(aDouble.toString()); + + }else{ + preScore = new BigDecimal("100.0"); + } + BigDecimal nowScore = new BigDecimal(score.toString()); + hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); + }); + return ResponseData.success(hashMap); + } + + /** + * 安防机动支援力量调配响应评估,根据事件已解决状态及已解决时间-发送时间,按时间(小时)分组统计 + */ + @GetMapping("/security/responseAssess") + @ResponseBody + public Object responseAssess() { + //查询各危险级别权重、各类别权重,放入map,避免循环中多次查数据库 + HashMap hazardScoreMap = new HashMap<>(); + List caseHazardLevelList = hazardLevelMapper.getCaseHazardLevelList(null); + caseHazardLevelList.forEach(hazardLevel -> { + hazardScoreMap.put(hazardLevel.getCode(), hazardLevel.getWeight()); + }); + HashMap hashMap = new HashMap<>(); + //今天数据按小时分组统计 + List caseInfos = caseInfoMapper.selectListByToday3(); + caseInfos.forEach(caseInfo -> { + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + //扣分=事件级别权重*未解决小时数 + Date updateTime = DateUtil.parse(caseInfo.getUpdateTime()); + Date happenTime = DateUtil.parse(caseInfo.getHappenTime()); + long between = DateUtil.between(updateTime, happenTime, DateUnit.HOUR); + Double score = Double.valueOf(hazardWeight)*between; + String[] array = caseInfo.getHappenTime().split(":"); + String dayTime = array[0]; + BigDecimal preScore; + if(hashMap.containsKey(dayTime)){ + Double aDouble = hashMap.get(dayTime); + preScore = new BigDecimal(aDouble.toString()); + }else{ + preScore = new BigDecimal("100.0"); + } + BigDecimal nowScore = new BigDecimal(score.toString()); + hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); + }); + return ResponseData.success(hashMap); + } /** * 重点区域威胁事件类型统计,优先级2,统计近7天和近30天 @@ -224,7 +413,34 @@ } /** - * 设备状态计算系数和评判,优先级3,需确认设备恢复时间是否可以获取 + * 近30天/近一周安保人员到岗排行 */ + + /** + * 安保等级评估,发生离岗事件减1分 + */ + @GetMapping("/security/levelAssess") + @ResponseBody + public Object securityLevelAssess() { + //今天数据按小时分组统计 + List resultList = caseInfoMapper.selectListByType(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); + resultList.forEach(result -> { + BigDecimal deScore = new BigDecimal(result.getQuantity()); + BigDecimal preScore = new BigDecimal("100.0"); + result.setScore(preScore.subtract(deScore).doubleValue()); + }); + return ResponseData.success(resultList); + } + + /** + * 设备状态计算系数和评判,即设备维修管理查询(不分页) + */ + @PostMapping("/device/repairList") + @ResponseBody + public Object repairList(@RequestBody DeviceRepairRequest deviceRepairRequest) { + List deviceRepairLogDTOS = deviceInfoService.deviceRepairListPage(deviceRepairRequest); + return ResponseData.success(deviceRepairLogDTOS); + } + } 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 fbf8ab6..c71a15a 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 @@ -1,13 +1,12 @@ package com.casic.missiles.modular.controller.hik; +import cn.hutool.core.date.DateTime; +import cn.hutool.core.date.DateUtil; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.casic.missiles.model.response.ResponseData; import com.casic.missiles.modular.dao.HikFaceGroupInfoMapper; -import com.casic.missiles.modular.dto.hik.EventSubscribeRequest; -import com.casic.missiles.modular.dto.hik.FaceGroupAdditionRequest; -import com.casic.missiles.modular.dto.hik.HikRecvEvent; -import com.casic.missiles.modular.dto.hik.OrgBatchAdd; +import com.casic.missiles.modular.dto.hik.*; import com.casic.missiles.modular.enums.HikUri; import com.casic.missiles.modular.enums.SecurityEventType; import com.casic.missiles.modular.model.CaseInfo; @@ -18,16 +17,20 @@ import com.casic.missiles.modular.util.CaseInfoFactoryUtil; import com.casic.missiles.modular.util.HikUtil; import com.casic.missiles.modular.util.ThreadPoolUtil; +import com.casic.missiles.modular.util.WebSocket; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; -import org.springframework.web.bind.annotation.*; +import org.springframework.util.CollectionUtils; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.RestController; -import java.net.InetAddress; -import java.net.UnknownHostException; import java.util.ArrayList; +import java.util.Iterator; import java.util.List; import java.util.Objects; @@ -38,7 +41,6 @@ */ @Slf4j @RestController -@RequestMapping("/hik") public class HikController { @Autowired @@ -53,28 +55,37 @@ @Autowired private HikService hikService; + @Autowired + private HikFaceGroupInfoMapper hikFaceGroupInfoMapper; + + @Autowired + private WebSocket webSocket; + @Value("${server.port}") private int serverPort; - @Autowired - private HikFaceGroupInfoMapper hikFaceGroupInfoMapper; /** * 海康事件订阅 */ - @PostMapping("/event/subscribe") + @PostMapping("/hik/event/subscribe") @ResponseBody - public Object eventSubscribe() throws UnknownHostException { + public Object eventSubscribe() { EventSubscribeRequest eventSubscribeRequest = new EventSubscribeRequest(); ArrayList list = new ArrayList<>(); list.add(SecurityEventType.DEVICE_OFFLINE); + list.add(SecurityEventType.DEVICE_ONLINE); list.add(SecurityEventType.KEY_PERSONNEL_IDENTIFY_EVENT); list.add(SecurityEventType.MONITORING_POINT_OFFLINE); + list.add(SecurityEventType.MONITORING_POINT_ONLINE); list.add(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); list.add(SecurityEventType.PERSONNEL_GATHER_EVENT); - InetAddress localHost = InetAddress.getLocalHost(); + list.add(SecurityEventType.VISITOR_REGISTER); + list.add(SecurityEventType.VISITOR_CHECKOUT); + list.add(SecurityEventType.HIGH_ALTITUDE_PARABOLIC); +// InetAddress localHost = InetAddress.getLocalHost(); eventSubscribeRequest.setEventTypes(list); - eventSubscribeRequest.setEventDest("https://" + localHost + ":" + serverPort + "/eventRcv"); + eventSubscribeRequest.setEventDest("http://" + "192.168.10.6" + ":" + serverPort + "/eventRcv"); //订阅类型,0-订阅原始事件,1-联动事件,2-原始事件和联动事件,不填使用默认值0 eventSubscribeRequest.setSubType(0); /** @@ -92,19 +103,25 @@ } /** + * 查询事件订阅信息 + */ + @PostMapping("/hik/event/query") + @ResponseBody + public Object eventQuery() { + String result = HikUtil.hikApi(HikUri.EVENT_INFO, ""); + return result; + } + + /** * 海康事件接收 */ @PostMapping("/eventRcv") @ResponseBody public Object eventRcv(@RequestBody HikRecvEvent hikRecvEvent) { //1、接收所需事件类型 - Long eventType = hikRecvEvent.getEventType(); + Number eventType = hikRecvEvent.getEventType(); log.info("接收到安防事件类型为:{}", eventType); CaseInfo caseInfo = caseInfoFactoryUtil.getCaseInfo(eventType); - //接收到不关心事件直接返回 - if(Objects.isNull(caseInfo)){ - return ResponseData.success(); - } //2、不同事件不同处理,caseInfoFactoryUtil已设置好事件基础定义信息 // 再为事件添加状态、设备编码、设备名称、位置、区域、时间 // 异步处理事件 @@ -114,19 +131,23 @@ caseHandle(hikRecvEvent, eventType, caseInfo); } })); +// caseHandle(hikRecvEvent, eventType, caseInfo); - return null; + return ResponseData.success(); } - private void caseHandle(HikRecvEvent hikRecvEvent, Long eventType, CaseInfo caseInfo) { + private void caseHandle(HikRecvEvent hikRecvEvent, Number eventType, CaseInfo caseInfo) { JSONArray eventArray = hikRecvEvent.getEventArray(); List caseInfos = new ArrayList<>(); - while (eventArray.stream().iterator().hasNext()) { + Iterator iterator = eventArray.iterator(); + while (iterator.hasNext()) { CaseInfo caseInfo1 = new CaseInfo(); - BeanUtils.copyProperties(caseInfo, caseInfo1); - JSONObject event = (JSONObject) eventArray.stream().iterator().next(); + if(!Objects.isNull(caseInfo)){ + BeanUtils.copyProperties(caseInfo, caseInfo1); + } + JSONObject event = (JSONObject) iterator.next(); //5种事件进行不同处理 - if(SecurityEventType.KEY_PERSONNEL_IDENTIFY_EVENT == eventType){ + if (SecurityEventType.KEY_PERSONNEL_IDENTIFY_EVENT.equals(eventType)) { //判断所属人脸分组 JSONObject data = (JSONObject) event.get("data"); JSONObject faceRecognitionResult = (JSONObject) data.get("faceRecognitionResult"); @@ -142,52 +163,101 @@ if (faceGroupCode.equals(blackListGroup.getFaceGroupCode())) { //黑名单分组处理 caseInfo1 = hikService.blackListHandle(event, caseInfo1); - }else if(faceGroupCode.equals(propertyPersonnelGroup.getFaceGroupCode())){ + } else if (faceGroupCode.equals(propertyPersonnelGroup.getFaceGroupCode())) { //考勤分组处理-物业人员,添加到考勤表 hikService.propertyAttendanceHandle(event); - }else if(faceGroupCode.equals(securityPersonnelGroup.getFaceGroupCode())){ + } else if (faceGroupCode.equals(securityPersonnelGroup.getFaceGroupCode())) { //考勤分组处理-安保人员,添加到考勤表 hikService.securityPersonnelHandle(event); - }else { + } else { return; } - }else if(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT == eventType){ + } else if (SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT.equals(eventType)) { //离岗事件处理 caseInfo1 = hikService.demobilizedHandle(event, caseInfo1); - }else if(SecurityEventType.PERSONNEL_GATHER_EVENT == eventType){ + } else if (SecurityEventType.PERSONNEL_GATHER_EVENT.equals(eventType)) { //人员聚集事件处理 caseInfo1 = hikService.personGatherHandle(event, caseInfo1); - }else if(SecurityEventType.MONITORING_POINT_OFFLINE == eventType){ + } else if (SecurityEventType.MONITORING_POINT_OFFLINE.equals(eventType)) { //监控点离线事件处理 caseInfo1 = hikService.monitorPointOfflineHandle(event, caseInfo1); - }else if(SecurityEventType.DEVICE_OFFLINE == eventType){ + } else if (SecurityEventType.MONITORING_POINT_ONLINE.equals(eventType)) { + //监控点上线事件处理 + hikService.monitorPointOnlineHandle(event); + } else if (SecurityEventType.DEVICE_OFFLINE.equals(eventType)) { //装置离线事件处理 caseInfo1 = hikService.deviceOfflineHandle(event, caseInfo1); - }else if(SecurityEventType.VISITOR_REGISTER == eventType){ + } else if (SecurityEventType.DEVICE_ONLINE.equals(eventType)) { + //装置上线处理 + hikService.deviceOnlineHandle(event); + } else if (SecurityEventType.VISITOR_REGISTER.equals(eventType)) { //记录访客登记记录,添加到访客记录表 hikService.visitorRegisterHandler(event); - }else if(SecurityEventType.VISITOR_CHECKOUT == eventType){ + } else if (SecurityEventType.VISITOR_CHECKOUT.equals(eventType)) { //记录访客签离记录 hikService.visitorCheckOutHandler(event); } - if(!Objects.isNull(caseInfo1) && !StringUtils.isEmpty(caseInfo1.getHappenTime())){ + if (!Objects.isNull(caseInfo1) && !StringUtils.isEmpty(caseInfo1.getHappenTime())) { caseInfos.add(caseInfo1); } } //3、安防事件入库 - if(!caseInfoService.insertCaseInfoBatch(caseInfos)){ - log.error("安防事件批量入库异常"); + if (!CollectionUtils.isEmpty(caseInfos) && !caseInfoService.insertCaseInfoBatch(caseInfos)) { + log.error("安防事件批量入库异常!"); } // TODO: 2022/8/15 webSocket推送 + if (CollectionUtils.isEmpty(caseInfos)) { + log.info("webSocket事件推送"); + webSocket.sendAllMessage(JSONObject.toJSONString(caseInfos)); + } return; } /** + * 以图搜图,前端用于轨迹追踪 + */ + @PostMapping("/hik/search/picture") + @ResponseBody + public Object searchPictures(@RequestBody SearchPicturesRequest searchPicturesRequest) { + DateTime startDateTime = DateUtil.parse(searchPicturesRequest.getStartTime()); + DateTime endDateTime = DateUtil.parse(searchPicturesRequest.getEndTime()); + String startTime = DateUtil.format(startDateTime, "yyyy-MM-dd'T'HH:mm:ss.SSSXXX"); + String endTime = DateUtil.format(endDateTime, "yyyy-MM-dd'T'HH:mm:ss.SSSXXX"); + searchPicturesRequest.setStartTime(startTime); + searchPicturesRequest.setEndTime(endTime); + String body = JSONObject.toJSONString(searchPicturesRequest); + String resultStr = HikUtil.hikApi(HikUri.SEARCH_PICTURES, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (!"0".equals(resultJson.get("code"))) { + log.error("请求海康,以图搜图失败,海康response:{}", resultStr); + return ResponseData.error("以图搜图失败"); + } + return ResponseData.success(resultJson); + } + + + /** + * 海康事件取消订阅 + */ + @PostMapping("/hik/event/cancel") + @ResponseBody + public Object eventCancelSubscribe(@RequestBody CancelSubscribeRequest cancelSubscribeRequest) { + String body = JSONObject.toJSONString(cancelSubscribeRequest); + String resultStr = HikUtil.hikApi(HikUri.EVENT_CANCEL, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (!"0".equals(resultJson.get("code"))) { + log.error("请求海康,取消订阅失败,海康response:{}", resultStr); + return ResponseData.error("取消订阅失败"); + } + return ResponseData.success(resultJson); + } + + /** * 单个添加海康人脸分组 * api->hik单个添加人脸分组api->response->mysql */ - @PostMapping("/faceGroup/single/add") + @PostMapping("/hik/faceGroup/single/add") @ResponseBody public Object faceGroupAddition(@RequestBody FaceGroupAdditionRequest faceGroupAdditionRequest) { String body = JSONObject.toJSONString(faceGroupAdditionRequest); @@ -212,7 +282,7 @@ * 批量添加海康组织 * api->hik批量添加组织api->response */ - @PostMapping("/org/batch/add") + @PostMapping("/hik/org/batch/add") @ResponseBody public Object orgBatchAdd(@RequestBody List orgBatchAddRequest) { String body = JSONObject.toJSONString(orgBatchAddRequest); @@ -232,4 +302,62 @@ return ResponseData.error("批量添加组织失败"); } + /** + * 获取人员列表 + */ + @PostMapping("/hik/person/personList") + @ResponseBody + public Object personList() { + PersonListRequest request = new PersonListRequest(); + request.setPageNo(1); + request.setPageSize(100); + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi("/api/resource/v2/person/personList", body); + return resultStr; + } + + /** + * 获取组织列表 + */ + @PostMapping("/hik/org/orgList") + @ResponseBody + public Object orgList() { + PersonListRequest request = new PersonListRequest(); + request.setPageNo(1); + request.setPageSize(100); + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi("/api/resource/v1/org/orgList", body); + return resultStr; + } + + /** + * 查询访客权限下载记录 + */ + @PostMapping("/hik/auth/result") + @ResponseBody + public Object authResult() { + PersonListRequest request = new PersonListRequest(); + request.setPageNo(1); + request.setPageSize(100); + request.setOrderId("ba101db6246711edaea66f7939a13638"); + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi("/api/visitor/v1/auth/result", body); + return resultStr; + } + + /** + * 人脸图片获取 + */ + @PostMapping("/hik/face/picture") + @ResponseBody + public Object facePicture() { + FaceRequest request = new FaceRequest(); +// List list = new ArrayList<>(); +// list.add(""); + request.setCertificateNum("wanggong"); + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi("/api/frs/v1/face", body); + return resultStr; + } + } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/AssetInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/AssetInfoMapper.java index 4f64e83..c0684ee 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/AssetInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/AssetInfoMapper.java @@ -17,6 +17,6 @@ @Mapper public interface AssetInfoMapper extends BaseMapper { - List getAssetInfoListPage(@Param("page") Page page, AssetInfoRequest assetInfoRequest); + List getAssetInfoListPage(@Param("page") Page page, @Param("assetInfoRequest") AssetInfoRequest assetInfoRequest); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/AttendanceInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/AttendanceInfoMapper.java index f9e793e..ec87e46 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/AttendanceInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/AttendanceInfoMapper.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.statistics.AttendanceNumberDTO; import com.casic.missiles.modular.dto.statistics.AttendanceRatioDTO; import com.casic.missiles.modular.model.AttendanceInfo; import org.apache.ibatis.annotations.Mapper; @@ -17,7 +18,7 @@ */ @Mapper public interface AttendanceInfoMapper extends BaseMapper { - List getAttendanceInfoListPage(@Param("page") Page page, StaffInfoRequest attendanceInfoRequest); + List getAttendanceInfoListPage(@Param("page") Page page, @Param("attendanceInfoRequest") StaffInfoRequest attendanceInfoRequest); AttendanceInfo selectByCodeAndDate(@Param("staffCode") String staffCode); @@ -26,4 +27,8 @@ List getCountByTypeAndDateForMonth(@Param("staffType")String staffType); List getCountByTypeAndDateForYear(@Param("staffType")String staffType); + + List getCountForWeek(); + + List getCountForDay(); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java index ce94b8f..6137a7d 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java @@ -17,5 +17,5 @@ @Mapper public interface BlackInfoMapper extends BaseMapper { - List getBlackInfoListPage(@Param("page") Page page, BlackInfoRequest blackInfoRequest); + List getBlackInfoListPage(@Param("page") Page page, @Param("blackInfoRequest") BlackInfoRequest blackInfoRequest); } 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 efda6b3..50aaa6f 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 @@ -20,7 +20,7 @@ List getCaseInfoListPage(@Param("page") Page page, @Param("caseInfoRequest") CaseInfoRequest caseInfoRequest); - int updateStatusById(CaseInfoRequest caseInfoRequest); + int updateStatusById(@Param("caseInfoRequest") CaseInfoRequest caseInfoRequest); List selectByLevelAndMonth(@Param("year") String year); @@ -47,4 +47,20 @@ List selectPreWeekCountByThirtyDay(); List selectPreDayCountBySevenDay(); + + Integer selectDemobilizedCount(@Param("eventType") Number personnelDemobilizedEvent); + + List selectPreMonthCount(); + + List selectListBySevenDay(); + + List selectListByToday(); + + List selectListByToday2(); + + List selectListByToday3(); + + List selectListByType(@Param("eventType") Number eventType); + + List selectDemobilizedCountByHour(@Param("eventType") Number eventType); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/CategoryLevelMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/CategoryLevelMapper.java index 52fc714..afe1650 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/CategoryLevelMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/CategoryLevelMapper.java @@ -17,9 +17,9 @@ @Mapper public interface CategoryLevelMapper extends BaseMapper { - List getCaseCategoryLevelListPage(@Param("page") Page page, CategoryLevelRequest categoryLevelRequest); + List getCaseCategoryLevelListPage(@Param("page") Page page, @Param("categoryLevelRequest") CategoryLevelRequest categoryLevelRequest); - List getCaseCategoryLevelList(CategoryLevelRequest categoryLevelRequest); + List getCaseCategoryLevelList(@Param("categoryLevelRequest") CategoryLevelRequest categoryLevelRequest); CaseCategoryLevel getCaseCategoryLevel(@Param("categoryLevelCode") String categoryLevelCode); 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 66353b1..2555a09 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 @@ -19,7 +19,7 @@ @Mapper public interface DeviceInfoMapper extends BaseMapper { - List getDeviceInfoListPage(@Param("page") Page page, DeviceInfoRequest deviceInfoRequest); + List getDeviceInfoListPage(@Param("page") Page page, @Param("deviceInfoRequest") DeviceInfoRequest deviceInfoRequest); List getDeviceInfoList(@Param("deviceInfoRequest") DeviceInfoRequest deviceInfoRequest); @@ -27,6 +27,8 @@ DeviceInfo getByIndexCode(@Param("srcIndex") String srcIndex); + DeviceInfo getByIp(@Param("ip") String ip); + List selectIndexCodesByCodes(@Param("deviceCodes") List deviceCodes); List selectByType(@Param("devType") String devType); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java index 41dd0af..5bfaf63 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java @@ -5,6 +5,7 @@ import com.casic.missiles.modular.dto.DeviceRepairRequest; import com.casic.missiles.modular.model.DeviceRepairLog; import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; import java.util.List; @@ -16,7 +17,7 @@ @Mapper public interface DeviceRepairLogMapper extends BaseMapper { - List getDeviceRepairListPage(Page page, DeviceRepairRequest deviceRepairRequest); + List getDeviceRepairListPage(@Param("page") Page page, @Param("deviceRepairRequest")DeviceRepairRequest deviceRepairRequest); - List getDeviceRepairList(DeviceRepairRequest deviceRepairRequest); + List getDeviceRepairList(@Param("deviceRepairRequest") DeviceRepairRequest deviceRepairRequest); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java index 9035c47..4823ac1 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java @@ -18,7 +18,7 @@ @Mapper public interface FireEquipInfoMapper extends BaseMapper { - List getFireEquipInfoListPage(@Param("page") Page page, FireEquipRequest fireEquipRequest); + List getFireEquipInfoListPage(@Param("page") Page page, @Param("fireEquipRequest") FireEquipRequest fireEquipRequest); FireEquipInfo getFireEquipInfo(@Param("equipCode") String equipCode); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/GateGroupMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/GateGroupMapper.java index d8c330d..977a427 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/GateGroupMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/GateGroupMapper.java @@ -17,7 +17,7 @@ */ @Mapper public interface GateGroupMapper extends BaseMapper { - List getGateGroupListPage(@Param("page") Page page, GateGroupRequest gateGroupRequest); + List getGateGroupListPage(@Param("page") Page page, @Param("gateGroupRequest") GateGroupRequest gateGroupRequest); GateGroup getGateGroupByName(@Param("groupName") String groupName); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/HazardLevelMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/HazardLevelMapper.java index 8957780..dcf47bb 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/HazardLevelMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/HazardLevelMapper.java @@ -17,11 +17,13 @@ @Mapper public interface HazardLevelMapper extends BaseMapper { - List getCaseHazardLevelListPage(@Param("page") Page page, HazardLevelRequest hazardLevelRequest); + List getCaseHazardLevelListPage(@Param("page") Page page, @Param("hazardLevelRequest") HazardLevelRequest hazardLevelRequest); - List getCaseHazardLevelList(HazardLevelRequest hazardLevelRequest); + List getCaseHazardLevelList(@Param("hazardLevelRequest") HazardLevelRequest hazardLevelRequest); CaseHazardLevel getCaseHazardLevel(@Param("hazardLevelCode") String hazardLevelCode); List selectHazardName(); + + String selectHazardNameByCode(@Param("hazardLevelCode") String hazardLevelCode); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/HikCaseDefineMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/HikCaseDefineMapper.java index 0dc47d1..f162fef 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/HikCaseDefineMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/HikCaseDefineMapper.java @@ -12,5 +12,5 @@ */ @Mapper public interface HikCaseDefineMapper extends BaseMapper { - HikCaseDefine getHikCaseDefine(@Param("caseTypeCode") Long caseTypeCode); + HikCaseDefine getHikCaseDefine(@Param("caseTypeCode") Number caseTypeCode); } 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 f8a674c..fe5afc2 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 @@ -17,11 +17,13 @@ @Mapper public interface StaffInfoMapper extends BaseMapper { - List getStaffInfoListPage(@Param("page") Page page, StaffInfoRequest staffInfoRequest); + List getStaffInfoListPage(@Param("page") Page page, @Param("staffInfoRequest") StaffInfoRequest staffInfoRequest); StaffInfo selectByCode(@Param("staffCode") String staffCode); - List getStaffInfoList(StaffInfoRequest staffInfoRequest); + List getStaffInfoList(@Param("staffInfoRequest") StaffInfoRequest staffInfoRequest); - List selectBatchCodes(List list); + List selectBatchCodes(@Param("list") List list); + + int updateByCodeForCard(@Param("staffCode") String staffCode, @Param("cardNo") String cardNo); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitInfoMapper.java index b1217c5..6c52542 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitInfoMapper.java @@ -16,7 +16,7 @@ */ @Mapper public interface VisitInfoMapper extends BaseMapper { - List getVisitInfoListPage(@Param("page") Page page, VisitorRequest visitorRequest); + List getVisitInfoListPage(@Param("page") Page page, @Param("visitorRequest") VisitorRequest visitorRequest); VisitInfo selectByOrderId(@Param("orderId") String orderId); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitorApplyMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitorApplyMapper.java index c09f3c0..6ea55bd 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitorApplyMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitorApplyMapper.java @@ -18,7 +18,7 @@ @Mapper public interface VisitorApplyMapper extends BaseMapper { - List getVisitorApplyListPage(@Param("page") Page page, VisitorApplyRequest visitorApplyRequest); + List getVisitorApplyListPage(@Param("page") Page page, @Param("visitorApplyRequest") VisitorApplyRequest visitorApplyRequest); List selectByVisitReason(); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/AttendanceInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/AttendanceInfoMapper.xml index b2ece71..f8bdd6e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/AttendanceInfoMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/AttendanceInfoMapper.xml @@ -43,7 +43,8 @@ and staff_type = #{staffType} - and YEARWEEK(date_format(atte_date, '%Y-%m-%d'), 1) = YEARWEEK(now(),1); + AND DATE_SUB(CURDATE(), INTERVAL 7 DAY) <= DATE(atte_date) + GROUP BY DATE_FORMAT(atte_date, '%Y-%m-%d') @@ -69,4 +70,20 @@ GROUP BY DATE_FORMAT(atte_date, '%Y-%m') + + + \ No newline at end of file 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 2b6953f..06ec0a8 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 @@ -28,7 +28,9 @@ @@ -87,7 +89,8 @@ SELECT hazard_level_code as levelCode, count(id) as quantity FROM bus_case_info WHERE hazard_level_code is not null - AND DATE_SUB(CURDATE(), INTERVAL 7 DAY) <= date(happen_time); + AND is_key_area = 1 + AND DATE_SUB(CURDATE(), INTERVAL 7 DAY) <= date(happen_time) GROUP BY hazard_level_code @@ -95,7 +98,8 @@ SELECT hazard_level_code as levelCode, count(id) as quantity FROM bus_case_info WHERE hazard_level_code is not null - AND DATE_SUB(CURDATE(), INTERVAL 30 DAY) <= date(happen_time); + AND is_key_area = 1 + AND DATE_SUB(CURDATE(), INTERVAL 30 DAY) <= date(happen_time) GROUP BY hazard_level_code @@ -122,4 +126,71 @@ AND hazard_level_code is not null GROUP BY DATE_FORMAT(happen_time,'%Y-%m-%d') + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/CategoryLevelMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/CategoryLevelMapper.xml index 4670b1f..1d25cbd 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/CategoryLevelMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/CategoryLevelMapper.xml @@ -20,11 +20,11 @@ SELECT * FROM bus_case_category_level WHERE 1=1 - - and code = #{code} + + and code = #{categoryLevelRequest.code} - - and name = #{name} + + and name = #{categoryLevelRequest.name} ORDER by create_time DESC 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 9b66fd8..bfd84b7 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 @@ -98,4 +98,10 @@ #{item} + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceRepairLogMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceRepairLogMapper.xml index 078ed3c..cf1a481 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceRepairLogMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceRepairLogMapper.xml @@ -22,14 +22,14 @@ SELECT * FROM bus_device_repair_log WHERE 1=1 - - and device_code = #{devCode} + + and device_code = #{deviceRepairRequest.devCode} - - and device_name = #{devName} + + and device_name = #{deviceRepairRequest.devName} - - and DATE_FORMAT(create_time,"%y%m%d") = DATE_FORMAT(#{createTime},"%y%m%d") + + and DATE_FORMAT(create_time,"%y%m%d") = DATE_FORMAT(#{deviceRepairRequest.createTime},"%y%m%d") ORDER by create_time DESC diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/HazardLevelMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/HazardLevelMapper.xml index f16f2b9..458322b 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/HazardLevelMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/HazardLevelMapper.xml @@ -20,11 +20,11 @@ SELECT * FROM bus_case_hazard_level WHERE 1=1 - - and code = #{code} + + and code = #{hazardLevelRequest.code} - - and name = #{name} + + and name = #{hazardLevelRequest.name} ORDER by create_time DESC @@ -42,4 +42,10 @@ SELECT name FROM bus_case_hazard_level + + \ 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 557237e..b6a183a 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 @@ -50,4 +50,10 @@ + + + UPDATE bus_staff_info + SET card_no = #{cardNo} + WHERE staff_code = #{staffCode} + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitInfoMapper.xml index 84aa84f..230529a 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitInfoMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitInfoMapper.xml @@ -27,5 +27,6 @@ SELECT * FROM bus_visit_info WHERE order_id = #{orderId} and DATE_FORMAT(in_time,'%Y-%m-%d') = CURRENT_DATE + limit 1 \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/BlackPictureRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/BlackPictureRequest.java new file mode 100644 index 0000000..fc92701 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/BlackPictureRequest.java @@ -0,0 +1,14 @@ +package com.casic.missiles.modular.dto; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/29 19:26 + */ +@Data +public class BlackPictureRequest { + private String picUri; + private String serverIndexCode; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/CancelSubscribeRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/CancelSubscribeRequest.java new file mode 100644 index 0000000..e2d390a --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/CancelSubscribeRequest.java @@ -0,0 +1,15 @@ +package com.casic.missiles.modular.dto.hik; + +import lombok.Data; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/24 15:14 + */ +@Data +public class CancelSubscribeRequest { + private List eventTypes; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/CardInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/CardInfo.java new file mode 100644 index 0000000..341457d --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/CardInfo.java @@ -0,0 +1,24 @@ +package com.casic.missiles.modular.dto.hik; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/26 16:08 + */ +@Data +public class CardInfo { + //卡号,8~20个字符,支持数字和大写字母 + private String cardNo; + //人员ID,员工工号 + private String personId; + //人员所属组织IndexCode + private String orgIndexCode; + //卡片类型,默认是1:IC卡 + //1:IC卡 + //2:CPU卡 + //3:远距离卡 + //4:MIFARE卡 + private Number cardType; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/FaceRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/FaceRequest.java new file mode 100644 index 0000000..edc04bf --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/FaceRequest.java @@ -0,0 +1,16 @@ +package com.casic.missiles.modular.dto.hik; + +import lombok.Data; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/25 16:53 + */ +@Data +public class FaceRequest { + private String certificateNum; + private List indexCodes; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/HikRecvEvent.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/HikRecvEvent.java index a3e9845..1b2b2b1 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/HikRecvEvent.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/HikRecvEvent.java @@ -28,12 +28,12 @@ /** * 事件类型,用于判断所需接收到的事件类型 */ - public Long getEventType(){ + public Number getEventType(){ JSONObject jsonObject = (JSONObject)JSONObject.toJSON(params); //事件类别对应SecurityEventTypeEnum JSONArray eventTypeArray = (JSONArray)jsonObject.get("events"); JSONObject eventJsonObject = (JSONObject)JSONObject.toJSON(eventTypeArray.get(0)); - Long eventType = (Long) eventJsonObject.get("eventType"); + Number eventType = (Number) eventJsonObject.get("eventType"); return eventType; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonBatchDeleteRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonBatchDeleteRequest.java index 027d31d..9751929 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonBatchDeleteRequest.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonBatchDeleteRequest.java @@ -12,4 +12,6 @@ @Data public class PersonBatchDeleteRequest { private List personIds; + //删除人脸接口使用 + private String faceId; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonInfoRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonInfoRequest.java new file mode 100644 index 0000000..05dc9e1 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonInfoRequest.java @@ -0,0 +1,20 @@ +package com.casic.missiles.modular.dto.hik; + +import lombok.Data; + +import java.util.List; + +/** + * @Description: 获取员工照片请求实体 + * @Author: wangpeng + * @Date: 2022/8/25 16:53 + */ +@Data +public class PersonInfoRequest { + //获取员工详细信息使用 + private String paramName; + private List paramValue; + //获取照片使用 + private String picUri; + private String serverIndexCode; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonListRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonListRequest.java new file mode 100644 index 0000000..3f7149b --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonListRequest.java @@ -0,0 +1,16 @@ +package com.casic.missiles.modular.dto.hik; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/25 16:53 + */ +@Data +public class PersonListRequest { + private Number pageNo; + private Number pageSize; + + private String orderId; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/SearchPicturesRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/SearchPicturesRequest.java new file mode 100644 index 0000000..0a95966 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/SearchPicturesRequest.java @@ -0,0 +1,24 @@ +package com.casic.missiles.modular.dto.hik; + +import lombok.Data; + +import java.util.List; + +/** + * @Description: 以图搜图请求 + * @Author: wangpeng + * @Date: 2022/8/29 10:46 + */ +@Data +public class SearchPicturesRequest { + private String facePicBinaryData; + private String facePicUrl; + private List cameraIndexCodes; + private String startTime; + private String endTime; + //指定搜图的最小相似度,最小为1,最大为100 + private String minSimilarity; + private Number age; + //male-男性,female-女性 + private String sex; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/StaffCardRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/StaffCardRequest.java new file mode 100644 index 0000000..4052e6d --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/StaffCardRequest.java @@ -0,0 +1,20 @@ +package com.casic.missiles.modular.dto.hik; + +import lombok.Data; + +import java.util.List; + +/** + * @Description: 人员开卡请求实体 + * @Author: wangpeng + * @Date: 2022/8/26 16:05 + */ +@Data +public class StaffCardRequest { + //卡片开始有效时间,时间格式:yyyy-MM-dd + private String startDate; + //卡片截止有效时间,时间格式:yyyy-MM-dd,不能大于2037年12月31日 + private String endDate; + //cardList,待开卡列表,最大支持50张卡 + private List cardList; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/VisitorInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/VisitorInfo.java index 73aa316..b99f301 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/VisitorInfo.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/VisitorInfo.java @@ -14,7 +14,7 @@ //访客性别 //1: 男 //2: 女 - private String gender; + private Integer gender; //联系电话建议填写手机号码 private String phoneNo; //证件类型 diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/ApplyReasonGroupDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/ApplyReasonGroupDTO.java index 514f382..786143e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/ApplyReasonGroupDTO.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/ApplyReasonGroupDTO.java @@ -13,4 +13,6 @@ private String visitReason; //访问人数 private Integer quantity; + //占比 + private String ratio; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/AttendanceNumberDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/AttendanceNumberDTO.java new file mode 100644 index 0000000..a494321 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/AttendanceNumberDTO.java @@ -0,0 +1,24 @@ +package com.casic.missiles.modular.dto.statistics; + +import com.fasterxml.jackson.annotation.JsonIgnore; +import lombok.Data; + +/** + * @Description: 出勤人数统计实体 + * @Author: wangpeng + * @Date: 2022/8/31 19:24 + */ +@Data +public class AttendanceNumberDTO { + //日期维度,周、今日,入参 + @JsonIgnore + private String dateDimension; + + //日期,具体天/小时,出参 + private String date; + //出勤人数 + private String quantity; + //员工类型 + private String staffType; + +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/AvgMonthAndWeekGroupDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/AvgMonthAndWeekGroupDTO.java index 4366916..331a9a9 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/AvgMonthAndWeekGroupDTO.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/AvgMonthAndWeekGroupDTO.java @@ -2,8 +2,6 @@ import lombok.Data; -import java.util.Map; - /** * @Description: 平均每月和每周的数据实体 * @Author: wangpeng @@ -13,6 +11,4 @@ public class AvgMonthAndWeekGroupDTO { //入参 private String year; - //出参,key:事件类型,value:周和月数据平均值 - private Map map; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/GateStatusGroupResponse.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/GateStatusGroupResponse.java new file mode 100644 index 0000000..d16f4e5 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/GateStatusGroupResponse.java @@ -0,0 +1,16 @@ +package com.casic.missiles.modular.dto.statistics; + +import lombok.Data; + +/** + * @Description: 闸机/摄像机统计响应实体 + * @Author: wangpeng + * @Date: 2022/8/30 14:22 + */ +@Data +public class GateStatusGroupResponse { + //设备状态 + private String status; + //占比 + private String ratio; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/MonthAndWeekDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/MonthAndWeekDTO.java index 7482b2a..284115a 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/MonthAndWeekDTO.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/MonthAndWeekDTO.java @@ -9,7 +9,7 @@ */ @Data public class MonthAndWeekDTO { -// private String levelName; + private String levelName; private Integer monthQuantity; private Integer weekQuantity; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/OnDutyRatioDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/OnDutyRatioDTO.java new file mode 100644 index 0000000..4f6a65d --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/OnDutyRatioDTO.java @@ -0,0 +1,15 @@ +package com.casic.missiles.modular.dto.statistics; + +import lombok.Data; + +/** + * @Description: 在岗率统计实体 + * @Author: wangpeng + * @Date: 2022/9/2 21:24 + */ +@Data +public class OnDutyRatioDTO { + private String date; + private String quantity; + private String ratio; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/SecurityLevelAssessDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/SecurityLevelAssessDTO.java new file mode 100644 index 0000000..40a0738 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/SecurityLevelAssessDTO.java @@ -0,0 +1,15 @@ +package com.casic.missiles.modular.dto.statistics; + +import lombok.Data; + +/** + * @Description: 出勤人数统计实体 + * @Author: wangpeng + * @Date: 2022/8/31 19:24 + */ +@Data +public class SecurityLevelAssessDTO { + private String date; + private String quantity; + private Double score; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/SecurityScoreDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/SecurityScoreDTO.java index 304d169..f7bd4a2 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/SecurityScoreDTO.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/SecurityScoreDTO.java @@ -14,5 +14,5 @@ //楼层,出参 private String area; //评分,出参 - private String score; + private Double score; } 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 6a30786..e5e613d 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 @@ -8,6 +8,10 @@ public interface HikUri { //事件订阅 String EVENT_SUBSCRIBE = "/api/eventService/v1/eventSubscriptionByEventTypes"; + //事件订阅信息查询 + String EVENT_INFO = "/api/eventService/v1/eventSubscriptionView"; + //事件订阅取消 + String EVENT_CANCEL = "/api/eventService/v1/eventUnSubscriptionByEventTypes"; //预约免登记 String APPOINTMENT_FREE_REGISTER = "/api/visitor/v1/appointment/registration"; //修改访客预约 @@ -32,8 +36,18 @@ String PERSON_SINGLE_UPDATE = "/api/resource/v1/person/single/update"; //批量删除人员 String PERSON_BATCH_DELETE = "/api/resource/v1/person/batch/delete"; + //根据人脸Id删除人脸 + String PERSON_SINGLE_DELETE = "/api/resource/v1/face/single/delete"; //门禁点反控 String DOOR_CONTROL = "/api/acs/v1/door/doControl"; //查询海康门禁点事件v2 String DOOR_EVENTS = "/api/acs/v2/door/events"; + //批量开卡 + String CARD_BINDING = "/api/cis/v1/card/binding"; + //提取人员照片 + String PERSON_PICTURE = "/api/resource/v1/person/picture"; + //根据人员唯一字段获取人员详细信息 + String PERSON_INFO = "/api/resource/v1/person/condition/personInfo"; + //以图搜图 + String SEARCH_PICTURES = "/api/frs/v1/application/captureSearch"; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/enums/SecurityEventType.java b/casic-server/src/main/java/com/casic/missiles/modular/enums/SecurityEventType.java index d51034c..42eacf8 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/enums/SecurityEventType.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/enums/SecurityEventType.java @@ -14,18 +14,27 @@ Number PERSONNEL_GATHER_EVENT = 131593; //监控点离线事件 Number MONITORING_POINT_OFFLINE = 889196545; + //监控点上线事件 + Number MONITORING_POINT_ONLINE = 889196546; //装置离线 Number DEVICE_OFFLINE = 199710; + //装置连线 + Number DEVICE_ONLINE = 199711; //访客登记 Number VISITOR_REGISTER = 1392513025; //访客签离 Number VISITOR_CHECKOUT = 1392513026; + //高空抛物 + Number HIGH_ALTITUDE_PARABOLIC = 930335; + //下面两个查询海康门禁点事件使用 //合法卡比对通过 Number CARD_COMPARE_PASS = 198914; //人脸认证通过 Number FACE_COMPARE_PASS = 196893; + + // //正常开门 // Number NORMAL_OPENING = 198913; // //按钮开门 @@ -46,7 +55,6 @@ // Number FIREWORKS_DETECTION = 192514; // //陌生人识别事件 // Number STRANGER_RECOGNITION = 1644171265; -// //高空抛物 -// Number HIGH_ALTITUDE_PARABOLIC = 930335; + } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/job/CockpitJob.java b/casic-server/src/main/java/com/casic/missiles/modular/job/CockpitJob.java index 7490a27..85dd016 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/job/CockpitJob.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/job/CockpitJob.java @@ -79,14 +79,6 @@ } }); } - } - /** - * 机动力量实时在岗率,在岗人数除以总应在岗人数,功能待定 - */ -// @Scheduled(cron = "0 0/1 * * * ?") - public void BeOnDutyRatio() { - - } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/service/HikCaseDefineService.java b/casic-server/src/main/java/com/casic/missiles/modular/service/HikCaseDefineService.java index d9bb3a9..18e2936 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/service/HikCaseDefineService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/service/HikCaseDefineService.java @@ -9,5 +9,5 @@ * @Date: 2022/7/21 17:20 */ public interface HikCaseDefineService extends IService { - HikCaseDefine getHikCaseDefine(Long caseTypeCode); + HikCaseDefine getHikCaseDefine(Number caseTypeCode); } 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 dd24101..bcc3b5d 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 @@ -18,6 +18,8 @@ CaseInfo monitorPointOfflineHandle(JSONObject event, CaseInfo caseInfo); + void monitorPointOnlineHandle(JSONObject event); + CaseInfo deviceOfflineHandle(JSONObject event, CaseInfo caseInfo); void propertyAttendanceHandle(JSONObject event); @@ -27,4 +29,6 @@ void visitorRegisterHandler(JSONObject event); void visitorCheckOutHandler(JSONObject event); + + void deviceOnlineHandle(JSONObject event); } 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 e55c016..01870bd 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.StaffCardRequest; import com.casic.missiles.modular.model.StaffInfo; import java.util.List; @@ -28,4 +29,6 @@ StaffInfo selectStaffInfoByCode(StaffInfo staffInfo); List staffInfoList(StaffInfoRequest staffInfoRequest); + + int saveCardInfo(StaffCardRequest staffCardRequest); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/service/impl/BlackInfoServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/service/impl/BlackInfoServiceImpl.java index 8f47b37..981b4cd 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/service/impl/BlackInfoServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/service/impl/BlackInfoServiceImpl.java @@ -17,7 +17,6 @@ import com.casic.missiles.modular.model.BlackInfo; import com.casic.missiles.modular.model.HikFaceGroupInfo; import com.casic.missiles.modular.service.BlackInfoService; -import com.casic.missiles.modular.system.service.ICasicFileService; import com.casic.missiles.modular.util.HikUtil; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; @@ -43,9 +42,6 @@ private HikFaceGroupInfoMapper hikFaceGroupInfoMapper; @Resource - private ICasicFileService fileService; - - @Resource private AbstractDictService dictService; @Override @@ -90,9 +86,6 @@ //设置海康人脸唯一标识、人脸分组唯一标识 blackInfo.setIndexCode(String.valueOf(dataJson.get("indexCode"))); blackInfo.setFaceGroupIndexCode(String.valueOf(dataJson.get("faceGroupIndexCode"))); - //保存图片到本地 - String picUrl = fileService.saveFile(blackInfo.getPicture()); - blackInfo.setPicture(picUrl); //插入数据库 if(blackInfoMapper.insert(blackInfo) > 0){ return ResponseData.success(); @@ -141,8 +134,6 @@ log.error("请求海康,单个修改人脸失败,海康response:{}", resultStr); return ResponseData.error("单个修改人脸失败"); } - String picUrl = fileService.saveFile(blackInfo.getPicture()); - blackInfo.setPicture(picUrl); if(blackInfoMapper.updateById(blackInfo) > 0){ return ResponseData.success(); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/service/impl/CockpitServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/service/impl/CockpitServiceImpl.java index 6e6076e..7402991 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/service/impl/CockpitServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/service/impl/CockpitServiceImpl.java @@ -4,15 +4,12 @@ import cn.hutool.core.date.DateUtil; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.core.application.service.AbstractDictService; import com.casic.missiles.modular.dto.hik.DoorEventsRequest; import com.casic.missiles.modular.enums.HikUri; -import com.casic.missiles.modular.enums.SecurityEventDict; import com.casic.missiles.modular.enums.SecurityEventType; import com.casic.missiles.modular.service.CockpitService; import com.casic.missiles.modular.util.HikUtil; import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.*; @@ -25,8 +22,6 @@ @Slf4j @Service public class CockpitServiceImpl implements CockpitService { - @Autowired - private AbstractDictService dictService; @Override public HashMap dataHandle(DoorEventsRequest doorEventsRequest, HashMap> configMap, HashMap jsonMap, HashMap resultMap) { @@ -36,8 +31,8 @@ Date date = new Date(); DateTime startTimeDate = DateUtil.beginOfDay(date); DateTime endTimeDate = DateUtil.endOfDay(date); - String startTime = DateUtil.format(startTimeDate, "yyyy-MM-dd'T'HH:mm:ss'Z'"); - String endTime = DateUtil.format(endTimeDate, "yyyy-MM-dd'T'HH:mm:ss'Z'"); + String startTime = DateUtil.format(startTimeDate, "yyyy-MM-dd'T'HH:mm:ssXXX"); + String endTime = DateUtil.format(endTimeDate, "yyyy-MM-dd'T'HH:mm:ssXXX"); configMap.keySet().stream().forEach(key -> { List doorIndexCodes = configMap.get(key); doorEventsRequest.setPageNo(1); @@ -95,8 +90,9 @@ return; } Integer num = 0; - while (list.stream().iterator().hasNext()) { - JSONObject next = (JSONObject) list.stream().iterator().next(); + Iterator iterator = list.stream().iterator(); + while (iterator.hasNext()) { + JSONObject next = (JSONObject) iterator.next(); Integer inAndOutType = next.getInteger("inAndOutType"); //进门 if (1 == inAndOutType) { @@ -105,8 +101,8 @@ --num; } } - String dictName = dictService.getDictNameByCode(SecurityEventDict.DEVICE_POSITION, String.valueOf(key)); - resultMap.put(dictName, num); +// String dictName = dictService.getDictNameByCode(SecurityEventDict.DEVICE_POSITION, String.valueOf(key)); + resultMap.put(String.valueOf(key), num); }); return resultMap; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/service/impl/HikCaseDefineServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/service/impl/HikCaseDefineServiceImpl.java index 98ab2a4..1a59c7e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/service/impl/HikCaseDefineServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/service/impl/HikCaseDefineServiceImpl.java @@ -16,7 +16,7 @@ private HikCaseDefineMapper hikCaseDefineMapper; @Override - public HikCaseDefine getHikCaseDefine(Long caseTypeCode) { + public HikCaseDefine getHikCaseDefine(Number caseTypeCode) { return hikCaseDefineMapper.getHikCaseDefine(caseTypeCode); } } 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 b47f78f..dbad48f 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 @@ -58,10 +58,16 @@ 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.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; } @@ -76,10 +82,16 @@ 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.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; } @@ -94,10 +106,16 @@ 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.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; } @@ -109,24 +127,44 @@ 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()); //事件状态(未解决的字典值) + // TODO: 2022/7/28 事件状态字典值选择 + caseInfo.setStatus(dict.get(0).getCode()); //事件状态("未解决"的字典值) DeviceInfo deviceInfo = deviceInfoMapper.getByIndexCode(srcIndex); + if(Objects.isNull(deviceInfo)){ + log.info("接收到监控点离线事件,但数据库中无该事件发生的设备信息"); + return caseInfo; + } 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()); //更新设备状态 // TODO: 2022/7/28 设备离线字典值选择 -// deviceInfo.setStatus(); + List deviceDict = dictService.findInDictByCode(SecurityEventDict.DEVICE_STATUS); + deviceInfo.setStatus(deviceDict.get(1).getCode()); if(deviceInfoMapper.updateById(deviceInfo) <= 0){ + log.error("海康回调,更新监控点离线线状态失败!"); return null; } return caseInfo; } @Override + public void monitorPointOnlineHandle(JSONObject event) { + String srcIndex = event.getString("srcIndex"); + DeviceInfo deviceInfo = deviceInfoMapper.getByIndexCode(srcIndex); + // TODO: 2022/7/28 设备在线字典值选择 + List deviceDict = dictService.findInDictByCode(SecurityEventDict.DEVICE_STATUS); + deviceInfo.setStatus(deviceDict.get(0).getCode()); + if(deviceInfoMapper.updateById(deviceInfo) <= 0){ + log.error("海康回调,更新监控点在线状态失败!"); + } + } + + @Override public CaseInfo deviceOfflineHandle(JSONObject event, CaseInfo caseInfo) { //加入到安防事件 String srcIndex = event.getString("srcIndex"); //海康资源唯一标识 @@ -138,19 +176,40 @@ 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.setDeviceCode(deviceInfo.getDevCode()); //设备code caseInfo.setDevName(deviceInfo.getDevName()); //设备名 caseInfo.setPosition(deviceInfo.getPosition()); //事件位置 caseInfo.setArea(deviceInfo.getArea()); //区域 + caseInfo.setIsKeyArea(deviceInfo.getIsKeyArea()); + caseInfo.setDetailLocation(deviceInfo.getDetailLocation()); //更新设备状态 // TODO: 2022/7/28 设备离线字典值选择 -// deviceInfo.setStatus(); + List deviceDict = dictService.findInDictByCode(SecurityEventDict.DEVICE_STATUS); + deviceInfo.setStatus(deviceDict.get(1).getCode()); if(deviceInfoMapper.updateById(deviceInfo) <= 0){ + log.error("海康回调,更新设备离线状态失败!"); return null; } return caseInfo; } + + @Override + public void deviceOnlineHandle(JSONObject event) { + String srcIndex = event.getString("srcIndex"); + DeviceInfo deviceInfo = deviceInfoMapper.getByIndexCode(srcIndex); + // TODO: 2022/7/28 设备在线字典值选择 + List deviceDict = dictService.findInDictByCode(SecurityEventDict.DEVICE_STATUS); + deviceInfo.setStatus(deviceDict.get(0).getCode()); + if(deviceInfoMapper.updateById(deviceInfo) <= 0){ + log.error("海康回调,更新门禁点装置在线状态失败!"); + } + } + @Override public void propertyAttendanceHandle(JSONObject event) { String srcIndex = event.getString("srcIndex"); @@ -182,8 +241,9 @@ info.setStaffName(staffInfo.getStaffName()); info.setStaffGender(staffInfo.getStaffGender()); // TODO: 2022/7/29 物业人员字典值选择 -// info.setStaffType(); -// info.setStaffTypeName(); + List staffDict = dictService.findInDictByCode(SecurityEventDict.STAFF_TYPE); + info.setStaffType(staffDict.get(0).getCode()); + info.setStaffTypeName(staffDict.get(0).getName()); info.setAtteDate(DateUtil.today()); info.setAtteStartTime(happenTime); info.setAtteStartDev(deviceInfo.getDevCode()); @@ -226,8 +286,9 @@ info.setStaffName(staffInfo.getStaffName()); info.setStaffGender(staffInfo.getStaffGender()); // TODO: 2022/7/29 安保人员字典值选择 -// info.setStaffType(); -// info.setStaffTypeName(); + List staffDict = dictService.findInDictByCode(SecurityEventDict.STAFF_TYPE); + info.setStaffType(staffDict.get(1).getCode()); + info.setStaffTypeName(staffDict.get(1).getName()); info.setAtteDate(DateUtil.today()); info.setAtteStartTime(happenTime); info.setAtteStartDev(deviceInfo.getDevCode()); @@ -259,8 +320,12 @@ visitInfo.setVisitReason(data.getString("purpose")); visitInfo.setPicUri(data.getString("captureUrl")); visitInfo.setServerIndexCode(data.getString("svrIndexCode")); - visitInfo.setVisitPosition(deviceInfo.getPosition()); - + visitInfo.setOrderId(data.getString("visitorId")); + if(!Objects.isNull(deviceInfo)){ + visitInfo.setVisitPosition(deviceInfo.getPosition()); + } else{ + log.info("识别访客的门禁不在数据库中"); + } if(visitInfoMapper.insert(visitInfo) <= 0){ log.error("新增访客记录异常"); } 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 b416f5c..d19dceb 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 @@ -10,12 +10,12 @@ import com.casic.missiles.modular.dto.StaffInfoRequest; import com.casic.missiles.modular.dto.hik.PersonBatchDeleteRequest; import com.casic.missiles.modular.dto.hik.PersonSingleAddOrUpdateRequest; +import com.casic.missiles.modular.dto.hik.StaffCardRequest; import com.casic.missiles.modular.enums.HikUri; import com.casic.missiles.modular.enums.SecurityEventDict; import com.casic.missiles.modular.model.DeviceInfo; import com.casic.missiles.modular.model.StaffInfo; import com.casic.missiles.modular.service.StaffInfoService; -import com.casic.missiles.modular.system.service.ICasicFileService; import com.casic.missiles.modular.util.Base64Util; import com.casic.missiles.modular.util.HikUtil; import lombok.extern.slf4j.Slf4j; @@ -51,9 +51,6 @@ @Resource private Validator validator; - @Resource - private ICasicFileService fileService; - @Value("${casic.file.uploadPath}") private String uploadPath; @@ -80,8 +77,6 @@ if(!Objects.isNull(staff)){ return ResponseData.error("数据已存在"); } - String picUrl = fileService.saveFile(staffInfo.getPicture()); - staffInfo.setPicture(picUrl); //添加人员到海康 PersonSingleAddOrUpdateRequest personSingleAddOrUpdateRequest = new PersonSingleAddOrUpdateRequest(); @@ -117,9 +112,6 @@ @Override @Transactional(rollbackFor = Exception.class) public Object updateStaffInfo(StaffInfo staffInfo) { - String picUrl = fileService.saveFile(staffInfo.getPicture()); - staffInfo.setPicture(picUrl); - //修改人员到海康 PersonSingleAddOrUpdateRequest personSingleAddOrUpdateRequest = new PersonSingleAddOrUpdateRequest(); personSingleAddOrUpdateRequest.setPersonId(staffInfo.getStaffCode()); @@ -162,7 +154,13 @@ String body = JSONObject.toJSONString(personBatchDeleteRequest); String resultStr = HikUtil.hikApi(HikUri.PERSON_BATCH_DELETE, body); JSONObject resultJson = (JSONObject)JSONObject.parse(resultStr); - if (!"0".equals(resultJson.get("code"))) { + //人脸要单独删除 + PersonBatchDeleteRequest personBatchDeleteRequest2 = new PersonBatchDeleteRequest(); + personBatchDeleteRequest2.setFaceId(staffInfo.getStaffFaceId()); + String body2 = JSONObject.toJSONString(personBatchDeleteRequest2); + String resultStr2 = HikUtil.hikApi(HikUri.PERSON_SINGLE_DELETE, body2); + JSONObject resultJson2 = (JSONObject)JSONObject.parse(resultStr2); + if (!"0".equals(resultJson.get("code")) && !"0".equals(resultJson2.get("code")) ) { log.error("请求海康,单个删除人员失败,海康response:{}", resultStr); return ResponseData.error("单个删除人员失败"); } @@ -269,4 +267,21 @@ } return null; } + + @Override + @Transactional(rollbackFor = Exception.class) + public int saveCardInfo(StaffCardRequest staffCardRequest) { + List numFlag = new ArrayList<>(); + staffCardRequest.getCardList().forEach(cardInfo -> { + String staffCode = cardInfo.getPersonId(); + String cardNo = cardInfo.getCardNo(); + if(staffInfoMapper.updateByCodeForCard(staffCode, cardNo) > 0){ + numFlag.add(cardNo); + } + }); + if(staffCardRequest.getCardList().size() != numFlag.size()){ + return 0; + } + return 1; + } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/service/impl/VisitorApplyServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/service/impl/VisitorApplyServiceImpl.java index 497003a..b219984 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/service/impl/VisitorApplyServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/service/impl/VisitorApplyServiceImpl.java @@ -74,9 +74,9 @@ AppointmentFreeRegisterRequest appointmentFreeRegisterRequest = new AppointmentFreeRegisterRequest(); //将时间转换为海康ISO8601格式 DateTime inTimeDate = DateUtil.parse(visitorApply.getInTime()); - String inTimeISODate = DateUtil.format(inTimeDate, "yyyy-MM-dd'T'HH:mm:ss'Z'"); + String inTimeISODate = DateUtil.format(inTimeDate, "yyyy-MM-dd'T'HH:mm:ssXXX"); DateTime outTimeDate = DateUtil.parse(visitorApply.getOutTime()); - String outTimeISODate = DateUtil.format(outTimeDate, "yyyy-MM-dd'T'HH:mm:ss'Z'"); + String outTimeISODate = DateUtil.format(outTimeDate, "yyyy-MM-dd'T'HH:mm:ssXXX"); //海康员工唯一标识receptionistId就是我们录入的到海康的员工号 appointmentFreeRegisterRequest.setReceptionistId(visitorApply.getStaffCode()); appointmentFreeRegisterRequest.setPersonNum(1); @@ -86,7 +86,7 @@ VisitorInfo visitorInfo = new VisitorInfo(); visitorInfo.setVisitorName(visitorApply.getVisitorName()); - visitorInfo.setGender(visitorApply.getVisitorGender()); + visitorInfo.setGender(Integer.valueOf(visitorApply.getVisitorGender())); visitorInfo.setPhoneNo(visitorApply.getVisitorPhone()); visitorInfo.setCertificateNo(visitorApply.getIdCard()); visitorInfo.setCertificateType(111); @@ -121,15 +121,15 @@ appointmentFreeRegisterRequest.setAppointRecordId(visitorApply1.getAppointRecordId()); appointmentFreeRegisterRequest.setReceptionistId(visitorApply1.getStaffCode()); DateTime inTimeDate = DateUtil.parse(visitorApply.getInTime()); - String inTimeISODate = DateUtil.format(inTimeDate, "yyyy-MM-dd'T'HH:mm:ss'Z'"); + String inTimeISODate = DateUtil.format(inTimeDate, "yyyy-MM-dd'T'HH:mm:ssXXX"); DateTime outTimeDate = DateUtil.parse(visitorApply.getOutTime()); - String outTimeISODate = DateUtil.format(outTimeDate, "yyyy-MM-dd'T'HH:mm:ss'Z'"); + String outTimeISODate = DateUtil.format(outTimeDate, "yyyy-MM-dd'T'HH:mm:ssXXX"); appointmentFreeRegisterRequest.setVisitStartTime(inTimeISODate); appointmentFreeRegisterRequest.setVisitEndTime(outTimeISODate); appointmentFreeRegisterRequest.setVisitPurpose(visitorApply.getVisitReason()); VisitorInfo visitorInfo = new VisitorInfo(); visitorInfo.setVisitorName(visitorApply.getVisitorName()); - visitorInfo.setGender(visitorApply.getVisitorGender()); + visitorInfo.setGender(Integer.valueOf(visitorApply.getVisitorGender())); visitorInfo.setPhoneNo(visitorApply.getVisitorPhone()); visitorInfo.setCertificateNo(visitorApply.getIdCard()); visitorInfo.setCertificateType(111); @@ -236,9 +236,9 @@ } } DateTime inTimeDate = DateUtil.parse(busConcentrator.getInTime()); - String inTimeISODate = DateUtil.format(inTimeDate, "yyyy-MM-dd'T'HH:mm:ss'Z'"); + String inTimeISODate = DateUtil.format(inTimeDate, "yyyy-MM-dd'T'HH:mm:ssXXX"); DateTime outTimeDate = DateUtil.parse(busConcentrator.getOutTime()); - String outTimeISODate = DateUtil.format(outTimeDate, "yyyy-MM-dd'T'HH:mm:ss'Z'"); + String outTimeISODate = DateUtil.format(outTimeDate, "yyyy-MM-dd'T'HH:mm:ssXXX"); AppointmentFreeRegisterRequest appointmentFreeRegisterRequest = new AppointmentFreeRegisterRequest(); appointmentFreeRegisterRequest.setReceptionistId(busConcentrator.getStaffCode()); appointmentFreeRegisterRequest.setPersonNum(1); @@ -247,7 +247,7 @@ appointmentFreeRegisterRequest.setVisitPurpose(busConcentrator.getVisitReason()); VisitorInfo visitorInfo = new VisitorInfo(); visitorInfo.setVisitorName(busConcentrator.getVisitorName()); - visitorInfo.setGender(busConcentrator.getVisitorGender()); + visitorInfo.setGender(Integer.valueOf(busConcentrator.getVisitorGender())); visitorInfo.setPhoneNo(busConcentrator.getVisitorPhone()); visitorInfo.setCertificateNo(busConcentrator.getIdCard()); visitorInfo.setCertificateType(111); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/util/ArtemisFor302Util.java b/casic-server/src/main/java/com/casic/missiles/modular/util/ArtemisFor302Util.java new file mode 100644 index 0000000..4edb075 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/util/ArtemisFor302Util.java @@ -0,0 +1,65 @@ +package com.casic.missiles.modular.util; + +import com.hikvision.artemis.sdk.Client; +import com.hikvision.artemis.sdk.Request; +import com.hikvision.artemis.sdk.Response; +import com.hikvision.artemis.sdk.config.ArtemisConfig; +import com.hikvision.artemis.sdk.constant.Constants; +import com.hikvision.artemis.sdk.enums.Method; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.apache.http.HttpHeaders; + +import java.util.HashMap; +import java.util.Map; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/29 20:25 + */ +@Slf4j +public class ArtemisFor302Util { + + public static String doPostStringArtemis(Map path, String body, Map querys, String accept, String contentType, Map header) { + String httpSchema = (String)path.keySet().toArray()[0]; + if (httpSchema != null && !StringUtils.isEmpty(httpSchema)) { + String responseStr = null; + + try { + Map headers = new HashMap(); + if (StringUtils.isNotBlank(accept)) { + headers.put("Accept", accept); + } else { + headers.put("Accept", "*/*"); + } + + if (StringUtils.isNotBlank(contentType)) { + headers.put("Content-Type", contentType); + } else { + headers.put("Content-Type", "application/text;charset=UTF-8"); + } + + if (header != null) { + headers.putAll(header); + } + + Request request = new Request(Method.POST_STRING, httpSchema + ArtemisConfig.host, (String)path.get(httpSchema), ArtemisConfig.appKey, ArtemisConfig.appSecret, Constants.DEFAULT_TIMEOUT); + request.setHeaders(headers); + request.setQuerys(querys); + request.setStringBody(body); + Response response = Client.execute(request); + int statusCode = response.getStatusCode(); + if(statusCode == 302){ + return response.getHeader((HttpHeaders.LOCATION)); + } + + } catch (Exception var11) { + log.error("the Artemis PostString Request is failed, exception:{}", var11.getMessage()); + } + return responseStr; + } else { + throw new RuntimeException("http和https参数错误httpSchema: " + httpSchema); + } + } +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/BlackListController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/BlackListController.java index a27f9f8..0c06661 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/BlackListController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/BlackListController.java @@ -1,13 +1,18 @@ package com.casic.missiles.modular.controller; +import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.base.controller.ExportController; import com.casic.missiles.core.page.PageFactory; import com.casic.missiles.model.response.ResponseData; import com.casic.missiles.modular.dto.BlackInfoRequest; +import com.casic.missiles.modular.dto.BlackPictureRequest; +import com.casic.missiles.modular.dto.hik.PersonInfoRequest; +import com.casic.missiles.modular.enums.HikUri; import com.casic.missiles.modular.enums.OperateTypeEnum; import com.casic.missiles.modular.model.BlackInfo; import com.casic.missiles.modular.service.BlackInfoService; +import com.casic.missiles.modular.util.HikUtil; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; @@ -56,4 +61,22 @@ return null; } + /** + * 黑名单人员照片 + */ + @PostMapping("/personPicture") + @ResponseBody + public Object personPicture(@RequestBody BlackPictureRequest blackPictureRequest){ + //获取照片 + String picUri = blackPictureRequest.getPicUri(); + String serverIndexCode = blackPictureRequest.getServerIndexCode(); + PersonInfoRequest picRequest = new PersonInfoRequest(); + picRequest.setPicUri(picUri); + picRequest.setServerIndexCode(serverIndexCode); + String reBody = JSONObject.toJSONString(picRequest); + //重定向地址获取 + String url = HikUtil.hikApiFor302(HikUri.PERSON_PICTURE, reBody); + return ResponseData.success(url); + } + } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/DeviceController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/DeviceController.java index e1c4eba..666bbee 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/DeviceController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/DeviceController.java @@ -107,7 +107,7 @@ } /** - * 设备维修管理查询(分页),需计算MTTR=总维修时间/故障次数 + * 设备状态计算与评判/设备维修管理查询(分页),需计算MTTR=总维修时间/故障次数 */ @PostMapping("/repair/listPage") @ResponseBody @@ -211,7 +211,7 @@ //需根据设备编号获取到对应的门禁点唯一标识 doorControlRequest.setDoorIndexCodes(indexCodes); doorControlRequest.setControlType(Integer.valueOf(gateGroupDTO.getStatus())); - String body = JSONObject.toJSONString(deviceCodes); + String body = JSONObject.toJSONString(doorControlRequest); String resultStr = HikUtil.hikApi(HikUri.DOOR_CONTROL, body); JSONObject resultJson = (JSONObject)JSONObject.parse(resultStr); if (!"0".equals(resultJson.get("code"))) { diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/StaffController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/StaffController.java index b58ccab..704093c 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/StaffController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/StaffController.java @@ -2,15 +2,21 @@ import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.util.StrUtil; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.base.controller.ExportController; import com.casic.missiles.core.page.PageFactory; import com.casic.missiles.model.response.ErrorResponseData; import com.casic.missiles.model.response.ResponseData; import com.casic.missiles.modular.dto.StaffInfoRequest; +import com.casic.missiles.modular.dto.hik.PersonInfoRequest; +import com.casic.missiles.modular.dto.hik.StaffCardRequest; +import com.casic.missiles.modular.enums.HikUri; import com.casic.missiles.modular.enums.OperateTypeEnum; import com.casic.missiles.modular.model.StaffInfo; import com.casic.missiles.modular.service.StaffInfoService; +import com.casic.missiles.modular.util.HikUtil; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; @@ -110,4 +116,60 @@ } return ResponseData.success(); } + + /** + * 批量开卡,添加人员之后调用,若在一个接口中添加人员成功开卡失败则第二次添加时会有问题 + */ + @PostMapping("/cardBinding") + @ResponseBody + public Object cardBinding(@RequestBody StaffCardRequest staffCardRequest) { + String body = JSONObject.toJSONString(staffCardRequest); + String resultStr = HikUtil.hikApi(HikUri.CARD_BINDING, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (!"0".equals(resultJson.get("code"))) { + log.error("请求海康,批量开卡失败,海康response:{}", resultStr); + return ResponseData.error("批量开卡失败"); + } + //保存卡号 + if(staffInfoService.saveCardInfo(staffCardRequest) > 0){ + return ResponseData.success(); + } + return ResponseData.error("批量开卡失败"); + } + + /** + * 获取员工照片,海康存储 + */ + @PostMapping("/personPicture/{staffCode}") + @ResponseBody + public Object personPicture(@PathVariable("staffCode") String staffCode){ + //获取员工详细信息,含图片服务器、uri + PersonInfoRequest request = new PersonInfoRequest(); + List list = new ArrayList<>(); + list.add(staffCode); + request.setParamName("personId"); + request.setParamValue(list); + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi(HikUri.PERSON_INFO, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (!"0".equals(resultJson.get("code"))) { + log.error("请求海康,根据人员唯一字段获取人员详细信息失败,海康response:{}", resultStr); + return ResponseData.error("获取员工照片失败"); + } + //获取照片 + JSONObject data = (JSONObject) resultJson.get("data"); + JSONArray dataArray = (JSONArray) data.get("list"); + JSONObject jsonObject = (JSONObject) dataArray.get(0); + JSONArray personPhoto = (JSONArray) jsonObject.get("personPhoto"); + JSONObject photo = (JSONObject) personPhoto.get(0); + String picUri = photo.getString("picUri"); + String serverIndexCode = photo.getString("serverIndexCode"); + PersonInfoRequest picRequest = new PersonInfoRequest(); + picRequest.setPicUri(picUri); + picRequest.setServerIndexCode(serverIndexCode); + String reBody = JSONObject.toJSONString(picRequest); + //重定向地址获取 + String url = HikUtil.hikApiFor302(HikUri.PERSON_PICTURE, reBody); + return ResponseData.success(url); + } } 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 4a07dd9..7b1dcf6 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 @@ -16,6 +16,7 @@ import com.casic.missiles.modular.redis.key.CacheKeys; import com.casic.missiles.modular.service.CockpitService; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.util.CollectionUtils; import org.springframework.web.bind.annotation.*; @@ -24,10 +25,7 @@ import java.text.NumberFormat; import java.time.LocalDateTime; import java.time.temporal.ChronoUnit; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.util.*; import java.util.stream.Collectors; /** @@ -73,6 +71,9 @@ private StatisticNumberMapper numberMapper; @Autowired + private HazardLevelMapper hazardLevelMapper; + + @Autowired private AccessGroupConfig accessGroupConfig; /** @@ -104,8 +105,24 @@ public Object buildingNumberPerHour(){ //当天按小时分组的人数 List list = numberMapper.selectListByTime(); - Map> collect = list.stream().collect(Collectors.groupingBy(BuildingNumberDTO::getStatisticPosition)); - return ResponseData.success(collect); + Map> collect = list.stream().collect(Collectors.groupingBy(BuildingNumberDTO::getStatisticTime)); + //定时任务中已将每小时三栋楼人数存到数据库 + //将一期主楼和录制楼人数合并,二期单算 + List> resultList = new ArrayList<>(); + collect.keySet().forEach(key -> { + List buildingNumberDTOS = collect.get(key); + BuildingNumberDTO mainBuildingOne = buildingNumberDTOS.get(0); + BuildingNumberDTO mainBuildingTwo = buildingNumberDTOS.get(1); + BuildingNumberDTO recordingBuilding = buildingNumberDTOS.get(2); + HashMap resultMap = new HashMap<>(); + Integer oneQuantity = Integer.valueOf(mainBuildingOne.getStatisticQuantity()); + Integer recordingQuantity = Integer.valueOf(recordingBuilding.getStatisticQuantity()); + resultMap.put("staticTime", mainBuildingOne.getStatisticTime()); + resultMap.put(mainBuildingOne.getStatisticPositionName()+"、"+recordingBuilding.getStatisticPositionName(), String.valueOf(oneQuantity+recordingQuantity)); + resultMap.put(mainBuildingTwo.getStatisticPositionName(), mainBuildingTwo.getStatisticQuantity()); + resultList.add(resultMap); + }); + return ResponseData.success(resultList); } /** @@ -151,12 +168,11 @@ public Object securityNumber() { QueryWrapper wrapper = new QueryWrapper<>(); wrapper.eq("staff_type", 2); + // TODO: 2022/9/2 后续使用产品确定的每天出勤的安保人员的数量 Integer total = staffInfoMapper.selectCount(wrapper); - //当日离岗事件个数 - QueryWrapper wrapper1 = new QueryWrapper<>(); - wrapper1.eq("hik_event_type", SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); - wrapper1.apply("date_format(now(),'%Y-%m-%d') = date_format(happen_time,'%Y-%m-%d')"); - Integer leave = caseInfoMapper.selectCount(wrapper1); + //当日离岗事件按设备去重后的个数 + // TODO: 2022/9/2 目前相当于24小时内的计算,之后看需要可改成自定义小时数计算离岗率,即离岗+6小时内仅一次离岗则恢复为100%,多次则累加离岗次数计算离岗率 + Integer leave = caseInfoMapper.selectDemobilizedCount(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); NumberFormat numberFormat = NumberFormat.getInstance(); // 设置精确到小数点后2位 numberFormat.setMaximumFractionDigits(2); @@ -179,7 +195,6 @@ @ResponseBody public Object visitorApplyDetail() { List reasonGroup = applyMapper.selectByVisitReason(); - HashMap resultMap = new HashMap<>(); NumberFormat numberFormat = NumberFormat.getInstance(); // 设置精确到小数点后2位 numberFormat.setMaximumFractionDigits(2); @@ -187,12 +202,17 @@ if(0 == sum){ return ResponseData.success(); } + List resultList = new ArrayList<>(); reasonGroup.forEach(group -> { String reasonName = dictService.getDictNameByCode(SecurityEventDict.VISIT_REASON, group.getVisitReason()); String result = numberFormat.format((float) group.getQuantity() / (float) sum * 100); - resultMap.put(reasonName, result+"%"); + ApplyReasonGroupDTO applyReasonGroupDTO = new ApplyReasonGroupDTO(); + applyReasonGroupDTO.setQuantity(group.getQuantity()); + applyReasonGroupDTO.setVisitReason(reasonName); + applyReasonGroupDTO.setRatio(result+"%"); + resultList.add(applyReasonGroupDTO); }); - return ResponseData.success(resultMap); + return ResponseData.success(resultList); } /** @@ -247,6 +267,32 @@ } /** + * 机动力量实时在岗率,在岗人数除以总应在岗人数,用离岗+6小时内恢复为100%,6小时外再计算 + */ + @GetMapping("/staff/beOnDutyRatio") + @ResponseBody + public Object beOnDutyRatio() { + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("staff_type", 2); + // TODO: 2022/9/2 后续使用产品确定的每天出勤的安保人员的数量 + Integer total = staffInfoMapper.selectCount(wrapper); + if(0 == total){ + return ResponseData.success(null); + } + //当日离岗事件按设备去重后的个数 + // TODO: 2022/9/2 目前相当于24小时内的计算,之后看需要可改成自定义小时数计算离岗率,即离岗+6小时内仅一次离岗则恢复为100%,多次则累加离岗次数计算离岗率 + List onDutyRatioDTOS = caseInfoMapper.selectDemobilizedCountByHour(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); + onDutyRatioDTOS.forEach(dto -> { + NumberFormat numberFormat = NumberFormat.getInstance(); + // 设置精确到小数点后2位 + numberFormat.setMaximumFractionDigits(2); + String result = numberFormat.format(100 - Float.valueOf(dto.getQuantity()) / (float) total * 100); + dto.setRatio(result+"%"); + }); + return ResponseData.success(onDutyRatioDTOS); + } + + /** * 闸机速通门统计-设备状态分组计算数量,devType传闸机字典key * 视频频监控摄像机统计-设备状态分组计算数量,devType传摄像头字典key */ @@ -262,12 +308,17 @@ if(sum <= 0){ return ResponseData.error("无该类设备信息"); } + List resultList = new ArrayList<>(); gateStatusGroup.forEach(group -> { String devStatus = dictService.getDictNameByCode(SecurityEventDict.DEVICE_STATUS, group.getStatus()); String result = numberFormat.format((float) group.getQuantity() / (float) sum * 100); - resultMap.put(devStatus, result+"%"); + GateStatusGroupResponse gateStatusGroupResponse = new GateStatusGroupResponse(); + gateStatusGroupResponse.setStatus(devStatus); + gateStatusGroupResponse.setRatio(result+"%"); + resultList.add(gateStatusGroupResponse); }); - resultMap.put("总", sum); + resultMap.put("total", sum); + resultMap.put("list", resultList); return ResponseData.success(resultMap); } @@ -282,17 +333,38 @@ String position = securityScoreDTO.getPosition(); List caseInfos = caseInfoMapper.selectByPosition(position); //查询各危险级别权重、各类别权重,放入map,避免循环中多次查数据库 - + HashMap hazardScoreMap = new HashMap<>(); + List caseHazardLevelList = hazardLevelMapper.getCaseHazardLevelList(null); + caseHazardLevelList.forEach(hazardLevel -> { + hazardScoreMap.put(hazardLevel.getCode(), hazardLevel.getWeight()); + }); + HashMap categoryScoreMap = new HashMap<>(); + List categoryLevelList = categoryLevelMapper.getCaseCategoryLevelList(null); + categoryLevelList.forEach(categoryLevel -> { + categoryScoreMap.put(categoryLevel.getCode(), categoryLevel.getWeight()); + }); + //事件按楼层分组,计算 List securityScoreDTOs = new ArrayList<>(); caseInfos.forEach(caseInfo -> { SecurityScoreDTO securityScoreDTO1 = new SecurityScoreDTO(); + securityScoreDTO1.setPosition(caseInfo.getPosition()); securityScoreDTO1.setArea(caseInfo.getArea()); - // TODO: 2022/8/4 楼层评分计算根据产品定义调整 -// caseInfo.get -// securityScoreDTO1.setScore(); + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); + Double score = 100 - Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + securityScoreDTO1.setScore(score); + securityScoreDTOs.add(securityScoreDTO1); }); - - return null; + 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); + }); + return ResponseData.success(securityScoreDTOs); } /** @@ -303,9 +375,13 @@ public Object SecurityFrequency(@RequestBody SecurityFrequencyDTO securityFrequencyDTO) { String year = securityFrequencyDTO.getYear(); String month = securityFrequencyDTO.getMonth(); - Integer quantity = caseInfoMapper.selectCountByMonth(year, month); - securityFrequencyDTO.setQuantity(quantity); - return ResponseData.success(securityFrequencyDTO); + if(!StringUtils.isEmpty(year) && StringUtils.isEmpty(month)){ + Integer quantity = caseInfoMapper.selectCountByMonth(year, month); + securityFrequencyDTO.setQuantity(quantity); + return ResponseData.success(securityFrequencyDTO); + } + List list = caseInfoMapper.selectPreMonthCount(); + return ResponseData.success(list); } } 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 ae4d770..f4f075c 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 @@ -1,20 +1,25 @@ package com.casic.missiles.modular.controller.cockpit; +import cn.hutool.core.date.DateUnit; import cn.hutool.core.date.DateUtil; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.casic.missiles.model.response.ResponseData; -import com.casic.missiles.modular.dao.AttendanceInfoMapper; -import com.casic.missiles.modular.dao.CaseInfoMapper; -import com.casic.missiles.modular.dao.HazardLevelMapper; -import com.casic.missiles.modular.dao.StaffInfoMapper; +import com.casic.missiles.modular.dao.*; +import com.casic.missiles.modular.dto.DeviceRepairLogDTO; +import com.casic.missiles.modular.dto.DeviceRepairRequest; import com.casic.missiles.modular.dto.statistics.*; +import com.casic.missiles.modular.enums.SecurityEventType; +import com.casic.missiles.modular.model.CaseCategoryLevel; import com.casic.missiles.modular.model.CaseHazardLevel; +import com.casic.missiles.modular.model.CaseInfo; import com.casic.missiles.modular.model.StaffInfo; +import com.casic.missiles.modular.service.DeviceInfoService; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.util.CollectionUtils; import org.springframework.web.bind.annotation.*; +import java.math.BigDecimal; import java.text.NumberFormat; import java.util.*; import java.util.stream.Collectors; @@ -40,6 +45,12 @@ @Autowired private HazardLevelMapper hazardLevelMapper; + @Autowired + private CategoryLevelMapper categoryLevelMapper; + + @Autowired + private DeviceInfoService deviceInfoService; + /** * 安防事件时域频次统计,每月的每天安防事件个数(原方案) * 月维度:展示每个月的每天的数据 @@ -89,15 +100,17 @@ List monthList = caseInfoMapper.selectPreMonthCountByYear(year); Map> collect = monthList.stream().collect(Collectors.groupingBy(PreMonthOrWeekCaseDTO::getHazardLevelCode)); HashMap strAvgMap = new HashMap<>(); + List resultList = new ArrayList<>(); for (String key : collect.keySet()) { List preMonthOrWeekCaseDTOS = collect.get(key); int sum = preMonthOrWeekCaseDTOS.stream().mapToInt(PreMonthOrWeekCaseDTO::getQuantity).sum(); //若年份是本年,则使用个安防级别数量/当前月份数 //若不是本年,除数为12 MonthAndWeekDTO monthAndWeekDTO = new MonthAndWeekDTO(); + String hazardName = hazardLevelMapper.selectHazardNameByCode(key); + monthAndWeekDTO.setLevelName(hazardName); if(year.equals(String.valueOf(DateUtil.thisYear()))){ monthAndWeekDTO.setMonthQuantity(sum / DateUtil.thisMonth()); -// monthAndWeekDTO.setLevelName(); strAvgMap.put(key, monthAndWeekDTO); }else{ monthAndWeekDTO.setMonthQuantity(sum / 12); @@ -113,27 +126,37 @@ if(year.equals(String.valueOf(DateUtil.thisYear()))){ if(!Objects.isNull(strAvgMap.get(key))){ MonthAndWeekDTO monthAndWeekDTO = strAvgMap.get(key); + String hazardName = hazardLevelMapper.selectHazardNameByCode(key); + monthAndWeekDTO.setLevelName(hazardName); monthAndWeekDTO.setWeekQuantity(sum / DateUtil.thisWeekOfYear()); strAvgMap.put(key, monthAndWeekDTO); }else{ MonthAndWeekDTO monthAndWeekDTO = new MonthAndWeekDTO(); + String hazardName = hazardLevelMapper.selectHazardNameByCode(key); + monthAndWeekDTO.setLevelName(hazardName); monthAndWeekDTO.setWeekQuantity(sum / DateUtil.thisWeekOfYear()); strAvgMap.put(key, monthAndWeekDTO); } }else{ if(!Objects.isNull(strAvgMap.get(key))){ MonthAndWeekDTO monthAndWeekDTO = strAvgMap.get(key); + String hazardName = hazardLevelMapper.selectHazardNameByCode(key); + monthAndWeekDTO.setLevelName(hazardName); monthAndWeekDTO.setWeekQuantity(sum / 52); strAvgMap.put(key, monthAndWeekDTO); }else{ MonthAndWeekDTO monthAndWeekDTO = new MonthAndWeekDTO(); + String hazardName = hazardLevelMapper.selectHazardNameByCode(key); + monthAndWeekDTO.setLevelName(hazardName); monthAndWeekDTO.setWeekQuantity(sum / 52); strAvgMap.put(key, monthAndWeekDTO); } } } - avgMonthAndWeekGroupDTO.setMap(strAvgMap); - return ResponseData.success(avgMonthAndWeekGroupDTO); + strAvgMap.keySet().forEach(key -> { + resultList.add(strAvgMap.get(key)); + }); + return ResponseData.success(resultList); } /** @@ -181,12 +204,178 @@ } /** - * 员工考勤人数变化,功能待定 + * 员工考勤人数变化,统计当天(横坐标为时)及近7天(横坐标为天)的考勤人数变化,只要发生一次考勤识别,次数的基数就正常增加(没有上班下班区分) */ + @PostMapping("/staff/attendanceNumber/{dimension}") + @ResponseBody + public Object attendanceNumber(@PathVariable("dimension") String dimension) { + List attendanceNumberDTOs = null; + List> resultList = new ArrayList<>(); + if("week".equals(dimension)){ + //近7天数据按天分组统计 + attendanceNumberDTOs = attendanceInfoMapper.getCountForWeek(); + }else if("day".equals(dimension)) { + //今天数据按小时分组统计 + attendanceNumberDTOs = attendanceInfoMapper.getCountForDay(); + } + if(CollectionUtils.isEmpty(attendanceNumberDTOs)){ + return ResponseData.error("该查询条件下,无员工出勤数据!"); + } + Map> collect = attendanceNumberDTOs.stream().collect(Collectors.groupingBy(AttendanceNumberDTO::getDate)); + collect.keySet().forEach(key -> { + List attendanceNumberDTOS = collect.get(key); + AttendanceNumberDTO attendanceNumberDTO = attendanceNumberDTOS.get(0); + AttendanceNumberDTO attendanceNumberDTO2 = attendanceNumberDTOS.get(1); + Map resultMap = new HashMap<>(); + resultMap.put(attendanceNumberDTO.getStaffType(), attendanceNumberDTO.getQuantity()); + resultMap.put(attendanceNumberDTO2.getStaffType(), attendanceNumberDTO2.getQuantity()); + resultMap.put("staticTime", attendanceNumberDTO.getDate()); + resultList.add(resultMap); + }); + return ResponseData.success(resultList); + } /** - * 近30天/近一周安保人员到岗排行 + * 早晚高峰区域安防评估 */ + @PostMapping("/security/assessment/{dimension}") + @ResponseBody + public Object securityAssessment(@PathVariable("dimension") String dimension) { + //查询各危险级别权重、各类别权重,放入map,避免循环中多次查数据库 + HashMap hazardScoreMap = new HashMap<>(); + List caseHazardLevelList = hazardLevelMapper.getCaseHazardLevelList(null); + caseHazardLevelList.forEach(hazardLevel -> { + hazardScoreMap.put(hazardLevel.getCode(), hazardLevel.getWeight()); + }); + HashMap categoryScoreMap = new HashMap<>(); + List categoryLevelList = categoryLevelMapper.getCaseCategoryLevelList(null); + categoryLevelList.forEach(categoryLevel -> { + categoryScoreMap.put(categoryLevel.getCode(), categoryLevel.getWeight()); + }); + HashMap hashMap = new HashMap<>(); + if("week".equals(dimension)){ + //近7天早晚高峰数据 + List caseInfos = caseInfoMapper.selectListBySevenDay(); + //按时间(天)进行分组 + caseInfos.forEach(caseInfo -> { + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); + Double score = Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + String[] array = caseInfo.getHappenTime().split(" "); + String dayTime = array[0]; + BigDecimal preScore; + if(hashMap.containsKey(dayTime)){ + Double aDouble = hashMap.get(dayTime); + preScore = new BigDecimal(aDouble.toString()); + + }else{ + preScore = new BigDecimal("100.0"); + } + BigDecimal nowScore = new BigDecimal(score.toString()); + hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); + }); + return ResponseData.success(hashMap); + }else if("day".equals(dimension)) { + //今天数据按小时分组统计 + List caseInfos = caseInfoMapper.selectListByToday(); + caseInfos.forEach(caseInfo -> { + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); + Double score = Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + String[] array = caseInfo.getHappenTime().split(":"); + String dayTime = array[0]; + BigDecimal preScore; + if(hashMap.containsKey(dayTime)){ + Double aDouble = hashMap.get(dayTime); + preScore = new BigDecimal(aDouble.toString()); + + }else{ + preScore = new BigDecimal("100.0"); + } + BigDecimal nowScore = new BigDecimal(score.toString()); + hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); + }); + return ResponseData.success(hashMap); + } + return null; + } + + /** + * 重点区域安防事态评估,统计重点区域6:00-23:00按小时分组数据 + */ + @GetMapping("/security/keyAreaStatistic") + @ResponseBody + public Object keyAreaStatistic() { + //查询各危险级别权重、各类别权重,放入map,避免循环中多次查数据库 + HashMap hazardScoreMap = new HashMap<>(); + List caseHazardLevelList = hazardLevelMapper.getCaseHazardLevelList(null); + caseHazardLevelList.forEach(hazardLevel -> { + hazardScoreMap.put(hazardLevel.getCode(), hazardLevel.getWeight()); + }); + HashMap categoryScoreMap = new HashMap<>(); + List categoryLevelList = categoryLevelMapper.getCaseCategoryLevelList(null); + categoryLevelList.forEach(categoryLevel -> { + categoryScoreMap.put(categoryLevel.getCode(), categoryLevel.getWeight()); + }); + HashMap hashMap = new HashMap<>(); + //今天数据按小时分组统计 + List caseInfos = caseInfoMapper.selectListByToday2(); + caseInfos.forEach(caseInfo -> { + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); + Double score = Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + String[] array = caseInfo.getHappenTime().split(":"); + String dayTime = array[0]; + BigDecimal preScore; + if(hashMap.containsKey(dayTime)){ + Double aDouble = hashMap.get(dayTime); + preScore = new BigDecimal(aDouble.toString()); + + }else{ + preScore = new BigDecimal("100.0"); + } + BigDecimal nowScore = new BigDecimal(score.toString()); + hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); + }); + return ResponseData.success(hashMap); + } + + /** + * 安防机动支援力量调配响应评估,根据事件已解决状态及已解决时间-发送时间,按时间(小时)分组统计 + */ + @GetMapping("/security/responseAssess") + @ResponseBody + public Object responseAssess() { + //查询各危险级别权重、各类别权重,放入map,避免循环中多次查数据库 + HashMap hazardScoreMap = new HashMap<>(); + List caseHazardLevelList = hazardLevelMapper.getCaseHazardLevelList(null); + caseHazardLevelList.forEach(hazardLevel -> { + hazardScoreMap.put(hazardLevel.getCode(), hazardLevel.getWeight()); + }); + HashMap hashMap = new HashMap<>(); + //今天数据按小时分组统计 + List caseInfos = caseInfoMapper.selectListByToday3(); + caseInfos.forEach(caseInfo -> { + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + //扣分=事件级别权重*未解决小时数 + Date updateTime = DateUtil.parse(caseInfo.getUpdateTime()); + Date happenTime = DateUtil.parse(caseInfo.getHappenTime()); + long between = DateUtil.between(updateTime, happenTime, DateUnit.HOUR); + Double score = Double.valueOf(hazardWeight)*between; + String[] array = caseInfo.getHappenTime().split(":"); + String dayTime = array[0]; + BigDecimal preScore; + if(hashMap.containsKey(dayTime)){ + Double aDouble = hashMap.get(dayTime); + preScore = new BigDecimal(aDouble.toString()); + }else{ + preScore = new BigDecimal("100.0"); + } + BigDecimal nowScore = new BigDecimal(score.toString()); + hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); + }); + return ResponseData.success(hashMap); + } /** * 重点区域威胁事件类型统计,优先级2,统计近7天和近30天 @@ -224,7 +413,34 @@ } /** - * 设备状态计算系数和评判,优先级3,需确认设备恢复时间是否可以获取 + * 近30天/近一周安保人员到岗排行 */ + + /** + * 安保等级评估,发生离岗事件减1分 + */ + @GetMapping("/security/levelAssess") + @ResponseBody + public Object securityLevelAssess() { + //今天数据按小时分组统计 + List resultList = caseInfoMapper.selectListByType(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); + resultList.forEach(result -> { + BigDecimal deScore = new BigDecimal(result.getQuantity()); + BigDecimal preScore = new BigDecimal("100.0"); + result.setScore(preScore.subtract(deScore).doubleValue()); + }); + return ResponseData.success(resultList); + } + + /** + * 设备状态计算系数和评判,即设备维修管理查询(不分页) + */ + @PostMapping("/device/repairList") + @ResponseBody + public Object repairList(@RequestBody DeviceRepairRequest deviceRepairRequest) { + List deviceRepairLogDTOS = deviceInfoService.deviceRepairListPage(deviceRepairRequest); + return ResponseData.success(deviceRepairLogDTOS); + } + } 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 fbf8ab6..c71a15a 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 @@ -1,13 +1,12 @@ package com.casic.missiles.modular.controller.hik; +import cn.hutool.core.date.DateTime; +import cn.hutool.core.date.DateUtil; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.casic.missiles.model.response.ResponseData; import com.casic.missiles.modular.dao.HikFaceGroupInfoMapper; -import com.casic.missiles.modular.dto.hik.EventSubscribeRequest; -import com.casic.missiles.modular.dto.hik.FaceGroupAdditionRequest; -import com.casic.missiles.modular.dto.hik.HikRecvEvent; -import com.casic.missiles.modular.dto.hik.OrgBatchAdd; +import com.casic.missiles.modular.dto.hik.*; import com.casic.missiles.modular.enums.HikUri; import com.casic.missiles.modular.enums.SecurityEventType; import com.casic.missiles.modular.model.CaseInfo; @@ -18,16 +17,20 @@ import com.casic.missiles.modular.util.CaseInfoFactoryUtil; import com.casic.missiles.modular.util.HikUtil; import com.casic.missiles.modular.util.ThreadPoolUtil; +import com.casic.missiles.modular.util.WebSocket; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; -import org.springframework.web.bind.annotation.*; +import org.springframework.util.CollectionUtils; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.RestController; -import java.net.InetAddress; -import java.net.UnknownHostException; import java.util.ArrayList; +import java.util.Iterator; import java.util.List; import java.util.Objects; @@ -38,7 +41,6 @@ */ @Slf4j @RestController -@RequestMapping("/hik") public class HikController { @Autowired @@ -53,28 +55,37 @@ @Autowired private HikService hikService; + @Autowired + private HikFaceGroupInfoMapper hikFaceGroupInfoMapper; + + @Autowired + private WebSocket webSocket; + @Value("${server.port}") private int serverPort; - @Autowired - private HikFaceGroupInfoMapper hikFaceGroupInfoMapper; /** * 海康事件订阅 */ - @PostMapping("/event/subscribe") + @PostMapping("/hik/event/subscribe") @ResponseBody - public Object eventSubscribe() throws UnknownHostException { + public Object eventSubscribe() { EventSubscribeRequest eventSubscribeRequest = new EventSubscribeRequest(); ArrayList list = new ArrayList<>(); list.add(SecurityEventType.DEVICE_OFFLINE); + list.add(SecurityEventType.DEVICE_ONLINE); list.add(SecurityEventType.KEY_PERSONNEL_IDENTIFY_EVENT); list.add(SecurityEventType.MONITORING_POINT_OFFLINE); + list.add(SecurityEventType.MONITORING_POINT_ONLINE); list.add(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); list.add(SecurityEventType.PERSONNEL_GATHER_EVENT); - InetAddress localHost = InetAddress.getLocalHost(); + list.add(SecurityEventType.VISITOR_REGISTER); + list.add(SecurityEventType.VISITOR_CHECKOUT); + list.add(SecurityEventType.HIGH_ALTITUDE_PARABOLIC); +// InetAddress localHost = InetAddress.getLocalHost(); eventSubscribeRequest.setEventTypes(list); - eventSubscribeRequest.setEventDest("https://" + localHost + ":" + serverPort + "/eventRcv"); + eventSubscribeRequest.setEventDest("http://" + "192.168.10.6" + ":" + serverPort + "/eventRcv"); //订阅类型,0-订阅原始事件,1-联动事件,2-原始事件和联动事件,不填使用默认值0 eventSubscribeRequest.setSubType(0); /** @@ -92,19 +103,25 @@ } /** + * 查询事件订阅信息 + */ + @PostMapping("/hik/event/query") + @ResponseBody + public Object eventQuery() { + String result = HikUtil.hikApi(HikUri.EVENT_INFO, ""); + return result; + } + + /** * 海康事件接收 */ @PostMapping("/eventRcv") @ResponseBody public Object eventRcv(@RequestBody HikRecvEvent hikRecvEvent) { //1、接收所需事件类型 - Long eventType = hikRecvEvent.getEventType(); + Number eventType = hikRecvEvent.getEventType(); log.info("接收到安防事件类型为:{}", eventType); CaseInfo caseInfo = caseInfoFactoryUtil.getCaseInfo(eventType); - //接收到不关心事件直接返回 - if(Objects.isNull(caseInfo)){ - return ResponseData.success(); - } //2、不同事件不同处理,caseInfoFactoryUtil已设置好事件基础定义信息 // 再为事件添加状态、设备编码、设备名称、位置、区域、时间 // 异步处理事件 @@ -114,19 +131,23 @@ caseHandle(hikRecvEvent, eventType, caseInfo); } })); +// caseHandle(hikRecvEvent, eventType, caseInfo); - return null; + return ResponseData.success(); } - private void caseHandle(HikRecvEvent hikRecvEvent, Long eventType, CaseInfo caseInfo) { + private void caseHandle(HikRecvEvent hikRecvEvent, Number eventType, CaseInfo caseInfo) { JSONArray eventArray = hikRecvEvent.getEventArray(); List caseInfos = new ArrayList<>(); - while (eventArray.stream().iterator().hasNext()) { + Iterator iterator = eventArray.iterator(); + while (iterator.hasNext()) { CaseInfo caseInfo1 = new CaseInfo(); - BeanUtils.copyProperties(caseInfo, caseInfo1); - JSONObject event = (JSONObject) eventArray.stream().iterator().next(); + if(!Objects.isNull(caseInfo)){ + BeanUtils.copyProperties(caseInfo, caseInfo1); + } + JSONObject event = (JSONObject) iterator.next(); //5种事件进行不同处理 - if(SecurityEventType.KEY_PERSONNEL_IDENTIFY_EVENT == eventType){ + if (SecurityEventType.KEY_PERSONNEL_IDENTIFY_EVENT.equals(eventType)) { //判断所属人脸分组 JSONObject data = (JSONObject) event.get("data"); JSONObject faceRecognitionResult = (JSONObject) data.get("faceRecognitionResult"); @@ -142,52 +163,101 @@ if (faceGroupCode.equals(blackListGroup.getFaceGroupCode())) { //黑名单分组处理 caseInfo1 = hikService.blackListHandle(event, caseInfo1); - }else if(faceGroupCode.equals(propertyPersonnelGroup.getFaceGroupCode())){ + } else if (faceGroupCode.equals(propertyPersonnelGroup.getFaceGroupCode())) { //考勤分组处理-物业人员,添加到考勤表 hikService.propertyAttendanceHandle(event); - }else if(faceGroupCode.equals(securityPersonnelGroup.getFaceGroupCode())){ + } else if (faceGroupCode.equals(securityPersonnelGroup.getFaceGroupCode())) { //考勤分组处理-安保人员,添加到考勤表 hikService.securityPersonnelHandle(event); - }else { + } else { return; } - }else if(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT == eventType){ + } else if (SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT.equals(eventType)) { //离岗事件处理 caseInfo1 = hikService.demobilizedHandle(event, caseInfo1); - }else if(SecurityEventType.PERSONNEL_GATHER_EVENT == eventType){ + } else if (SecurityEventType.PERSONNEL_GATHER_EVENT.equals(eventType)) { //人员聚集事件处理 caseInfo1 = hikService.personGatherHandle(event, caseInfo1); - }else if(SecurityEventType.MONITORING_POINT_OFFLINE == eventType){ + } else if (SecurityEventType.MONITORING_POINT_OFFLINE.equals(eventType)) { //监控点离线事件处理 caseInfo1 = hikService.monitorPointOfflineHandle(event, caseInfo1); - }else if(SecurityEventType.DEVICE_OFFLINE == eventType){ + } else if (SecurityEventType.MONITORING_POINT_ONLINE.equals(eventType)) { + //监控点上线事件处理 + hikService.monitorPointOnlineHandle(event); + } else if (SecurityEventType.DEVICE_OFFLINE.equals(eventType)) { //装置离线事件处理 caseInfo1 = hikService.deviceOfflineHandle(event, caseInfo1); - }else if(SecurityEventType.VISITOR_REGISTER == eventType){ + } else if (SecurityEventType.DEVICE_ONLINE.equals(eventType)) { + //装置上线处理 + hikService.deviceOnlineHandle(event); + } else if (SecurityEventType.VISITOR_REGISTER.equals(eventType)) { //记录访客登记记录,添加到访客记录表 hikService.visitorRegisterHandler(event); - }else if(SecurityEventType.VISITOR_CHECKOUT == eventType){ + } else if (SecurityEventType.VISITOR_CHECKOUT.equals(eventType)) { //记录访客签离记录 hikService.visitorCheckOutHandler(event); } - if(!Objects.isNull(caseInfo1) && !StringUtils.isEmpty(caseInfo1.getHappenTime())){ + if (!Objects.isNull(caseInfo1) && !StringUtils.isEmpty(caseInfo1.getHappenTime())) { caseInfos.add(caseInfo1); } } //3、安防事件入库 - if(!caseInfoService.insertCaseInfoBatch(caseInfos)){ - log.error("安防事件批量入库异常"); + if (!CollectionUtils.isEmpty(caseInfos) && !caseInfoService.insertCaseInfoBatch(caseInfos)) { + log.error("安防事件批量入库异常!"); } // TODO: 2022/8/15 webSocket推送 + if (CollectionUtils.isEmpty(caseInfos)) { + log.info("webSocket事件推送"); + webSocket.sendAllMessage(JSONObject.toJSONString(caseInfos)); + } return; } /** + * 以图搜图,前端用于轨迹追踪 + */ + @PostMapping("/hik/search/picture") + @ResponseBody + public Object searchPictures(@RequestBody SearchPicturesRequest searchPicturesRequest) { + DateTime startDateTime = DateUtil.parse(searchPicturesRequest.getStartTime()); + DateTime endDateTime = DateUtil.parse(searchPicturesRequest.getEndTime()); + String startTime = DateUtil.format(startDateTime, "yyyy-MM-dd'T'HH:mm:ss.SSSXXX"); + String endTime = DateUtil.format(endDateTime, "yyyy-MM-dd'T'HH:mm:ss.SSSXXX"); + searchPicturesRequest.setStartTime(startTime); + searchPicturesRequest.setEndTime(endTime); + String body = JSONObject.toJSONString(searchPicturesRequest); + String resultStr = HikUtil.hikApi(HikUri.SEARCH_PICTURES, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (!"0".equals(resultJson.get("code"))) { + log.error("请求海康,以图搜图失败,海康response:{}", resultStr); + return ResponseData.error("以图搜图失败"); + } + return ResponseData.success(resultJson); + } + + + /** + * 海康事件取消订阅 + */ + @PostMapping("/hik/event/cancel") + @ResponseBody + public Object eventCancelSubscribe(@RequestBody CancelSubscribeRequest cancelSubscribeRequest) { + String body = JSONObject.toJSONString(cancelSubscribeRequest); + String resultStr = HikUtil.hikApi(HikUri.EVENT_CANCEL, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (!"0".equals(resultJson.get("code"))) { + log.error("请求海康,取消订阅失败,海康response:{}", resultStr); + return ResponseData.error("取消订阅失败"); + } + return ResponseData.success(resultJson); + } + + /** * 单个添加海康人脸分组 * api->hik单个添加人脸分组api->response->mysql */ - @PostMapping("/faceGroup/single/add") + @PostMapping("/hik/faceGroup/single/add") @ResponseBody public Object faceGroupAddition(@RequestBody FaceGroupAdditionRequest faceGroupAdditionRequest) { String body = JSONObject.toJSONString(faceGroupAdditionRequest); @@ -212,7 +282,7 @@ * 批量添加海康组织 * api->hik批量添加组织api->response */ - @PostMapping("/org/batch/add") + @PostMapping("/hik/org/batch/add") @ResponseBody public Object orgBatchAdd(@RequestBody List orgBatchAddRequest) { String body = JSONObject.toJSONString(orgBatchAddRequest); @@ -232,4 +302,62 @@ return ResponseData.error("批量添加组织失败"); } + /** + * 获取人员列表 + */ + @PostMapping("/hik/person/personList") + @ResponseBody + public Object personList() { + PersonListRequest request = new PersonListRequest(); + request.setPageNo(1); + request.setPageSize(100); + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi("/api/resource/v2/person/personList", body); + return resultStr; + } + + /** + * 获取组织列表 + */ + @PostMapping("/hik/org/orgList") + @ResponseBody + public Object orgList() { + PersonListRequest request = new PersonListRequest(); + request.setPageNo(1); + request.setPageSize(100); + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi("/api/resource/v1/org/orgList", body); + return resultStr; + } + + /** + * 查询访客权限下载记录 + */ + @PostMapping("/hik/auth/result") + @ResponseBody + public Object authResult() { + PersonListRequest request = new PersonListRequest(); + request.setPageNo(1); + request.setPageSize(100); + request.setOrderId("ba101db6246711edaea66f7939a13638"); + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi("/api/visitor/v1/auth/result", body); + return resultStr; + } + + /** + * 人脸图片获取 + */ + @PostMapping("/hik/face/picture") + @ResponseBody + public Object facePicture() { + FaceRequest request = new FaceRequest(); +// List list = new ArrayList<>(); +// list.add(""); + request.setCertificateNum("wanggong"); + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi("/api/frs/v1/face", body); + return resultStr; + } + } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/AssetInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/AssetInfoMapper.java index 4f64e83..c0684ee 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/AssetInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/AssetInfoMapper.java @@ -17,6 +17,6 @@ @Mapper public interface AssetInfoMapper extends BaseMapper { - List getAssetInfoListPage(@Param("page") Page page, AssetInfoRequest assetInfoRequest); + List getAssetInfoListPage(@Param("page") Page page, @Param("assetInfoRequest") AssetInfoRequest assetInfoRequest); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/AttendanceInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/AttendanceInfoMapper.java index f9e793e..ec87e46 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/AttendanceInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/AttendanceInfoMapper.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.statistics.AttendanceNumberDTO; import com.casic.missiles.modular.dto.statistics.AttendanceRatioDTO; import com.casic.missiles.modular.model.AttendanceInfo; import org.apache.ibatis.annotations.Mapper; @@ -17,7 +18,7 @@ */ @Mapper public interface AttendanceInfoMapper extends BaseMapper { - List getAttendanceInfoListPage(@Param("page") Page page, StaffInfoRequest attendanceInfoRequest); + List getAttendanceInfoListPage(@Param("page") Page page, @Param("attendanceInfoRequest") StaffInfoRequest attendanceInfoRequest); AttendanceInfo selectByCodeAndDate(@Param("staffCode") String staffCode); @@ -26,4 +27,8 @@ List getCountByTypeAndDateForMonth(@Param("staffType")String staffType); List getCountByTypeAndDateForYear(@Param("staffType")String staffType); + + List getCountForWeek(); + + List getCountForDay(); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java index ce94b8f..6137a7d 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java @@ -17,5 +17,5 @@ @Mapper public interface BlackInfoMapper extends BaseMapper { - List getBlackInfoListPage(@Param("page") Page page, BlackInfoRequest blackInfoRequest); + List getBlackInfoListPage(@Param("page") Page page, @Param("blackInfoRequest") BlackInfoRequest blackInfoRequest); } 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 efda6b3..50aaa6f 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 @@ -20,7 +20,7 @@ List getCaseInfoListPage(@Param("page") Page page, @Param("caseInfoRequest") CaseInfoRequest caseInfoRequest); - int updateStatusById(CaseInfoRequest caseInfoRequest); + int updateStatusById(@Param("caseInfoRequest") CaseInfoRequest caseInfoRequest); List selectByLevelAndMonth(@Param("year") String year); @@ -47,4 +47,20 @@ List selectPreWeekCountByThirtyDay(); List selectPreDayCountBySevenDay(); + + Integer selectDemobilizedCount(@Param("eventType") Number personnelDemobilizedEvent); + + List selectPreMonthCount(); + + List selectListBySevenDay(); + + List selectListByToday(); + + List selectListByToday2(); + + List selectListByToday3(); + + List selectListByType(@Param("eventType") Number eventType); + + List selectDemobilizedCountByHour(@Param("eventType") Number eventType); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/CategoryLevelMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/CategoryLevelMapper.java index 52fc714..afe1650 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/CategoryLevelMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/CategoryLevelMapper.java @@ -17,9 +17,9 @@ @Mapper public interface CategoryLevelMapper extends BaseMapper { - List getCaseCategoryLevelListPage(@Param("page") Page page, CategoryLevelRequest categoryLevelRequest); + List getCaseCategoryLevelListPage(@Param("page") Page page, @Param("categoryLevelRequest") CategoryLevelRequest categoryLevelRequest); - List getCaseCategoryLevelList(CategoryLevelRequest categoryLevelRequest); + List getCaseCategoryLevelList(@Param("categoryLevelRequest") CategoryLevelRequest categoryLevelRequest); CaseCategoryLevel getCaseCategoryLevel(@Param("categoryLevelCode") String categoryLevelCode); 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 66353b1..2555a09 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 @@ -19,7 +19,7 @@ @Mapper public interface DeviceInfoMapper extends BaseMapper { - List getDeviceInfoListPage(@Param("page") Page page, DeviceInfoRequest deviceInfoRequest); + List getDeviceInfoListPage(@Param("page") Page page, @Param("deviceInfoRequest") DeviceInfoRequest deviceInfoRequest); List getDeviceInfoList(@Param("deviceInfoRequest") DeviceInfoRequest deviceInfoRequest); @@ -27,6 +27,8 @@ DeviceInfo getByIndexCode(@Param("srcIndex") String srcIndex); + DeviceInfo getByIp(@Param("ip") String ip); + List selectIndexCodesByCodes(@Param("deviceCodes") List deviceCodes); List selectByType(@Param("devType") String devType); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java index 41dd0af..5bfaf63 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java @@ -5,6 +5,7 @@ import com.casic.missiles.modular.dto.DeviceRepairRequest; import com.casic.missiles.modular.model.DeviceRepairLog; import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; import java.util.List; @@ -16,7 +17,7 @@ @Mapper public interface DeviceRepairLogMapper extends BaseMapper { - List getDeviceRepairListPage(Page page, DeviceRepairRequest deviceRepairRequest); + List getDeviceRepairListPage(@Param("page") Page page, @Param("deviceRepairRequest")DeviceRepairRequest deviceRepairRequest); - List getDeviceRepairList(DeviceRepairRequest deviceRepairRequest); + List getDeviceRepairList(@Param("deviceRepairRequest") DeviceRepairRequest deviceRepairRequest); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java index 9035c47..4823ac1 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java @@ -18,7 +18,7 @@ @Mapper public interface FireEquipInfoMapper extends BaseMapper { - List getFireEquipInfoListPage(@Param("page") Page page, FireEquipRequest fireEquipRequest); + List getFireEquipInfoListPage(@Param("page") Page page, @Param("fireEquipRequest") FireEquipRequest fireEquipRequest); FireEquipInfo getFireEquipInfo(@Param("equipCode") String equipCode); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/GateGroupMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/GateGroupMapper.java index d8c330d..977a427 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/GateGroupMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/GateGroupMapper.java @@ -17,7 +17,7 @@ */ @Mapper public interface GateGroupMapper extends BaseMapper { - List getGateGroupListPage(@Param("page") Page page, GateGroupRequest gateGroupRequest); + List getGateGroupListPage(@Param("page") Page page, @Param("gateGroupRequest") GateGroupRequest gateGroupRequest); GateGroup getGateGroupByName(@Param("groupName") String groupName); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/HazardLevelMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/HazardLevelMapper.java index 8957780..dcf47bb 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/HazardLevelMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/HazardLevelMapper.java @@ -17,11 +17,13 @@ @Mapper public interface HazardLevelMapper extends BaseMapper { - List getCaseHazardLevelListPage(@Param("page") Page page, HazardLevelRequest hazardLevelRequest); + List getCaseHazardLevelListPage(@Param("page") Page page, @Param("hazardLevelRequest") HazardLevelRequest hazardLevelRequest); - List getCaseHazardLevelList(HazardLevelRequest hazardLevelRequest); + List getCaseHazardLevelList(@Param("hazardLevelRequest") HazardLevelRequest hazardLevelRequest); CaseHazardLevel getCaseHazardLevel(@Param("hazardLevelCode") String hazardLevelCode); List selectHazardName(); + + String selectHazardNameByCode(@Param("hazardLevelCode") String hazardLevelCode); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/HikCaseDefineMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/HikCaseDefineMapper.java index 0dc47d1..f162fef 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/HikCaseDefineMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/HikCaseDefineMapper.java @@ -12,5 +12,5 @@ */ @Mapper public interface HikCaseDefineMapper extends BaseMapper { - HikCaseDefine getHikCaseDefine(@Param("caseTypeCode") Long caseTypeCode); + HikCaseDefine getHikCaseDefine(@Param("caseTypeCode") Number caseTypeCode); } 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 f8a674c..fe5afc2 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 @@ -17,11 +17,13 @@ @Mapper public interface StaffInfoMapper extends BaseMapper { - List getStaffInfoListPage(@Param("page") Page page, StaffInfoRequest staffInfoRequest); + List getStaffInfoListPage(@Param("page") Page page, @Param("staffInfoRequest") StaffInfoRequest staffInfoRequest); StaffInfo selectByCode(@Param("staffCode") String staffCode); - List getStaffInfoList(StaffInfoRequest staffInfoRequest); + List getStaffInfoList(@Param("staffInfoRequest") StaffInfoRequest staffInfoRequest); - List selectBatchCodes(List list); + List selectBatchCodes(@Param("list") List list); + + int updateByCodeForCard(@Param("staffCode") String staffCode, @Param("cardNo") String cardNo); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitInfoMapper.java index b1217c5..6c52542 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitInfoMapper.java @@ -16,7 +16,7 @@ */ @Mapper public interface VisitInfoMapper extends BaseMapper { - List getVisitInfoListPage(@Param("page") Page page, VisitorRequest visitorRequest); + List getVisitInfoListPage(@Param("page") Page page, @Param("visitorRequest") VisitorRequest visitorRequest); VisitInfo selectByOrderId(@Param("orderId") String orderId); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitorApplyMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitorApplyMapper.java index c09f3c0..6ea55bd 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitorApplyMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitorApplyMapper.java @@ -18,7 +18,7 @@ @Mapper public interface VisitorApplyMapper extends BaseMapper { - List getVisitorApplyListPage(@Param("page") Page page, VisitorApplyRequest visitorApplyRequest); + List getVisitorApplyListPage(@Param("page") Page page, @Param("visitorApplyRequest") VisitorApplyRequest visitorApplyRequest); List selectByVisitReason(); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/AttendanceInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/AttendanceInfoMapper.xml index b2ece71..f8bdd6e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/AttendanceInfoMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/AttendanceInfoMapper.xml @@ -43,7 +43,8 @@ and staff_type = #{staffType} - and YEARWEEK(date_format(atte_date, '%Y-%m-%d'), 1) = YEARWEEK(now(),1); + AND DATE_SUB(CURDATE(), INTERVAL 7 DAY) <= DATE(atte_date) + GROUP BY DATE_FORMAT(atte_date, '%Y-%m-%d') @@ -69,4 +70,20 @@ GROUP BY DATE_FORMAT(atte_date, '%Y-%m') + + + \ No newline at end of file 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 2b6953f..06ec0a8 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 @@ -28,7 +28,9 @@ @@ -87,7 +89,8 @@ SELECT hazard_level_code as levelCode, count(id) as quantity FROM bus_case_info WHERE hazard_level_code is not null - AND DATE_SUB(CURDATE(), INTERVAL 7 DAY) <= date(happen_time); + AND is_key_area = 1 + AND DATE_SUB(CURDATE(), INTERVAL 7 DAY) <= date(happen_time) GROUP BY hazard_level_code @@ -95,7 +98,8 @@ SELECT hazard_level_code as levelCode, count(id) as quantity FROM bus_case_info WHERE hazard_level_code is not null - AND DATE_SUB(CURDATE(), INTERVAL 30 DAY) <= date(happen_time); + AND is_key_area = 1 + AND DATE_SUB(CURDATE(), INTERVAL 30 DAY) <= date(happen_time) GROUP BY hazard_level_code @@ -122,4 +126,71 @@ AND hazard_level_code is not null GROUP BY DATE_FORMAT(happen_time,'%Y-%m-%d') + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/CategoryLevelMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/CategoryLevelMapper.xml index 4670b1f..1d25cbd 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/CategoryLevelMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/CategoryLevelMapper.xml @@ -20,11 +20,11 @@ SELECT * FROM bus_case_category_level WHERE 1=1 - - and code = #{code} + + and code = #{categoryLevelRequest.code} - - and name = #{name} + + and name = #{categoryLevelRequest.name} ORDER by create_time DESC 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 9b66fd8..bfd84b7 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 @@ -98,4 +98,10 @@ #{item} + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceRepairLogMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceRepairLogMapper.xml index 078ed3c..cf1a481 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceRepairLogMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceRepairLogMapper.xml @@ -22,14 +22,14 @@ SELECT * FROM bus_device_repair_log WHERE 1=1 - - and device_code = #{devCode} + + and device_code = #{deviceRepairRequest.devCode} - - and device_name = #{devName} + + and device_name = #{deviceRepairRequest.devName} - - and DATE_FORMAT(create_time,"%y%m%d") = DATE_FORMAT(#{createTime},"%y%m%d") + + and DATE_FORMAT(create_time,"%y%m%d") = DATE_FORMAT(#{deviceRepairRequest.createTime},"%y%m%d") ORDER by create_time DESC diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/HazardLevelMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/HazardLevelMapper.xml index f16f2b9..458322b 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/HazardLevelMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/HazardLevelMapper.xml @@ -20,11 +20,11 @@ SELECT * FROM bus_case_hazard_level WHERE 1=1 - - and code = #{code} + + and code = #{hazardLevelRequest.code} - - and name = #{name} + + and name = #{hazardLevelRequest.name} ORDER by create_time DESC @@ -42,4 +42,10 @@ SELECT name FROM bus_case_hazard_level + + \ 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 557237e..b6a183a 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 @@ -50,4 +50,10 @@ + + + UPDATE bus_staff_info + SET card_no = #{cardNo} + WHERE staff_code = #{staffCode} + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitInfoMapper.xml index 84aa84f..230529a 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitInfoMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitInfoMapper.xml @@ -27,5 +27,6 @@ SELECT * FROM bus_visit_info WHERE order_id = #{orderId} and DATE_FORMAT(in_time,'%Y-%m-%d') = CURRENT_DATE + limit 1 \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/BlackPictureRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/BlackPictureRequest.java new file mode 100644 index 0000000..fc92701 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/BlackPictureRequest.java @@ -0,0 +1,14 @@ +package com.casic.missiles.modular.dto; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/29 19:26 + */ +@Data +public class BlackPictureRequest { + private String picUri; + private String serverIndexCode; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/CancelSubscribeRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/CancelSubscribeRequest.java new file mode 100644 index 0000000..e2d390a --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/CancelSubscribeRequest.java @@ -0,0 +1,15 @@ +package com.casic.missiles.modular.dto.hik; + +import lombok.Data; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/24 15:14 + */ +@Data +public class CancelSubscribeRequest { + private List eventTypes; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/CardInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/CardInfo.java new file mode 100644 index 0000000..341457d --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/CardInfo.java @@ -0,0 +1,24 @@ +package com.casic.missiles.modular.dto.hik; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/26 16:08 + */ +@Data +public class CardInfo { + //卡号,8~20个字符,支持数字和大写字母 + private String cardNo; + //人员ID,员工工号 + private String personId; + //人员所属组织IndexCode + private String orgIndexCode; + //卡片类型,默认是1:IC卡 + //1:IC卡 + //2:CPU卡 + //3:远距离卡 + //4:MIFARE卡 + private Number cardType; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/FaceRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/FaceRequest.java new file mode 100644 index 0000000..edc04bf --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/FaceRequest.java @@ -0,0 +1,16 @@ +package com.casic.missiles.modular.dto.hik; + +import lombok.Data; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/25 16:53 + */ +@Data +public class FaceRequest { + private String certificateNum; + private List indexCodes; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/HikRecvEvent.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/HikRecvEvent.java index a3e9845..1b2b2b1 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/HikRecvEvent.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/HikRecvEvent.java @@ -28,12 +28,12 @@ /** * 事件类型,用于判断所需接收到的事件类型 */ - public Long getEventType(){ + public Number getEventType(){ JSONObject jsonObject = (JSONObject)JSONObject.toJSON(params); //事件类别对应SecurityEventTypeEnum JSONArray eventTypeArray = (JSONArray)jsonObject.get("events"); JSONObject eventJsonObject = (JSONObject)JSONObject.toJSON(eventTypeArray.get(0)); - Long eventType = (Long) eventJsonObject.get("eventType"); + Number eventType = (Number) eventJsonObject.get("eventType"); return eventType; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonBatchDeleteRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonBatchDeleteRequest.java index 027d31d..9751929 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonBatchDeleteRequest.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonBatchDeleteRequest.java @@ -12,4 +12,6 @@ @Data public class PersonBatchDeleteRequest { private List personIds; + //删除人脸接口使用 + private String faceId; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonInfoRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonInfoRequest.java new file mode 100644 index 0000000..05dc9e1 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonInfoRequest.java @@ -0,0 +1,20 @@ +package com.casic.missiles.modular.dto.hik; + +import lombok.Data; + +import java.util.List; + +/** + * @Description: 获取员工照片请求实体 + * @Author: wangpeng + * @Date: 2022/8/25 16:53 + */ +@Data +public class PersonInfoRequest { + //获取员工详细信息使用 + private String paramName; + private List paramValue; + //获取照片使用 + private String picUri; + private String serverIndexCode; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonListRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonListRequest.java new file mode 100644 index 0000000..3f7149b --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonListRequest.java @@ -0,0 +1,16 @@ +package com.casic.missiles.modular.dto.hik; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/25 16:53 + */ +@Data +public class PersonListRequest { + private Number pageNo; + private Number pageSize; + + private String orderId; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/SearchPicturesRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/SearchPicturesRequest.java new file mode 100644 index 0000000..0a95966 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/SearchPicturesRequest.java @@ -0,0 +1,24 @@ +package com.casic.missiles.modular.dto.hik; + +import lombok.Data; + +import java.util.List; + +/** + * @Description: 以图搜图请求 + * @Author: wangpeng + * @Date: 2022/8/29 10:46 + */ +@Data +public class SearchPicturesRequest { + private String facePicBinaryData; + private String facePicUrl; + private List cameraIndexCodes; + private String startTime; + private String endTime; + //指定搜图的最小相似度,最小为1,最大为100 + private String minSimilarity; + private Number age; + //male-男性,female-女性 + private String sex; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/StaffCardRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/StaffCardRequest.java new file mode 100644 index 0000000..4052e6d --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/StaffCardRequest.java @@ -0,0 +1,20 @@ +package com.casic.missiles.modular.dto.hik; + +import lombok.Data; + +import java.util.List; + +/** + * @Description: 人员开卡请求实体 + * @Author: wangpeng + * @Date: 2022/8/26 16:05 + */ +@Data +public class StaffCardRequest { + //卡片开始有效时间,时间格式:yyyy-MM-dd + private String startDate; + //卡片截止有效时间,时间格式:yyyy-MM-dd,不能大于2037年12月31日 + private String endDate; + //cardList,待开卡列表,最大支持50张卡 + private List cardList; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/VisitorInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/VisitorInfo.java index 73aa316..b99f301 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/VisitorInfo.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/VisitorInfo.java @@ -14,7 +14,7 @@ //访客性别 //1: 男 //2: 女 - private String gender; + private Integer gender; //联系电话建议填写手机号码 private String phoneNo; //证件类型 diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/ApplyReasonGroupDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/ApplyReasonGroupDTO.java index 514f382..786143e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/ApplyReasonGroupDTO.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/ApplyReasonGroupDTO.java @@ -13,4 +13,6 @@ private String visitReason; //访问人数 private Integer quantity; + //占比 + private String ratio; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/AttendanceNumberDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/AttendanceNumberDTO.java new file mode 100644 index 0000000..a494321 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/AttendanceNumberDTO.java @@ -0,0 +1,24 @@ +package com.casic.missiles.modular.dto.statistics; + +import com.fasterxml.jackson.annotation.JsonIgnore; +import lombok.Data; + +/** + * @Description: 出勤人数统计实体 + * @Author: wangpeng + * @Date: 2022/8/31 19:24 + */ +@Data +public class AttendanceNumberDTO { + //日期维度,周、今日,入参 + @JsonIgnore + private String dateDimension; + + //日期,具体天/小时,出参 + private String date; + //出勤人数 + private String quantity; + //员工类型 + private String staffType; + +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/AvgMonthAndWeekGroupDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/AvgMonthAndWeekGroupDTO.java index 4366916..331a9a9 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/AvgMonthAndWeekGroupDTO.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/AvgMonthAndWeekGroupDTO.java @@ -2,8 +2,6 @@ import lombok.Data; -import java.util.Map; - /** * @Description: 平均每月和每周的数据实体 * @Author: wangpeng @@ -13,6 +11,4 @@ public class AvgMonthAndWeekGroupDTO { //入参 private String year; - //出参,key:事件类型,value:周和月数据平均值 - private Map map; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/GateStatusGroupResponse.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/GateStatusGroupResponse.java new file mode 100644 index 0000000..d16f4e5 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/GateStatusGroupResponse.java @@ -0,0 +1,16 @@ +package com.casic.missiles.modular.dto.statistics; + +import lombok.Data; + +/** + * @Description: 闸机/摄像机统计响应实体 + * @Author: wangpeng + * @Date: 2022/8/30 14:22 + */ +@Data +public class GateStatusGroupResponse { + //设备状态 + private String status; + //占比 + private String ratio; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/MonthAndWeekDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/MonthAndWeekDTO.java index 7482b2a..284115a 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/MonthAndWeekDTO.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/MonthAndWeekDTO.java @@ -9,7 +9,7 @@ */ @Data public class MonthAndWeekDTO { -// private String levelName; + private String levelName; private Integer monthQuantity; private Integer weekQuantity; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/OnDutyRatioDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/OnDutyRatioDTO.java new file mode 100644 index 0000000..4f6a65d --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/OnDutyRatioDTO.java @@ -0,0 +1,15 @@ +package com.casic.missiles.modular.dto.statistics; + +import lombok.Data; + +/** + * @Description: 在岗率统计实体 + * @Author: wangpeng + * @Date: 2022/9/2 21:24 + */ +@Data +public class OnDutyRatioDTO { + private String date; + private String quantity; + private String ratio; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/SecurityLevelAssessDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/SecurityLevelAssessDTO.java new file mode 100644 index 0000000..40a0738 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/SecurityLevelAssessDTO.java @@ -0,0 +1,15 @@ +package com.casic.missiles.modular.dto.statistics; + +import lombok.Data; + +/** + * @Description: 出勤人数统计实体 + * @Author: wangpeng + * @Date: 2022/8/31 19:24 + */ +@Data +public class SecurityLevelAssessDTO { + private String date; + private String quantity; + private Double score; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/SecurityScoreDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/SecurityScoreDTO.java index 304d169..f7bd4a2 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/SecurityScoreDTO.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/SecurityScoreDTO.java @@ -14,5 +14,5 @@ //楼层,出参 private String area; //评分,出参 - private String score; + private Double score; } 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 6a30786..e5e613d 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 @@ -8,6 +8,10 @@ public interface HikUri { //事件订阅 String EVENT_SUBSCRIBE = "/api/eventService/v1/eventSubscriptionByEventTypes"; + //事件订阅信息查询 + String EVENT_INFO = "/api/eventService/v1/eventSubscriptionView"; + //事件订阅取消 + String EVENT_CANCEL = "/api/eventService/v1/eventUnSubscriptionByEventTypes"; //预约免登记 String APPOINTMENT_FREE_REGISTER = "/api/visitor/v1/appointment/registration"; //修改访客预约 @@ -32,8 +36,18 @@ String PERSON_SINGLE_UPDATE = "/api/resource/v1/person/single/update"; //批量删除人员 String PERSON_BATCH_DELETE = "/api/resource/v1/person/batch/delete"; + //根据人脸Id删除人脸 + String PERSON_SINGLE_DELETE = "/api/resource/v1/face/single/delete"; //门禁点反控 String DOOR_CONTROL = "/api/acs/v1/door/doControl"; //查询海康门禁点事件v2 String DOOR_EVENTS = "/api/acs/v2/door/events"; + //批量开卡 + String CARD_BINDING = "/api/cis/v1/card/binding"; + //提取人员照片 + String PERSON_PICTURE = "/api/resource/v1/person/picture"; + //根据人员唯一字段获取人员详细信息 + String PERSON_INFO = "/api/resource/v1/person/condition/personInfo"; + //以图搜图 + String SEARCH_PICTURES = "/api/frs/v1/application/captureSearch"; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/enums/SecurityEventType.java b/casic-server/src/main/java/com/casic/missiles/modular/enums/SecurityEventType.java index d51034c..42eacf8 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/enums/SecurityEventType.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/enums/SecurityEventType.java @@ -14,18 +14,27 @@ Number PERSONNEL_GATHER_EVENT = 131593; //监控点离线事件 Number MONITORING_POINT_OFFLINE = 889196545; + //监控点上线事件 + Number MONITORING_POINT_ONLINE = 889196546; //装置离线 Number DEVICE_OFFLINE = 199710; + //装置连线 + Number DEVICE_ONLINE = 199711; //访客登记 Number VISITOR_REGISTER = 1392513025; //访客签离 Number VISITOR_CHECKOUT = 1392513026; + //高空抛物 + Number HIGH_ALTITUDE_PARABOLIC = 930335; + //下面两个查询海康门禁点事件使用 //合法卡比对通过 Number CARD_COMPARE_PASS = 198914; //人脸认证通过 Number FACE_COMPARE_PASS = 196893; + + // //正常开门 // Number NORMAL_OPENING = 198913; // //按钮开门 @@ -46,7 +55,6 @@ // Number FIREWORKS_DETECTION = 192514; // //陌生人识别事件 // Number STRANGER_RECOGNITION = 1644171265; -// //高空抛物 -// Number HIGH_ALTITUDE_PARABOLIC = 930335; + } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/job/CockpitJob.java b/casic-server/src/main/java/com/casic/missiles/modular/job/CockpitJob.java index 7490a27..85dd016 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/job/CockpitJob.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/job/CockpitJob.java @@ -79,14 +79,6 @@ } }); } - } - /** - * 机动力量实时在岗率,在岗人数除以总应在岗人数,功能待定 - */ -// @Scheduled(cron = "0 0/1 * * * ?") - public void BeOnDutyRatio() { - - } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/service/HikCaseDefineService.java b/casic-server/src/main/java/com/casic/missiles/modular/service/HikCaseDefineService.java index d9bb3a9..18e2936 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/service/HikCaseDefineService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/service/HikCaseDefineService.java @@ -9,5 +9,5 @@ * @Date: 2022/7/21 17:20 */ public interface HikCaseDefineService extends IService { - HikCaseDefine getHikCaseDefine(Long caseTypeCode); + HikCaseDefine getHikCaseDefine(Number caseTypeCode); } 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 dd24101..bcc3b5d 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 @@ -18,6 +18,8 @@ CaseInfo monitorPointOfflineHandle(JSONObject event, CaseInfo caseInfo); + void monitorPointOnlineHandle(JSONObject event); + CaseInfo deviceOfflineHandle(JSONObject event, CaseInfo caseInfo); void propertyAttendanceHandle(JSONObject event); @@ -27,4 +29,6 @@ void visitorRegisterHandler(JSONObject event); void visitorCheckOutHandler(JSONObject event); + + void deviceOnlineHandle(JSONObject event); } 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 e55c016..01870bd 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.StaffCardRequest; import com.casic.missiles.modular.model.StaffInfo; import java.util.List; @@ -28,4 +29,6 @@ StaffInfo selectStaffInfoByCode(StaffInfo staffInfo); List staffInfoList(StaffInfoRequest staffInfoRequest); + + int saveCardInfo(StaffCardRequest staffCardRequest); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/service/impl/BlackInfoServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/service/impl/BlackInfoServiceImpl.java index 8f47b37..981b4cd 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/service/impl/BlackInfoServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/service/impl/BlackInfoServiceImpl.java @@ -17,7 +17,6 @@ import com.casic.missiles.modular.model.BlackInfo; import com.casic.missiles.modular.model.HikFaceGroupInfo; import com.casic.missiles.modular.service.BlackInfoService; -import com.casic.missiles.modular.system.service.ICasicFileService; import com.casic.missiles.modular.util.HikUtil; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; @@ -43,9 +42,6 @@ private HikFaceGroupInfoMapper hikFaceGroupInfoMapper; @Resource - private ICasicFileService fileService; - - @Resource private AbstractDictService dictService; @Override @@ -90,9 +86,6 @@ //设置海康人脸唯一标识、人脸分组唯一标识 blackInfo.setIndexCode(String.valueOf(dataJson.get("indexCode"))); blackInfo.setFaceGroupIndexCode(String.valueOf(dataJson.get("faceGroupIndexCode"))); - //保存图片到本地 - String picUrl = fileService.saveFile(blackInfo.getPicture()); - blackInfo.setPicture(picUrl); //插入数据库 if(blackInfoMapper.insert(blackInfo) > 0){ return ResponseData.success(); @@ -141,8 +134,6 @@ log.error("请求海康,单个修改人脸失败,海康response:{}", resultStr); return ResponseData.error("单个修改人脸失败"); } - String picUrl = fileService.saveFile(blackInfo.getPicture()); - blackInfo.setPicture(picUrl); if(blackInfoMapper.updateById(blackInfo) > 0){ return ResponseData.success(); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/service/impl/CockpitServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/service/impl/CockpitServiceImpl.java index 6e6076e..7402991 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/service/impl/CockpitServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/service/impl/CockpitServiceImpl.java @@ -4,15 +4,12 @@ import cn.hutool.core.date.DateUtil; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.core.application.service.AbstractDictService; import com.casic.missiles.modular.dto.hik.DoorEventsRequest; import com.casic.missiles.modular.enums.HikUri; -import com.casic.missiles.modular.enums.SecurityEventDict; import com.casic.missiles.modular.enums.SecurityEventType; import com.casic.missiles.modular.service.CockpitService; import com.casic.missiles.modular.util.HikUtil; import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.*; @@ -25,8 +22,6 @@ @Slf4j @Service public class CockpitServiceImpl implements CockpitService { - @Autowired - private AbstractDictService dictService; @Override public HashMap dataHandle(DoorEventsRequest doorEventsRequest, HashMap> configMap, HashMap jsonMap, HashMap resultMap) { @@ -36,8 +31,8 @@ Date date = new Date(); DateTime startTimeDate = DateUtil.beginOfDay(date); DateTime endTimeDate = DateUtil.endOfDay(date); - String startTime = DateUtil.format(startTimeDate, "yyyy-MM-dd'T'HH:mm:ss'Z'"); - String endTime = DateUtil.format(endTimeDate, "yyyy-MM-dd'T'HH:mm:ss'Z'"); + String startTime = DateUtil.format(startTimeDate, "yyyy-MM-dd'T'HH:mm:ssXXX"); + String endTime = DateUtil.format(endTimeDate, "yyyy-MM-dd'T'HH:mm:ssXXX"); configMap.keySet().stream().forEach(key -> { List doorIndexCodes = configMap.get(key); doorEventsRequest.setPageNo(1); @@ -95,8 +90,9 @@ return; } Integer num = 0; - while (list.stream().iterator().hasNext()) { - JSONObject next = (JSONObject) list.stream().iterator().next(); + Iterator iterator = list.stream().iterator(); + while (iterator.hasNext()) { + JSONObject next = (JSONObject) iterator.next(); Integer inAndOutType = next.getInteger("inAndOutType"); //进门 if (1 == inAndOutType) { @@ -105,8 +101,8 @@ --num; } } - String dictName = dictService.getDictNameByCode(SecurityEventDict.DEVICE_POSITION, String.valueOf(key)); - resultMap.put(dictName, num); +// String dictName = dictService.getDictNameByCode(SecurityEventDict.DEVICE_POSITION, String.valueOf(key)); + resultMap.put(String.valueOf(key), num); }); return resultMap; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/service/impl/HikCaseDefineServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/service/impl/HikCaseDefineServiceImpl.java index 98ab2a4..1a59c7e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/service/impl/HikCaseDefineServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/service/impl/HikCaseDefineServiceImpl.java @@ -16,7 +16,7 @@ private HikCaseDefineMapper hikCaseDefineMapper; @Override - public HikCaseDefine getHikCaseDefine(Long caseTypeCode) { + public HikCaseDefine getHikCaseDefine(Number caseTypeCode) { return hikCaseDefineMapper.getHikCaseDefine(caseTypeCode); } } 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 b47f78f..dbad48f 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 @@ -58,10 +58,16 @@ 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.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; } @@ -76,10 +82,16 @@ 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.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; } @@ -94,10 +106,16 @@ 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.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; } @@ -109,24 +127,44 @@ 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()); //事件状态(未解决的字典值) + // TODO: 2022/7/28 事件状态字典值选择 + caseInfo.setStatus(dict.get(0).getCode()); //事件状态("未解决"的字典值) DeviceInfo deviceInfo = deviceInfoMapper.getByIndexCode(srcIndex); + if(Objects.isNull(deviceInfo)){ + log.info("接收到监控点离线事件,但数据库中无该事件发生的设备信息"); + return caseInfo; + } 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()); //更新设备状态 // TODO: 2022/7/28 设备离线字典值选择 -// deviceInfo.setStatus(); + List deviceDict = dictService.findInDictByCode(SecurityEventDict.DEVICE_STATUS); + deviceInfo.setStatus(deviceDict.get(1).getCode()); if(deviceInfoMapper.updateById(deviceInfo) <= 0){ + log.error("海康回调,更新监控点离线线状态失败!"); return null; } return caseInfo; } @Override + public void monitorPointOnlineHandle(JSONObject event) { + String srcIndex = event.getString("srcIndex"); + DeviceInfo deviceInfo = deviceInfoMapper.getByIndexCode(srcIndex); + // TODO: 2022/7/28 设备在线字典值选择 + List deviceDict = dictService.findInDictByCode(SecurityEventDict.DEVICE_STATUS); + deviceInfo.setStatus(deviceDict.get(0).getCode()); + if(deviceInfoMapper.updateById(deviceInfo) <= 0){ + log.error("海康回调,更新监控点在线状态失败!"); + } + } + + @Override public CaseInfo deviceOfflineHandle(JSONObject event, CaseInfo caseInfo) { //加入到安防事件 String srcIndex = event.getString("srcIndex"); //海康资源唯一标识 @@ -138,19 +176,40 @@ 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.setDeviceCode(deviceInfo.getDevCode()); //设备code caseInfo.setDevName(deviceInfo.getDevName()); //设备名 caseInfo.setPosition(deviceInfo.getPosition()); //事件位置 caseInfo.setArea(deviceInfo.getArea()); //区域 + caseInfo.setIsKeyArea(deviceInfo.getIsKeyArea()); + caseInfo.setDetailLocation(deviceInfo.getDetailLocation()); //更新设备状态 // TODO: 2022/7/28 设备离线字典值选择 -// deviceInfo.setStatus(); + List deviceDict = dictService.findInDictByCode(SecurityEventDict.DEVICE_STATUS); + deviceInfo.setStatus(deviceDict.get(1).getCode()); if(deviceInfoMapper.updateById(deviceInfo) <= 0){ + log.error("海康回调,更新设备离线状态失败!"); return null; } return caseInfo; } + + @Override + public void deviceOnlineHandle(JSONObject event) { + String srcIndex = event.getString("srcIndex"); + DeviceInfo deviceInfo = deviceInfoMapper.getByIndexCode(srcIndex); + // TODO: 2022/7/28 设备在线字典值选择 + List deviceDict = dictService.findInDictByCode(SecurityEventDict.DEVICE_STATUS); + deviceInfo.setStatus(deviceDict.get(0).getCode()); + if(deviceInfoMapper.updateById(deviceInfo) <= 0){ + log.error("海康回调,更新门禁点装置在线状态失败!"); + } + } + @Override public void propertyAttendanceHandle(JSONObject event) { String srcIndex = event.getString("srcIndex"); @@ -182,8 +241,9 @@ info.setStaffName(staffInfo.getStaffName()); info.setStaffGender(staffInfo.getStaffGender()); // TODO: 2022/7/29 物业人员字典值选择 -// info.setStaffType(); -// info.setStaffTypeName(); + List staffDict = dictService.findInDictByCode(SecurityEventDict.STAFF_TYPE); + info.setStaffType(staffDict.get(0).getCode()); + info.setStaffTypeName(staffDict.get(0).getName()); info.setAtteDate(DateUtil.today()); info.setAtteStartTime(happenTime); info.setAtteStartDev(deviceInfo.getDevCode()); @@ -226,8 +286,9 @@ info.setStaffName(staffInfo.getStaffName()); info.setStaffGender(staffInfo.getStaffGender()); // TODO: 2022/7/29 安保人员字典值选择 -// info.setStaffType(); -// info.setStaffTypeName(); + List staffDict = dictService.findInDictByCode(SecurityEventDict.STAFF_TYPE); + info.setStaffType(staffDict.get(1).getCode()); + info.setStaffTypeName(staffDict.get(1).getName()); info.setAtteDate(DateUtil.today()); info.setAtteStartTime(happenTime); info.setAtteStartDev(deviceInfo.getDevCode()); @@ -259,8 +320,12 @@ visitInfo.setVisitReason(data.getString("purpose")); visitInfo.setPicUri(data.getString("captureUrl")); visitInfo.setServerIndexCode(data.getString("svrIndexCode")); - visitInfo.setVisitPosition(deviceInfo.getPosition()); - + visitInfo.setOrderId(data.getString("visitorId")); + if(!Objects.isNull(deviceInfo)){ + visitInfo.setVisitPosition(deviceInfo.getPosition()); + } else{ + log.info("识别访客的门禁不在数据库中"); + } if(visitInfoMapper.insert(visitInfo) <= 0){ log.error("新增访客记录异常"); } 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 b416f5c..d19dceb 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 @@ -10,12 +10,12 @@ import com.casic.missiles.modular.dto.StaffInfoRequest; import com.casic.missiles.modular.dto.hik.PersonBatchDeleteRequest; import com.casic.missiles.modular.dto.hik.PersonSingleAddOrUpdateRequest; +import com.casic.missiles.modular.dto.hik.StaffCardRequest; import com.casic.missiles.modular.enums.HikUri; import com.casic.missiles.modular.enums.SecurityEventDict; import com.casic.missiles.modular.model.DeviceInfo; import com.casic.missiles.modular.model.StaffInfo; import com.casic.missiles.modular.service.StaffInfoService; -import com.casic.missiles.modular.system.service.ICasicFileService; import com.casic.missiles.modular.util.Base64Util; import com.casic.missiles.modular.util.HikUtil; import lombok.extern.slf4j.Slf4j; @@ -51,9 +51,6 @@ @Resource private Validator validator; - @Resource - private ICasicFileService fileService; - @Value("${casic.file.uploadPath}") private String uploadPath; @@ -80,8 +77,6 @@ if(!Objects.isNull(staff)){ return ResponseData.error("数据已存在"); } - String picUrl = fileService.saveFile(staffInfo.getPicture()); - staffInfo.setPicture(picUrl); //添加人员到海康 PersonSingleAddOrUpdateRequest personSingleAddOrUpdateRequest = new PersonSingleAddOrUpdateRequest(); @@ -117,9 +112,6 @@ @Override @Transactional(rollbackFor = Exception.class) public Object updateStaffInfo(StaffInfo staffInfo) { - String picUrl = fileService.saveFile(staffInfo.getPicture()); - staffInfo.setPicture(picUrl); - //修改人员到海康 PersonSingleAddOrUpdateRequest personSingleAddOrUpdateRequest = new PersonSingleAddOrUpdateRequest(); personSingleAddOrUpdateRequest.setPersonId(staffInfo.getStaffCode()); @@ -162,7 +154,13 @@ String body = JSONObject.toJSONString(personBatchDeleteRequest); String resultStr = HikUtil.hikApi(HikUri.PERSON_BATCH_DELETE, body); JSONObject resultJson = (JSONObject)JSONObject.parse(resultStr); - if (!"0".equals(resultJson.get("code"))) { + //人脸要单独删除 + PersonBatchDeleteRequest personBatchDeleteRequest2 = new PersonBatchDeleteRequest(); + personBatchDeleteRequest2.setFaceId(staffInfo.getStaffFaceId()); + String body2 = JSONObject.toJSONString(personBatchDeleteRequest2); + String resultStr2 = HikUtil.hikApi(HikUri.PERSON_SINGLE_DELETE, body2); + JSONObject resultJson2 = (JSONObject)JSONObject.parse(resultStr2); + if (!"0".equals(resultJson.get("code")) && !"0".equals(resultJson2.get("code")) ) { log.error("请求海康,单个删除人员失败,海康response:{}", resultStr); return ResponseData.error("单个删除人员失败"); } @@ -269,4 +267,21 @@ } return null; } + + @Override + @Transactional(rollbackFor = Exception.class) + public int saveCardInfo(StaffCardRequest staffCardRequest) { + List numFlag = new ArrayList<>(); + staffCardRequest.getCardList().forEach(cardInfo -> { + String staffCode = cardInfo.getPersonId(); + String cardNo = cardInfo.getCardNo(); + if(staffInfoMapper.updateByCodeForCard(staffCode, cardNo) > 0){ + numFlag.add(cardNo); + } + }); + if(staffCardRequest.getCardList().size() != numFlag.size()){ + return 0; + } + return 1; + } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/service/impl/VisitorApplyServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/service/impl/VisitorApplyServiceImpl.java index 497003a..b219984 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/service/impl/VisitorApplyServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/service/impl/VisitorApplyServiceImpl.java @@ -74,9 +74,9 @@ AppointmentFreeRegisterRequest appointmentFreeRegisterRequest = new AppointmentFreeRegisterRequest(); //将时间转换为海康ISO8601格式 DateTime inTimeDate = DateUtil.parse(visitorApply.getInTime()); - String inTimeISODate = DateUtil.format(inTimeDate, "yyyy-MM-dd'T'HH:mm:ss'Z'"); + String inTimeISODate = DateUtil.format(inTimeDate, "yyyy-MM-dd'T'HH:mm:ssXXX"); DateTime outTimeDate = DateUtil.parse(visitorApply.getOutTime()); - String outTimeISODate = DateUtil.format(outTimeDate, "yyyy-MM-dd'T'HH:mm:ss'Z'"); + String outTimeISODate = DateUtil.format(outTimeDate, "yyyy-MM-dd'T'HH:mm:ssXXX"); //海康员工唯一标识receptionistId就是我们录入的到海康的员工号 appointmentFreeRegisterRequest.setReceptionistId(visitorApply.getStaffCode()); appointmentFreeRegisterRequest.setPersonNum(1); @@ -86,7 +86,7 @@ VisitorInfo visitorInfo = new VisitorInfo(); visitorInfo.setVisitorName(visitorApply.getVisitorName()); - visitorInfo.setGender(visitorApply.getVisitorGender()); + visitorInfo.setGender(Integer.valueOf(visitorApply.getVisitorGender())); visitorInfo.setPhoneNo(visitorApply.getVisitorPhone()); visitorInfo.setCertificateNo(visitorApply.getIdCard()); visitorInfo.setCertificateType(111); @@ -121,15 +121,15 @@ appointmentFreeRegisterRequest.setAppointRecordId(visitorApply1.getAppointRecordId()); appointmentFreeRegisterRequest.setReceptionistId(visitorApply1.getStaffCode()); DateTime inTimeDate = DateUtil.parse(visitorApply.getInTime()); - String inTimeISODate = DateUtil.format(inTimeDate, "yyyy-MM-dd'T'HH:mm:ss'Z'"); + String inTimeISODate = DateUtil.format(inTimeDate, "yyyy-MM-dd'T'HH:mm:ssXXX"); DateTime outTimeDate = DateUtil.parse(visitorApply.getOutTime()); - String outTimeISODate = DateUtil.format(outTimeDate, "yyyy-MM-dd'T'HH:mm:ss'Z'"); + String outTimeISODate = DateUtil.format(outTimeDate, "yyyy-MM-dd'T'HH:mm:ssXXX"); appointmentFreeRegisterRequest.setVisitStartTime(inTimeISODate); appointmentFreeRegisterRequest.setVisitEndTime(outTimeISODate); appointmentFreeRegisterRequest.setVisitPurpose(visitorApply.getVisitReason()); VisitorInfo visitorInfo = new VisitorInfo(); visitorInfo.setVisitorName(visitorApply.getVisitorName()); - visitorInfo.setGender(visitorApply.getVisitorGender()); + visitorInfo.setGender(Integer.valueOf(visitorApply.getVisitorGender())); visitorInfo.setPhoneNo(visitorApply.getVisitorPhone()); visitorInfo.setCertificateNo(visitorApply.getIdCard()); visitorInfo.setCertificateType(111); @@ -236,9 +236,9 @@ } } DateTime inTimeDate = DateUtil.parse(busConcentrator.getInTime()); - String inTimeISODate = DateUtil.format(inTimeDate, "yyyy-MM-dd'T'HH:mm:ss'Z'"); + String inTimeISODate = DateUtil.format(inTimeDate, "yyyy-MM-dd'T'HH:mm:ssXXX"); DateTime outTimeDate = DateUtil.parse(busConcentrator.getOutTime()); - String outTimeISODate = DateUtil.format(outTimeDate, "yyyy-MM-dd'T'HH:mm:ss'Z'"); + String outTimeISODate = DateUtil.format(outTimeDate, "yyyy-MM-dd'T'HH:mm:ssXXX"); AppointmentFreeRegisterRequest appointmentFreeRegisterRequest = new AppointmentFreeRegisterRequest(); appointmentFreeRegisterRequest.setReceptionistId(busConcentrator.getStaffCode()); appointmentFreeRegisterRequest.setPersonNum(1); @@ -247,7 +247,7 @@ appointmentFreeRegisterRequest.setVisitPurpose(busConcentrator.getVisitReason()); VisitorInfo visitorInfo = new VisitorInfo(); visitorInfo.setVisitorName(busConcentrator.getVisitorName()); - visitorInfo.setGender(busConcentrator.getVisitorGender()); + visitorInfo.setGender(Integer.valueOf(busConcentrator.getVisitorGender())); visitorInfo.setPhoneNo(busConcentrator.getVisitorPhone()); visitorInfo.setCertificateNo(busConcentrator.getIdCard()); visitorInfo.setCertificateType(111); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/util/ArtemisFor302Util.java b/casic-server/src/main/java/com/casic/missiles/modular/util/ArtemisFor302Util.java new file mode 100644 index 0000000..4edb075 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/util/ArtemisFor302Util.java @@ -0,0 +1,65 @@ +package com.casic.missiles.modular.util; + +import com.hikvision.artemis.sdk.Client; +import com.hikvision.artemis.sdk.Request; +import com.hikvision.artemis.sdk.Response; +import com.hikvision.artemis.sdk.config.ArtemisConfig; +import com.hikvision.artemis.sdk.constant.Constants; +import com.hikvision.artemis.sdk.enums.Method; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.apache.http.HttpHeaders; + +import java.util.HashMap; +import java.util.Map; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/29 20:25 + */ +@Slf4j +public class ArtemisFor302Util { + + public static String doPostStringArtemis(Map path, String body, Map querys, String accept, String contentType, Map header) { + String httpSchema = (String)path.keySet().toArray()[0]; + if (httpSchema != null && !StringUtils.isEmpty(httpSchema)) { + String responseStr = null; + + try { + Map headers = new HashMap(); + if (StringUtils.isNotBlank(accept)) { + headers.put("Accept", accept); + } else { + headers.put("Accept", "*/*"); + } + + if (StringUtils.isNotBlank(contentType)) { + headers.put("Content-Type", contentType); + } else { + headers.put("Content-Type", "application/text;charset=UTF-8"); + } + + if (header != null) { + headers.putAll(header); + } + + Request request = new Request(Method.POST_STRING, httpSchema + ArtemisConfig.host, (String)path.get(httpSchema), ArtemisConfig.appKey, ArtemisConfig.appSecret, Constants.DEFAULT_TIMEOUT); + request.setHeaders(headers); + request.setQuerys(querys); + request.setStringBody(body); + Response response = Client.execute(request); + int statusCode = response.getStatusCode(); + if(statusCode == 302){ + return response.getHeader((HttpHeaders.LOCATION)); + } + + } catch (Exception var11) { + log.error("the Artemis PostString Request is failed, exception:{}", var11.getMessage()); + } + return responseStr; + } else { + throw new RuntimeException("http和https参数错误httpSchema: " + httpSchema); + } + } +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/util/CaseInfoFactoryUtil.java b/casic-server/src/main/java/com/casic/missiles/modular/util/CaseInfoFactoryUtil.java index bde56a9..74da5ea 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/util/CaseInfoFactoryUtil.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/util/CaseInfoFactoryUtil.java @@ -10,6 +10,7 @@ import org.springframework.stereotype.Component; import javax.annotation.Resource; +import java.util.Objects; /** * @Description: 安防事件工厂类 @@ -27,9 +28,12 @@ @Resource private CategoryLevelMapper categoryLevelMapper; - public CaseInfo getCaseInfo(Long eventType) { + public CaseInfo getCaseInfo(Number eventType) { //获取海康事件定义 HikCaseDefine hikCaseDefine = hikCaseDefineMapper.getHikCaseDefine(eventType); + if(Objects.isNull(hikCaseDefine)){ + return null; + } //不同事件类别对事件封装为可入库事件 CaseInfo caseInfo = new CaseInfo(); caseInfo.setHazardLevelCode(hikCaseDefine.getHazardLevelCode()); //危险级别code @@ -39,6 +43,7 @@ caseInfo.setCategoryLevelCode(hikCaseDefine.getCategoryLevelCode()); //事件类别code CaseCategoryLevel categoryLevel = categoryLevelMapper.getCaseCategoryLevel(hikCaseDefine.getCategoryLevelCode()); caseInfo.setTypeName(categoryLevel.getName()); //事件类别 + caseInfo.setHikEventType(hikCaseDefine.getCaseTypeCode()); return caseInfo; } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/BlackListController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/BlackListController.java index a27f9f8..0c06661 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/BlackListController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/BlackListController.java @@ -1,13 +1,18 @@ package com.casic.missiles.modular.controller; +import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.base.controller.ExportController; import com.casic.missiles.core.page.PageFactory; import com.casic.missiles.model.response.ResponseData; import com.casic.missiles.modular.dto.BlackInfoRequest; +import com.casic.missiles.modular.dto.BlackPictureRequest; +import com.casic.missiles.modular.dto.hik.PersonInfoRequest; +import com.casic.missiles.modular.enums.HikUri; import com.casic.missiles.modular.enums.OperateTypeEnum; import com.casic.missiles.modular.model.BlackInfo; import com.casic.missiles.modular.service.BlackInfoService; +import com.casic.missiles.modular.util.HikUtil; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; @@ -56,4 +61,22 @@ return null; } + /** + * 黑名单人员照片 + */ + @PostMapping("/personPicture") + @ResponseBody + public Object personPicture(@RequestBody BlackPictureRequest blackPictureRequest){ + //获取照片 + String picUri = blackPictureRequest.getPicUri(); + String serverIndexCode = blackPictureRequest.getServerIndexCode(); + PersonInfoRequest picRequest = new PersonInfoRequest(); + picRequest.setPicUri(picUri); + picRequest.setServerIndexCode(serverIndexCode); + String reBody = JSONObject.toJSONString(picRequest); + //重定向地址获取 + String url = HikUtil.hikApiFor302(HikUri.PERSON_PICTURE, reBody); + return ResponseData.success(url); + } + } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/DeviceController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/DeviceController.java index e1c4eba..666bbee 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/DeviceController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/DeviceController.java @@ -107,7 +107,7 @@ } /** - * 设备维修管理查询(分页),需计算MTTR=总维修时间/故障次数 + * 设备状态计算与评判/设备维修管理查询(分页),需计算MTTR=总维修时间/故障次数 */ @PostMapping("/repair/listPage") @ResponseBody @@ -211,7 +211,7 @@ //需根据设备编号获取到对应的门禁点唯一标识 doorControlRequest.setDoorIndexCodes(indexCodes); doorControlRequest.setControlType(Integer.valueOf(gateGroupDTO.getStatus())); - String body = JSONObject.toJSONString(deviceCodes); + String body = JSONObject.toJSONString(doorControlRequest); String resultStr = HikUtil.hikApi(HikUri.DOOR_CONTROL, body); JSONObject resultJson = (JSONObject)JSONObject.parse(resultStr); if (!"0".equals(resultJson.get("code"))) { diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/StaffController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/StaffController.java index b58ccab..704093c 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/StaffController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/StaffController.java @@ -2,15 +2,21 @@ import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.util.StrUtil; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.base.controller.ExportController; import com.casic.missiles.core.page.PageFactory; import com.casic.missiles.model.response.ErrorResponseData; import com.casic.missiles.model.response.ResponseData; import com.casic.missiles.modular.dto.StaffInfoRequest; +import com.casic.missiles.modular.dto.hik.PersonInfoRequest; +import com.casic.missiles.modular.dto.hik.StaffCardRequest; +import com.casic.missiles.modular.enums.HikUri; import com.casic.missiles.modular.enums.OperateTypeEnum; import com.casic.missiles.modular.model.StaffInfo; import com.casic.missiles.modular.service.StaffInfoService; +import com.casic.missiles.modular.util.HikUtil; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; @@ -110,4 +116,60 @@ } return ResponseData.success(); } + + /** + * 批量开卡,添加人员之后调用,若在一个接口中添加人员成功开卡失败则第二次添加时会有问题 + */ + @PostMapping("/cardBinding") + @ResponseBody + public Object cardBinding(@RequestBody StaffCardRequest staffCardRequest) { + String body = JSONObject.toJSONString(staffCardRequest); + String resultStr = HikUtil.hikApi(HikUri.CARD_BINDING, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (!"0".equals(resultJson.get("code"))) { + log.error("请求海康,批量开卡失败,海康response:{}", resultStr); + return ResponseData.error("批量开卡失败"); + } + //保存卡号 + if(staffInfoService.saveCardInfo(staffCardRequest) > 0){ + return ResponseData.success(); + } + return ResponseData.error("批量开卡失败"); + } + + /** + * 获取员工照片,海康存储 + */ + @PostMapping("/personPicture/{staffCode}") + @ResponseBody + public Object personPicture(@PathVariable("staffCode") String staffCode){ + //获取员工详细信息,含图片服务器、uri + PersonInfoRequest request = new PersonInfoRequest(); + List list = new ArrayList<>(); + list.add(staffCode); + request.setParamName("personId"); + request.setParamValue(list); + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi(HikUri.PERSON_INFO, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (!"0".equals(resultJson.get("code"))) { + log.error("请求海康,根据人员唯一字段获取人员详细信息失败,海康response:{}", resultStr); + return ResponseData.error("获取员工照片失败"); + } + //获取照片 + JSONObject data = (JSONObject) resultJson.get("data"); + JSONArray dataArray = (JSONArray) data.get("list"); + JSONObject jsonObject = (JSONObject) dataArray.get(0); + JSONArray personPhoto = (JSONArray) jsonObject.get("personPhoto"); + JSONObject photo = (JSONObject) personPhoto.get(0); + String picUri = photo.getString("picUri"); + String serverIndexCode = photo.getString("serverIndexCode"); + PersonInfoRequest picRequest = new PersonInfoRequest(); + picRequest.setPicUri(picUri); + picRequest.setServerIndexCode(serverIndexCode); + String reBody = JSONObject.toJSONString(picRequest); + //重定向地址获取 + String url = HikUtil.hikApiFor302(HikUri.PERSON_PICTURE, reBody); + return ResponseData.success(url); + } } 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 4a07dd9..7b1dcf6 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 @@ -16,6 +16,7 @@ import com.casic.missiles.modular.redis.key.CacheKeys; import com.casic.missiles.modular.service.CockpitService; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.util.CollectionUtils; import org.springframework.web.bind.annotation.*; @@ -24,10 +25,7 @@ import java.text.NumberFormat; import java.time.LocalDateTime; import java.time.temporal.ChronoUnit; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.util.*; import java.util.stream.Collectors; /** @@ -73,6 +71,9 @@ private StatisticNumberMapper numberMapper; @Autowired + private HazardLevelMapper hazardLevelMapper; + + @Autowired private AccessGroupConfig accessGroupConfig; /** @@ -104,8 +105,24 @@ public Object buildingNumberPerHour(){ //当天按小时分组的人数 List list = numberMapper.selectListByTime(); - Map> collect = list.stream().collect(Collectors.groupingBy(BuildingNumberDTO::getStatisticPosition)); - return ResponseData.success(collect); + Map> collect = list.stream().collect(Collectors.groupingBy(BuildingNumberDTO::getStatisticTime)); + //定时任务中已将每小时三栋楼人数存到数据库 + //将一期主楼和录制楼人数合并,二期单算 + List> resultList = new ArrayList<>(); + collect.keySet().forEach(key -> { + List buildingNumberDTOS = collect.get(key); + BuildingNumberDTO mainBuildingOne = buildingNumberDTOS.get(0); + BuildingNumberDTO mainBuildingTwo = buildingNumberDTOS.get(1); + BuildingNumberDTO recordingBuilding = buildingNumberDTOS.get(2); + HashMap resultMap = new HashMap<>(); + Integer oneQuantity = Integer.valueOf(mainBuildingOne.getStatisticQuantity()); + Integer recordingQuantity = Integer.valueOf(recordingBuilding.getStatisticQuantity()); + resultMap.put("staticTime", mainBuildingOne.getStatisticTime()); + resultMap.put(mainBuildingOne.getStatisticPositionName()+"、"+recordingBuilding.getStatisticPositionName(), String.valueOf(oneQuantity+recordingQuantity)); + resultMap.put(mainBuildingTwo.getStatisticPositionName(), mainBuildingTwo.getStatisticQuantity()); + resultList.add(resultMap); + }); + return ResponseData.success(resultList); } /** @@ -151,12 +168,11 @@ public Object securityNumber() { QueryWrapper wrapper = new QueryWrapper<>(); wrapper.eq("staff_type", 2); + // TODO: 2022/9/2 后续使用产品确定的每天出勤的安保人员的数量 Integer total = staffInfoMapper.selectCount(wrapper); - //当日离岗事件个数 - QueryWrapper wrapper1 = new QueryWrapper<>(); - wrapper1.eq("hik_event_type", SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); - wrapper1.apply("date_format(now(),'%Y-%m-%d') = date_format(happen_time,'%Y-%m-%d')"); - Integer leave = caseInfoMapper.selectCount(wrapper1); + //当日离岗事件按设备去重后的个数 + // TODO: 2022/9/2 目前相当于24小时内的计算,之后看需要可改成自定义小时数计算离岗率,即离岗+6小时内仅一次离岗则恢复为100%,多次则累加离岗次数计算离岗率 + Integer leave = caseInfoMapper.selectDemobilizedCount(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); NumberFormat numberFormat = NumberFormat.getInstance(); // 设置精确到小数点后2位 numberFormat.setMaximumFractionDigits(2); @@ -179,7 +195,6 @@ @ResponseBody public Object visitorApplyDetail() { List reasonGroup = applyMapper.selectByVisitReason(); - HashMap resultMap = new HashMap<>(); NumberFormat numberFormat = NumberFormat.getInstance(); // 设置精确到小数点后2位 numberFormat.setMaximumFractionDigits(2); @@ -187,12 +202,17 @@ if(0 == sum){ return ResponseData.success(); } + List resultList = new ArrayList<>(); reasonGroup.forEach(group -> { String reasonName = dictService.getDictNameByCode(SecurityEventDict.VISIT_REASON, group.getVisitReason()); String result = numberFormat.format((float) group.getQuantity() / (float) sum * 100); - resultMap.put(reasonName, result+"%"); + ApplyReasonGroupDTO applyReasonGroupDTO = new ApplyReasonGroupDTO(); + applyReasonGroupDTO.setQuantity(group.getQuantity()); + applyReasonGroupDTO.setVisitReason(reasonName); + applyReasonGroupDTO.setRatio(result+"%"); + resultList.add(applyReasonGroupDTO); }); - return ResponseData.success(resultMap); + return ResponseData.success(resultList); } /** @@ -247,6 +267,32 @@ } /** + * 机动力量实时在岗率,在岗人数除以总应在岗人数,用离岗+6小时内恢复为100%,6小时外再计算 + */ + @GetMapping("/staff/beOnDutyRatio") + @ResponseBody + public Object beOnDutyRatio() { + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("staff_type", 2); + // TODO: 2022/9/2 后续使用产品确定的每天出勤的安保人员的数量 + Integer total = staffInfoMapper.selectCount(wrapper); + if(0 == total){ + return ResponseData.success(null); + } + //当日离岗事件按设备去重后的个数 + // TODO: 2022/9/2 目前相当于24小时内的计算,之后看需要可改成自定义小时数计算离岗率,即离岗+6小时内仅一次离岗则恢复为100%,多次则累加离岗次数计算离岗率 + List onDutyRatioDTOS = caseInfoMapper.selectDemobilizedCountByHour(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); + onDutyRatioDTOS.forEach(dto -> { + NumberFormat numberFormat = NumberFormat.getInstance(); + // 设置精确到小数点后2位 + numberFormat.setMaximumFractionDigits(2); + String result = numberFormat.format(100 - Float.valueOf(dto.getQuantity()) / (float) total * 100); + dto.setRatio(result+"%"); + }); + return ResponseData.success(onDutyRatioDTOS); + } + + /** * 闸机速通门统计-设备状态分组计算数量,devType传闸机字典key * 视频频监控摄像机统计-设备状态分组计算数量,devType传摄像头字典key */ @@ -262,12 +308,17 @@ if(sum <= 0){ return ResponseData.error("无该类设备信息"); } + List resultList = new ArrayList<>(); gateStatusGroup.forEach(group -> { String devStatus = dictService.getDictNameByCode(SecurityEventDict.DEVICE_STATUS, group.getStatus()); String result = numberFormat.format((float) group.getQuantity() / (float) sum * 100); - resultMap.put(devStatus, result+"%"); + GateStatusGroupResponse gateStatusGroupResponse = new GateStatusGroupResponse(); + gateStatusGroupResponse.setStatus(devStatus); + gateStatusGroupResponse.setRatio(result+"%"); + resultList.add(gateStatusGroupResponse); }); - resultMap.put("总", sum); + resultMap.put("total", sum); + resultMap.put("list", resultList); return ResponseData.success(resultMap); } @@ -282,17 +333,38 @@ String position = securityScoreDTO.getPosition(); List caseInfos = caseInfoMapper.selectByPosition(position); //查询各危险级别权重、各类别权重,放入map,避免循环中多次查数据库 - + HashMap hazardScoreMap = new HashMap<>(); + List caseHazardLevelList = hazardLevelMapper.getCaseHazardLevelList(null); + caseHazardLevelList.forEach(hazardLevel -> { + hazardScoreMap.put(hazardLevel.getCode(), hazardLevel.getWeight()); + }); + HashMap categoryScoreMap = new HashMap<>(); + List categoryLevelList = categoryLevelMapper.getCaseCategoryLevelList(null); + categoryLevelList.forEach(categoryLevel -> { + categoryScoreMap.put(categoryLevel.getCode(), categoryLevel.getWeight()); + }); + //事件按楼层分组,计算 List securityScoreDTOs = new ArrayList<>(); caseInfos.forEach(caseInfo -> { SecurityScoreDTO securityScoreDTO1 = new SecurityScoreDTO(); + securityScoreDTO1.setPosition(caseInfo.getPosition()); securityScoreDTO1.setArea(caseInfo.getArea()); - // TODO: 2022/8/4 楼层评分计算根据产品定义调整 -// caseInfo.get -// securityScoreDTO1.setScore(); + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); + Double score = 100 - Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + securityScoreDTO1.setScore(score); + securityScoreDTOs.add(securityScoreDTO1); }); - - return null; + 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); + }); + return ResponseData.success(securityScoreDTOs); } /** @@ -303,9 +375,13 @@ public Object SecurityFrequency(@RequestBody SecurityFrequencyDTO securityFrequencyDTO) { String year = securityFrequencyDTO.getYear(); String month = securityFrequencyDTO.getMonth(); - Integer quantity = caseInfoMapper.selectCountByMonth(year, month); - securityFrequencyDTO.setQuantity(quantity); - return ResponseData.success(securityFrequencyDTO); + if(!StringUtils.isEmpty(year) && StringUtils.isEmpty(month)){ + Integer quantity = caseInfoMapper.selectCountByMonth(year, month); + securityFrequencyDTO.setQuantity(quantity); + return ResponseData.success(securityFrequencyDTO); + } + List list = caseInfoMapper.selectPreMonthCount(); + return ResponseData.success(list); } } 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 ae4d770..f4f075c 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 @@ -1,20 +1,25 @@ package com.casic.missiles.modular.controller.cockpit; +import cn.hutool.core.date.DateUnit; import cn.hutool.core.date.DateUtil; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.casic.missiles.model.response.ResponseData; -import com.casic.missiles.modular.dao.AttendanceInfoMapper; -import com.casic.missiles.modular.dao.CaseInfoMapper; -import com.casic.missiles.modular.dao.HazardLevelMapper; -import com.casic.missiles.modular.dao.StaffInfoMapper; +import com.casic.missiles.modular.dao.*; +import com.casic.missiles.modular.dto.DeviceRepairLogDTO; +import com.casic.missiles.modular.dto.DeviceRepairRequest; import com.casic.missiles.modular.dto.statistics.*; +import com.casic.missiles.modular.enums.SecurityEventType; +import com.casic.missiles.modular.model.CaseCategoryLevel; import com.casic.missiles.modular.model.CaseHazardLevel; +import com.casic.missiles.modular.model.CaseInfo; import com.casic.missiles.modular.model.StaffInfo; +import com.casic.missiles.modular.service.DeviceInfoService; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.util.CollectionUtils; import org.springframework.web.bind.annotation.*; +import java.math.BigDecimal; import java.text.NumberFormat; import java.util.*; import java.util.stream.Collectors; @@ -40,6 +45,12 @@ @Autowired private HazardLevelMapper hazardLevelMapper; + @Autowired + private CategoryLevelMapper categoryLevelMapper; + + @Autowired + private DeviceInfoService deviceInfoService; + /** * 安防事件时域频次统计,每月的每天安防事件个数(原方案) * 月维度:展示每个月的每天的数据 @@ -89,15 +100,17 @@ List monthList = caseInfoMapper.selectPreMonthCountByYear(year); Map> collect = monthList.stream().collect(Collectors.groupingBy(PreMonthOrWeekCaseDTO::getHazardLevelCode)); HashMap strAvgMap = new HashMap<>(); + List resultList = new ArrayList<>(); for (String key : collect.keySet()) { List preMonthOrWeekCaseDTOS = collect.get(key); int sum = preMonthOrWeekCaseDTOS.stream().mapToInt(PreMonthOrWeekCaseDTO::getQuantity).sum(); //若年份是本年,则使用个安防级别数量/当前月份数 //若不是本年,除数为12 MonthAndWeekDTO monthAndWeekDTO = new MonthAndWeekDTO(); + String hazardName = hazardLevelMapper.selectHazardNameByCode(key); + monthAndWeekDTO.setLevelName(hazardName); if(year.equals(String.valueOf(DateUtil.thisYear()))){ monthAndWeekDTO.setMonthQuantity(sum / DateUtil.thisMonth()); -// monthAndWeekDTO.setLevelName(); strAvgMap.put(key, monthAndWeekDTO); }else{ monthAndWeekDTO.setMonthQuantity(sum / 12); @@ -113,27 +126,37 @@ if(year.equals(String.valueOf(DateUtil.thisYear()))){ if(!Objects.isNull(strAvgMap.get(key))){ MonthAndWeekDTO monthAndWeekDTO = strAvgMap.get(key); + String hazardName = hazardLevelMapper.selectHazardNameByCode(key); + monthAndWeekDTO.setLevelName(hazardName); monthAndWeekDTO.setWeekQuantity(sum / DateUtil.thisWeekOfYear()); strAvgMap.put(key, monthAndWeekDTO); }else{ MonthAndWeekDTO monthAndWeekDTO = new MonthAndWeekDTO(); + String hazardName = hazardLevelMapper.selectHazardNameByCode(key); + monthAndWeekDTO.setLevelName(hazardName); monthAndWeekDTO.setWeekQuantity(sum / DateUtil.thisWeekOfYear()); strAvgMap.put(key, monthAndWeekDTO); } }else{ if(!Objects.isNull(strAvgMap.get(key))){ MonthAndWeekDTO monthAndWeekDTO = strAvgMap.get(key); + String hazardName = hazardLevelMapper.selectHazardNameByCode(key); + monthAndWeekDTO.setLevelName(hazardName); monthAndWeekDTO.setWeekQuantity(sum / 52); strAvgMap.put(key, monthAndWeekDTO); }else{ MonthAndWeekDTO monthAndWeekDTO = new MonthAndWeekDTO(); + String hazardName = hazardLevelMapper.selectHazardNameByCode(key); + monthAndWeekDTO.setLevelName(hazardName); monthAndWeekDTO.setWeekQuantity(sum / 52); strAvgMap.put(key, monthAndWeekDTO); } } } - avgMonthAndWeekGroupDTO.setMap(strAvgMap); - return ResponseData.success(avgMonthAndWeekGroupDTO); + strAvgMap.keySet().forEach(key -> { + resultList.add(strAvgMap.get(key)); + }); + return ResponseData.success(resultList); } /** @@ -181,12 +204,178 @@ } /** - * 员工考勤人数变化,功能待定 + * 员工考勤人数变化,统计当天(横坐标为时)及近7天(横坐标为天)的考勤人数变化,只要发生一次考勤识别,次数的基数就正常增加(没有上班下班区分) */ + @PostMapping("/staff/attendanceNumber/{dimension}") + @ResponseBody + public Object attendanceNumber(@PathVariable("dimension") String dimension) { + List attendanceNumberDTOs = null; + List> resultList = new ArrayList<>(); + if("week".equals(dimension)){ + //近7天数据按天分组统计 + attendanceNumberDTOs = attendanceInfoMapper.getCountForWeek(); + }else if("day".equals(dimension)) { + //今天数据按小时分组统计 + attendanceNumberDTOs = attendanceInfoMapper.getCountForDay(); + } + if(CollectionUtils.isEmpty(attendanceNumberDTOs)){ + return ResponseData.error("该查询条件下,无员工出勤数据!"); + } + Map> collect = attendanceNumberDTOs.stream().collect(Collectors.groupingBy(AttendanceNumberDTO::getDate)); + collect.keySet().forEach(key -> { + List attendanceNumberDTOS = collect.get(key); + AttendanceNumberDTO attendanceNumberDTO = attendanceNumberDTOS.get(0); + AttendanceNumberDTO attendanceNumberDTO2 = attendanceNumberDTOS.get(1); + Map resultMap = new HashMap<>(); + resultMap.put(attendanceNumberDTO.getStaffType(), attendanceNumberDTO.getQuantity()); + resultMap.put(attendanceNumberDTO2.getStaffType(), attendanceNumberDTO2.getQuantity()); + resultMap.put("staticTime", attendanceNumberDTO.getDate()); + resultList.add(resultMap); + }); + return ResponseData.success(resultList); + } /** - * 近30天/近一周安保人员到岗排行 + * 早晚高峰区域安防评估 */ + @PostMapping("/security/assessment/{dimension}") + @ResponseBody + public Object securityAssessment(@PathVariable("dimension") String dimension) { + //查询各危险级别权重、各类别权重,放入map,避免循环中多次查数据库 + HashMap hazardScoreMap = new HashMap<>(); + List caseHazardLevelList = hazardLevelMapper.getCaseHazardLevelList(null); + caseHazardLevelList.forEach(hazardLevel -> { + hazardScoreMap.put(hazardLevel.getCode(), hazardLevel.getWeight()); + }); + HashMap categoryScoreMap = new HashMap<>(); + List categoryLevelList = categoryLevelMapper.getCaseCategoryLevelList(null); + categoryLevelList.forEach(categoryLevel -> { + categoryScoreMap.put(categoryLevel.getCode(), categoryLevel.getWeight()); + }); + HashMap hashMap = new HashMap<>(); + if("week".equals(dimension)){ + //近7天早晚高峰数据 + List caseInfos = caseInfoMapper.selectListBySevenDay(); + //按时间(天)进行分组 + caseInfos.forEach(caseInfo -> { + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); + Double score = Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + String[] array = caseInfo.getHappenTime().split(" "); + String dayTime = array[0]; + BigDecimal preScore; + if(hashMap.containsKey(dayTime)){ + Double aDouble = hashMap.get(dayTime); + preScore = new BigDecimal(aDouble.toString()); + + }else{ + preScore = new BigDecimal("100.0"); + } + BigDecimal nowScore = new BigDecimal(score.toString()); + hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); + }); + return ResponseData.success(hashMap); + }else if("day".equals(dimension)) { + //今天数据按小时分组统计 + List caseInfos = caseInfoMapper.selectListByToday(); + caseInfos.forEach(caseInfo -> { + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); + Double score = Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + String[] array = caseInfo.getHappenTime().split(":"); + String dayTime = array[0]; + BigDecimal preScore; + if(hashMap.containsKey(dayTime)){ + Double aDouble = hashMap.get(dayTime); + preScore = new BigDecimal(aDouble.toString()); + + }else{ + preScore = new BigDecimal("100.0"); + } + BigDecimal nowScore = new BigDecimal(score.toString()); + hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); + }); + return ResponseData.success(hashMap); + } + return null; + } + + /** + * 重点区域安防事态评估,统计重点区域6:00-23:00按小时分组数据 + */ + @GetMapping("/security/keyAreaStatistic") + @ResponseBody + public Object keyAreaStatistic() { + //查询各危险级别权重、各类别权重,放入map,避免循环中多次查数据库 + HashMap hazardScoreMap = new HashMap<>(); + List caseHazardLevelList = hazardLevelMapper.getCaseHazardLevelList(null); + caseHazardLevelList.forEach(hazardLevel -> { + hazardScoreMap.put(hazardLevel.getCode(), hazardLevel.getWeight()); + }); + HashMap categoryScoreMap = new HashMap<>(); + List categoryLevelList = categoryLevelMapper.getCaseCategoryLevelList(null); + categoryLevelList.forEach(categoryLevel -> { + categoryScoreMap.put(categoryLevel.getCode(), categoryLevel.getWeight()); + }); + HashMap hashMap = new HashMap<>(); + //今天数据按小时分组统计 + List caseInfos = caseInfoMapper.selectListByToday2(); + caseInfos.forEach(caseInfo -> { + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); + Double score = Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + String[] array = caseInfo.getHappenTime().split(":"); + String dayTime = array[0]; + BigDecimal preScore; + if(hashMap.containsKey(dayTime)){ + Double aDouble = hashMap.get(dayTime); + preScore = new BigDecimal(aDouble.toString()); + + }else{ + preScore = new BigDecimal("100.0"); + } + BigDecimal nowScore = new BigDecimal(score.toString()); + hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); + }); + return ResponseData.success(hashMap); + } + + /** + * 安防机动支援力量调配响应评估,根据事件已解决状态及已解决时间-发送时间,按时间(小时)分组统计 + */ + @GetMapping("/security/responseAssess") + @ResponseBody + public Object responseAssess() { + //查询各危险级别权重、各类别权重,放入map,避免循环中多次查数据库 + HashMap hazardScoreMap = new HashMap<>(); + List caseHazardLevelList = hazardLevelMapper.getCaseHazardLevelList(null); + caseHazardLevelList.forEach(hazardLevel -> { + hazardScoreMap.put(hazardLevel.getCode(), hazardLevel.getWeight()); + }); + HashMap hashMap = new HashMap<>(); + //今天数据按小时分组统计 + List caseInfos = caseInfoMapper.selectListByToday3(); + caseInfos.forEach(caseInfo -> { + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + //扣分=事件级别权重*未解决小时数 + Date updateTime = DateUtil.parse(caseInfo.getUpdateTime()); + Date happenTime = DateUtil.parse(caseInfo.getHappenTime()); + long between = DateUtil.between(updateTime, happenTime, DateUnit.HOUR); + Double score = Double.valueOf(hazardWeight)*between; + String[] array = caseInfo.getHappenTime().split(":"); + String dayTime = array[0]; + BigDecimal preScore; + if(hashMap.containsKey(dayTime)){ + Double aDouble = hashMap.get(dayTime); + preScore = new BigDecimal(aDouble.toString()); + }else{ + preScore = new BigDecimal("100.0"); + } + BigDecimal nowScore = new BigDecimal(score.toString()); + hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); + }); + return ResponseData.success(hashMap); + } /** * 重点区域威胁事件类型统计,优先级2,统计近7天和近30天 @@ -224,7 +413,34 @@ } /** - * 设备状态计算系数和评判,优先级3,需确认设备恢复时间是否可以获取 + * 近30天/近一周安保人员到岗排行 */ + + /** + * 安保等级评估,发生离岗事件减1分 + */ + @GetMapping("/security/levelAssess") + @ResponseBody + public Object securityLevelAssess() { + //今天数据按小时分组统计 + List resultList = caseInfoMapper.selectListByType(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); + resultList.forEach(result -> { + BigDecimal deScore = new BigDecimal(result.getQuantity()); + BigDecimal preScore = new BigDecimal("100.0"); + result.setScore(preScore.subtract(deScore).doubleValue()); + }); + return ResponseData.success(resultList); + } + + /** + * 设备状态计算系数和评判,即设备维修管理查询(不分页) + */ + @PostMapping("/device/repairList") + @ResponseBody + public Object repairList(@RequestBody DeviceRepairRequest deviceRepairRequest) { + List deviceRepairLogDTOS = deviceInfoService.deviceRepairListPage(deviceRepairRequest); + return ResponseData.success(deviceRepairLogDTOS); + } + } 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 fbf8ab6..c71a15a 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 @@ -1,13 +1,12 @@ package com.casic.missiles.modular.controller.hik; +import cn.hutool.core.date.DateTime; +import cn.hutool.core.date.DateUtil; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.casic.missiles.model.response.ResponseData; import com.casic.missiles.modular.dao.HikFaceGroupInfoMapper; -import com.casic.missiles.modular.dto.hik.EventSubscribeRequest; -import com.casic.missiles.modular.dto.hik.FaceGroupAdditionRequest; -import com.casic.missiles.modular.dto.hik.HikRecvEvent; -import com.casic.missiles.modular.dto.hik.OrgBatchAdd; +import com.casic.missiles.modular.dto.hik.*; import com.casic.missiles.modular.enums.HikUri; import com.casic.missiles.modular.enums.SecurityEventType; import com.casic.missiles.modular.model.CaseInfo; @@ -18,16 +17,20 @@ import com.casic.missiles.modular.util.CaseInfoFactoryUtil; import com.casic.missiles.modular.util.HikUtil; import com.casic.missiles.modular.util.ThreadPoolUtil; +import com.casic.missiles.modular.util.WebSocket; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; -import org.springframework.web.bind.annotation.*; +import org.springframework.util.CollectionUtils; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.RestController; -import java.net.InetAddress; -import java.net.UnknownHostException; import java.util.ArrayList; +import java.util.Iterator; import java.util.List; import java.util.Objects; @@ -38,7 +41,6 @@ */ @Slf4j @RestController -@RequestMapping("/hik") public class HikController { @Autowired @@ -53,28 +55,37 @@ @Autowired private HikService hikService; + @Autowired + private HikFaceGroupInfoMapper hikFaceGroupInfoMapper; + + @Autowired + private WebSocket webSocket; + @Value("${server.port}") private int serverPort; - @Autowired - private HikFaceGroupInfoMapper hikFaceGroupInfoMapper; /** * 海康事件订阅 */ - @PostMapping("/event/subscribe") + @PostMapping("/hik/event/subscribe") @ResponseBody - public Object eventSubscribe() throws UnknownHostException { + public Object eventSubscribe() { EventSubscribeRequest eventSubscribeRequest = new EventSubscribeRequest(); ArrayList list = new ArrayList<>(); list.add(SecurityEventType.DEVICE_OFFLINE); + list.add(SecurityEventType.DEVICE_ONLINE); list.add(SecurityEventType.KEY_PERSONNEL_IDENTIFY_EVENT); list.add(SecurityEventType.MONITORING_POINT_OFFLINE); + list.add(SecurityEventType.MONITORING_POINT_ONLINE); list.add(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); list.add(SecurityEventType.PERSONNEL_GATHER_EVENT); - InetAddress localHost = InetAddress.getLocalHost(); + list.add(SecurityEventType.VISITOR_REGISTER); + list.add(SecurityEventType.VISITOR_CHECKOUT); + list.add(SecurityEventType.HIGH_ALTITUDE_PARABOLIC); +// InetAddress localHost = InetAddress.getLocalHost(); eventSubscribeRequest.setEventTypes(list); - eventSubscribeRequest.setEventDest("https://" + localHost + ":" + serverPort + "/eventRcv"); + eventSubscribeRequest.setEventDest("http://" + "192.168.10.6" + ":" + serverPort + "/eventRcv"); //订阅类型,0-订阅原始事件,1-联动事件,2-原始事件和联动事件,不填使用默认值0 eventSubscribeRequest.setSubType(0); /** @@ -92,19 +103,25 @@ } /** + * 查询事件订阅信息 + */ + @PostMapping("/hik/event/query") + @ResponseBody + public Object eventQuery() { + String result = HikUtil.hikApi(HikUri.EVENT_INFO, ""); + return result; + } + + /** * 海康事件接收 */ @PostMapping("/eventRcv") @ResponseBody public Object eventRcv(@RequestBody HikRecvEvent hikRecvEvent) { //1、接收所需事件类型 - Long eventType = hikRecvEvent.getEventType(); + Number eventType = hikRecvEvent.getEventType(); log.info("接收到安防事件类型为:{}", eventType); CaseInfo caseInfo = caseInfoFactoryUtil.getCaseInfo(eventType); - //接收到不关心事件直接返回 - if(Objects.isNull(caseInfo)){ - return ResponseData.success(); - } //2、不同事件不同处理,caseInfoFactoryUtil已设置好事件基础定义信息 // 再为事件添加状态、设备编码、设备名称、位置、区域、时间 // 异步处理事件 @@ -114,19 +131,23 @@ caseHandle(hikRecvEvent, eventType, caseInfo); } })); +// caseHandle(hikRecvEvent, eventType, caseInfo); - return null; + return ResponseData.success(); } - private void caseHandle(HikRecvEvent hikRecvEvent, Long eventType, CaseInfo caseInfo) { + private void caseHandle(HikRecvEvent hikRecvEvent, Number eventType, CaseInfo caseInfo) { JSONArray eventArray = hikRecvEvent.getEventArray(); List caseInfos = new ArrayList<>(); - while (eventArray.stream().iterator().hasNext()) { + Iterator iterator = eventArray.iterator(); + while (iterator.hasNext()) { CaseInfo caseInfo1 = new CaseInfo(); - BeanUtils.copyProperties(caseInfo, caseInfo1); - JSONObject event = (JSONObject) eventArray.stream().iterator().next(); + if(!Objects.isNull(caseInfo)){ + BeanUtils.copyProperties(caseInfo, caseInfo1); + } + JSONObject event = (JSONObject) iterator.next(); //5种事件进行不同处理 - if(SecurityEventType.KEY_PERSONNEL_IDENTIFY_EVENT == eventType){ + if (SecurityEventType.KEY_PERSONNEL_IDENTIFY_EVENT.equals(eventType)) { //判断所属人脸分组 JSONObject data = (JSONObject) event.get("data"); JSONObject faceRecognitionResult = (JSONObject) data.get("faceRecognitionResult"); @@ -142,52 +163,101 @@ if (faceGroupCode.equals(blackListGroup.getFaceGroupCode())) { //黑名单分组处理 caseInfo1 = hikService.blackListHandle(event, caseInfo1); - }else if(faceGroupCode.equals(propertyPersonnelGroup.getFaceGroupCode())){ + } else if (faceGroupCode.equals(propertyPersonnelGroup.getFaceGroupCode())) { //考勤分组处理-物业人员,添加到考勤表 hikService.propertyAttendanceHandle(event); - }else if(faceGroupCode.equals(securityPersonnelGroup.getFaceGroupCode())){ + } else if (faceGroupCode.equals(securityPersonnelGroup.getFaceGroupCode())) { //考勤分组处理-安保人员,添加到考勤表 hikService.securityPersonnelHandle(event); - }else { + } else { return; } - }else if(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT == eventType){ + } else if (SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT.equals(eventType)) { //离岗事件处理 caseInfo1 = hikService.demobilizedHandle(event, caseInfo1); - }else if(SecurityEventType.PERSONNEL_GATHER_EVENT == eventType){ + } else if (SecurityEventType.PERSONNEL_GATHER_EVENT.equals(eventType)) { //人员聚集事件处理 caseInfo1 = hikService.personGatherHandle(event, caseInfo1); - }else if(SecurityEventType.MONITORING_POINT_OFFLINE == eventType){ + } else if (SecurityEventType.MONITORING_POINT_OFFLINE.equals(eventType)) { //监控点离线事件处理 caseInfo1 = hikService.monitorPointOfflineHandle(event, caseInfo1); - }else if(SecurityEventType.DEVICE_OFFLINE == eventType){ + } else if (SecurityEventType.MONITORING_POINT_ONLINE.equals(eventType)) { + //监控点上线事件处理 + hikService.monitorPointOnlineHandle(event); + } else if (SecurityEventType.DEVICE_OFFLINE.equals(eventType)) { //装置离线事件处理 caseInfo1 = hikService.deviceOfflineHandle(event, caseInfo1); - }else if(SecurityEventType.VISITOR_REGISTER == eventType){ + } else if (SecurityEventType.DEVICE_ONLINE.equals(eventType)) { + //装置上线处理 + hikService.deviceOnlineHandle(event); + } else if (SecurityEventType.VISITOR_REGISTER.equals(eventType)) { //记录访客登记记录,添加到访客记录表 hikService.visitorRegisterHandler(event); - }else if(SecurityEventType.VISITOR_CHECKOUT == eventType){ + } else if (SecurityEventType.VISITOR_CHECKOUT.equals(eventType)) { //记录访客签离记录 hikService.visitorCheckOutHandler(event); } - if(!Objects.isNull(caseInfo1) && !StringUtils.isEmpty(caseInfo1.getHappenTime())){ + if (!Objects.isNull(caseInfo1) && !StringUtils.isEmpty(caseInfo1.getHappenTime())) { caseInfos.add(caseInfo1); } } //3、安防事件入库 - if(!caseInfoService.insertCaseInfoBatch(caseInfos)){ - log.error("安防事件批量入库异常"); + if (!CollectionUtils.isEmpty(caseInfos) && !caseInfoService.insertCaseInfoBatch(caseInfos)) { + log.error("安防事件批量入库异常!"); } // TODO: 2022/8/15 webSocket推送 + if (CollectionUtils.isEmpty(caseInfos)) { + log.info("webSocket事件推送"); + webSocket.sendAllMessage(JSONObject.toJSONString(caseInfos)); + } return; } /** + * 以图搜图,前端用于轨迹追踪 + */ + @PostMapping("/hik/search/picture") + @ResponseBody + public Object searchPictures(@RequestBody SearchPicturesRequest searchPicturesRequest) { + DateTime startDateTime = DateUtil.parse(searchPicturesRequest.getStartTime()); + DateTime endDateTime = DateUtil.parse(searchPicturesRequest.getEndTime()); + String startTime = DateUtil.format(startDateTime, "yyyy-MM-dd'T'HH:mm:ss.SSSXXX"); + String endTime = DateUtil.format(endDateTime, "yyyy-MM-dd'T'HH:mm:ss.SSSXXX"); + searchPicturesRequest.setStartTime(startTime); + searchPicturesRequest.setEndTime(endTime); + String body = JSONObject.toJSONString(searchPicturesRequest); + String resultStr = HikUtil.hikApi(HikUri.SEARCH_PICTURES, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (!"0".equals(resultJson.get("code"))) { + log.error("请求海康,以图搜图失败,海康response:{}", resultStr); + return ResponseData.error("以图搜图失败"); + } + return ResponseData.success(resultJson); + } + + + /** + * 海康事件取消订阅 + */ + @PostMapping("/hik/event/cancel") + @ResponseBody + public Object eventCancelSubscribe(@RequestBody CancelSubscribeRequest cancelSubscribeRequest) { + String body = JSONObject.toJSONString(cancelSubscribeRequest); + String resultStr = HikUtil.hikApi(HikUri.EVENT_CANCEL, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (!"0".equals(resultJson.get("code"))) { + log.error("请求海康,取消订阅失败,海康response:{}", resultStr); + return ResponseData.error("取消订阅失败"); + } + return ResponseData.success(resultJson); + } + + /** * 单个添加海康人脸分组 * api->hik单个添加人脸分组api->response->mysql */ - @PostMapping("/faceGroup/single/add") + @PostMapping("/hik/faceGroup/single/add") @ResponseBody public Object faceGroupAddition(@RequestBody FaceGroupAdditionRequest faceGroupAdditionRequest) { String body = JSONObject.toJSONString(faceGroupAdditionRequest); @@ -212,7 +282,7 @@ * 批量添加海康组织 * api->hik批量添加组织api->response */ - @PostMapping("/org/batch/add") + @PostMapping("/hik/org/batch/add") @ResponseBody public Object orgBatchAdd(@RequestBody List orgBatchAddRequest) { String body = JSONObject.toJSONString(orgBatchAddRequest); @@ -232,4 +302,62 @@ return ResponseData.error("批量添加组织失败"); } + /** + * 获取人员列表 + */ + @PostMapping("/hik/person/personList") + @ResponseBody + public Object personList() { + PersonListRequest request = new PersonListRequest(); + request.setPageNo(1); + request.setPageSize(100); + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi("/api/resource/v2/person/personList", body); + return resultStr; + } + + /** + * 获取组织列表 + */ + @PostMapping("/hik/org/orgList") + @ResponseBody + public Object orgList() { + PersonListRequest request = new PersonListRequest(); + request.setPageNo(1); + request.setPageSize(100); + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi("/api/resource/v1/org/orgList", body); + return resultStr; + } + + /** + * 查询访客权限下载记录 + */ + @PostMapping("/hik/auth/result") + @ResponseBody + public Object authResult() { + PersonListRequest request = new PersonListRequest(); + request.setPageNo(1); + request.setPageSize(100); + request.setOrderId("ba101db6246711edaea66f7939a13638"); + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi("/api/visitor/v1/auth/result", body); + return resultStr; + } + + /** + * 人脸图片获取 + */ + @PostMapping("/hik/face/picture") + @ResponseBody + public Object facePicture() { + FaceRequest request = new FaceRequest(); +// List list = new ArrayList<>(); +// list.add(""); + request.setCertificateNum("wanggong"); + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi("/api/frs/v1/face", body); + return resultStr; + } + } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/AssetInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/AssetInfoMapper.java index 4f64e83..c0684ee 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/AssetInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/AssetInfoMapper.java @@ -17,6 +17,6 @@ @Mapper public interface AssetInfoMapper extends BaseMapper { - List getAssetInfoListPage(@Param("page") Page page, AssetInfoRequest assetInfoRequest); + List getAssetInfoListPage(@Param("page") Page page, @Param("assetInfoRequest") AssetInfoRequest assetInfoRequest); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/AttendanceInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/AttendanceInfoMapper.java index f9e793e..ec87e46 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/AttendanceInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/AttendanceInfoMapper.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.statistics.AttendanceNumberDTO; import com.casic.missiles.modular.dto.statistics.AttendanceRatioDTO; import com.casic.missiles.modular.model.AttendanceInfo; import org.apache.ibatis.annotations.Mapper; @@ -17,7 +18,7 @@ */ @Mapper public interface AttendanceInfoMapper extends BaseMapper { - List getAttendanceInfoListPage(@Param("page") Page page, StaffInfoRequest attendanceInfoRequest); + List getAttendanceInfoListPage(@Param("page") Page page, @Param("attendanceInfoRequest") StaffInfoRequest attendanceInfoRequest); AttendanceInfo selectByCodeAndDate(@Param("staffCode") String staffCode); @@ -26,4 +27,8 @@ List getCountByTypeAndDateForMonth(@Param("staffType")String staffType); List getCountByTypeAndDateForYear(@Param("staffType")String staffType); + + List getCountForWeek(); + + List getCountForDay(); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java index ce94b8f..6137a7d 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java @@ -17,5 +17,5 @@ @Mapper public interface BlackInfoMapper extends BaseMapper { - List getBlackInfoListPage(@Param("page") Page page, BlackInfoRequest blackInfoRequest); + List getBlackInfoListPage(@Param("page") Page page, @Param("blackInfoRequest") BlackInfoRequest blackInfoRequest); } 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 efda6b3..50aaa6f 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 @@ -20,7 +20,7 @@ List getCaseInfoListPage(@Param("page") Page page, @Param("caseInfoRequest") CaseInfoRequest caseInfoRequest); - int updateStatusById(CaseInfoRequest caseInfoRequest); + int updateStatusById(@Param("caseInfoRequest") CaseInfoRequest caseInfoRequest); List selectByLevelAndMonth(@Param("year") String year); @@ -47,4 +47,20 @@ List selectPreWeekCountByThirtyDay(); List selectPreDayCountBySevenDay(); + + Integer selectDemobilizedCount(@Param("eventType") Number personnelDemobilizedEvent); + + List selectPreMonthCount(); + + List selectListBySevenDay(); + + List selectListByToday(); + + List selectListByToday2(); + + List selectListByToday3(); + + List selectListByType(@Param("eventType") Number eventType); + + List selectDemobilizedCountByHour(@Param("eventType") Number eventType); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/CategoryLevelMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/CategoryLevelMapper.java index 52fc714..afe1650 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/CategoryLevelMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/CategoryLevelMapper.java @@ -17,9 +17,9 @@ @Mapper public interface CategoryLevelMapper extends BaseMapper { - List getCaseCategoryLevelListPage(@Param("page") Page page, CategoryLevelRequest categoryLevelRequest); + List getCaseCategoryLevelListPage(@Param("page") Page page, @Param("categoryLevelRequest") CategoryLevelRequest categoryLevelRequest); - List getCaseCategoryLevelList(CategoryLevelRequest categoryLevelRequest); + List getCaseCategoryLevelList(@Param("categoryLevelRequest") CategoryLevelRequest categoryLevelRequest); CaseCategoryLevel getCaseCategoryLevel(@Param("categoryLevelCode") String categoryLevelCode); 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 66353b1..2555a09 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 @@ -19,7 +19,7 @@ @Mapper public interface DeviceInfoMapper extends BaseMapper { - List getDeviceInfoListPage(@Param("page") Page page, DeviceInfoRequest deviceInfoRequest); + List getDeviceInfoListPage(@Param("page") Page page, @Param("deviceInfoRequest") DeviceInfoRequest deviceInfoRequest); List getDeviceInfoList(@Param("deviceInfoRequest") DeviceInfoRequest deviceInfoRequest); @@ -27,6 +27,8 @@ DeviceInfo getByIndexCode(@Param("srcIndex") String srcIndex); + DeviceInfo getByIp(@Param("ip") String ip); + List selectIndexCodesByCodes(@Param("deviceCodes") List deviceCodes); List selectByType(@Param("devType") String devType); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java index 41dd0af..5bfaf63 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java @@ -5,6 +5,7 @@ import com.casic.missiles.modular.dto.DeviceRepairRequest; import com.casic.missiles.modular.model.DeviceRepairLog; import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; import java.util.List; @@ -16,7 +17,7 @@ @Mapper public interface DeviceRepairLogMapper extends BaseMapper { - List getDeviceRepairListPage(Page page, DeviceRepairRequest deviceRepairRequest); + List getDeviceRepairListPage(@Param("page") Page page, @Param("deviceRepairRequest")DeviceRepairRequest deviceRepairRequest); - List getDeviceRepairList(DeviceRepairRequest deviceRepairRequest); + List getDeviceRepairList(@Param("deviceRepairRequest") DeviceRepairRequest deviceRepairRequest); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java index 9035c47..4823ac1 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java @@ -18,7 +18,7 @@ @Mapper public interface FireEquipInfoMapper extends BaseMapper { - List getFireEquipInfoListPage(@Param("page") Page page, FireEquipRequest fireEquipRequest); + List getFireEquipInfoListPage(@Param("page") Page page, @Param("fireEquipRequest") FireEquipRequest fireEquipRequest); FireEquipInfo getFireEquipInfo(@Param("equipCode") String equipCode); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/GateGroupMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/GateGroupMapper.java index d8c330d..977a427 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/GateGroupMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/GateGroupMapper.java @@ -17,7 +17,7 @@ */ @Mapper public interface GateGroupMapper extends BaseMapper { - List getGateGroupListPage(@Param("page") Page page, GateGroupRequest gateGroupRequest); + List getGateGroupListPage(@Param("page") Page page, @Param("gateGroupRequest") GateGroupRequest gateGroupRequest); GateGroup getGateGroupByName(@Param("groupName") String groupName); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/HazardLevelMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/HazardLevelMapper.java index 8957780..dcf47bb 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/HazardLevelMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/HazardLevelMapper.java @@ -17,11 +17,13 @@ @Mapper public interface HazardLevelMapper extends BaseMapper { - List getCaseHazardLevelListPage(@Param("page") Page page, HazardLevelRequest hazardLevelRequest); + List getCaseHazardLevelListPage(@Param("page") Page page, @Param("hazardLevelRequest") HazardLevelRequest hazardLevelRequest); - List getCaseHazardLevelList(HazardLevelRequest hazardLevelRequest); + List getCaseHazardLevelList(@Param("hazardLevelRequest") HazardLevelRequest hazardLevelRequest); CaseHazardLevel getCaseHazardLevel(@Param("hazardLevelCode") String hazardLevelCode); List selectHazardName(); + + String selectHazardNameByCode(@Param("hazardLevelCode") String hazardLevelCode); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/HikCaseDefineMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/HikCaseDefineMapper.java index 0dc47d1..f162fef 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/HikCaseDefineMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/HikCaseDefineMapper.java @@ -12,5 +12,5 @@ */ @Mapper public interface HikCaseDefineMapper extends BaseMapper { - HikCaseDefine getHikCaseDefine(@Param("caseTypeCode") Long caseTypeCode); + HikCaseDefine getHikCaseDefine(@Param("caseTypeCode") Number caseTypeCode); } 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 f8a674c..fe5afc2 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 @@ -17,11 +17,13 @@ @Mapper public interface StaffInfoMapper extends BaseMapper { - List getStaffInfoListPage(@Param("page") Page page, StaffInfoRequest staffInfoRequest); + List getStaffInfoListPage(@Param("page") Page page, @Param("staffInfoRequest") StaffInfoRequest staffInfoRequest); StaffInfo selectByCode(@Param("staffCode") String staffCode); - List getStaffInfoList(StaffInfoRequest staffInfoRequest); + List getStaffInfoList(@Param("staffInfoRequest") StaffInfoRequest staffInfoRequest); - List selectBatchCodes(List list); + List selectBatchCodes(@Param("list") List list); + + int updateByCodeForCard(@Param("staffCode") String staffCode, @Param("cardNo") String cardNo); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitInfoMapper.java index b1217c5..6c52542 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitInfoMapper.java @@ -16,7 +16,7 @@ */ @Mapper public interface VisitInfoMapper extends BaseMapper { - List getVisitInfoListPage(@Param("page") Page page, VisitorRequest visitorRequest); + List getVisitInfoListPage(@Param("page") Page page, @Param("visitorRequest") VisitorRequest visitorRequest); VisitInfo selectByOrderId(@Param("orderId") String orderId); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitorApplyMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitorApplyMapper.java index c09f3c0..6ea55bd 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitorApplyMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitorApplyMapper.java @@ -18,7 +18,7 @@ @Mapper public interface VisitorApplyMapper extends BaseMapper { - List getVisitorApplyListPage(@Param("page") Page page, VisitorApplyRequest visitorApplyRequest); + List getVisitorApplyListPage(@Param("page") Page page, @Param("visitorApplyRequest") VisitorApplyRequest visitorApplyRequest); List selectByVisitReason(); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/AttendanceInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/AttendanceInfoMapper.xml index b2ece71..f8bdd6e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/AttendanceInfoMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/AttendanceInfoMapper.xml @@ -43,7 +43,8 @@ and staff_type = #{staffType} - and YEARWEEK(date_format(atte_date, '%Y-%m-%d'), 1) = YEARWEEK(now(),1); + AND DATE_SUB(CURDATE(), INTERVAL 7 DAY) <= DATE(atte_date) + GROUP BY DATE_FORMAT(atte_date, '%Y-%m-%d') @@ -69,4 +70,20 @@ GROUP BY DATE_FORMAT(atte_date, '%Y-%m') + + + \ No newline at end of file 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 2b6953f..06ec0a8 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 @@ -28,7 +28,9 @@ @@ -87,7 +89,8 @@ SELECT hazard_level_code as levelCode, count(id) as quantity FROM bus_case_info WHERE hazard_level_code is not null - AND DATE_SUB(CURDATE(), INTERVAL 7 DAY) <= date(happen_time); + AND is_key_area = 1 + AND DATE_SUB(CURDATE(), INTERVAL 7 DAY) <= date(happen_time) GROUP BY hazard_level_code @@ -95,7 +98,8 @@ SELECT hazard_level_code as levelCode, count(id) as quantity FROM bus_case_info WHERE hazard_level_code is not null - AND DATE_SUB(CURDATE(), INTERVAL 30 DAY) <= date(happen_time); + AND is_key_area = 1 + AND DATE_SUB(CURDATE(), INTERVAL 30 DAY) <= date(happen_time) GROUP BY hazard_level_code @@ -122,4 +126,71 @@ AND hazard_level_code is not null GROUP BY DATE_FORMAT(happen_time,'%Y-%m-%d') + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/CategoryLevelMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/CategoryLevelMapper.xml index 4670b1f..1d25cbd 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/CategoryLevelMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/CategoryLevelMapper.xml @@ -20,11 +20,11 @@ SELECT * FROM bus_case_category_level WHERE 1=1 - - and code = #{code} + + and code = #{categoryLevelRequest.code} - - and name = #{name} + + and name = #{categoryLevelRequest.name} ORDER by create_time DESC 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 9b66fd8..bfd84b7 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 @@ -98,4 +98,10 @@ #{item} + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceRepairLogMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceRepairLogMapper.xml index 078ed3c..cf1a481 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceRepairLogMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceRepairLogMapper.xml @@ -22,14 +22,14 @@ SELECT * FROM bus_device_repair_log WHERE 1=1 - - and device_code = #{devCode} + + and device_code = #{deviceRepairRequest.devCode} - - and device_name = #{devName} + + and device_name = #{deviceRepairRequest.devName} - - and DATE_FORMAT(create_time,"%y%m%d") = DATE_FORMAT(#{createTime},"%y%m%d") + + and DATE_FORMAT(create_time,"%y%m%d") = DATE_FORMAT(#{deviceRepairRequest.createTime},"%y%m%d") ORDER by create_time DESC diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/HazardLevelMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/HazardLevelMapper.xml index f16f2b9..458322b 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/HazardLevelMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/HazardLevelMapper.xml @@ -20,11 +20,11 @@ SELECT * FROM bus_case_hazard_level WHERE 1=1 - - and code = #{code} + + and code = #{hazardLevelRequest.code} - - and name = #{name} + + and name = #{hazardLevelRequest.name} ORDER by create_time DESC @@ -42,4 +42,10 @@ SELECT name FROM bus_case_hazard_level + + \ 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 557237e..b6a183a 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 @@ -50,4 +50,10 @@ + + + UPDATE bus_staff_info + SET card_no = #{cardNo} + WHERE staff_code = #{staffCode} + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitInfoMapper.xml index 84aa84f..230529a 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitInfoMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitInfoMapper.xml @@ -27,5 +27,6 @@ SELECT * FROM bus_visit_info WHERE order_id = #{orderId} and DATE_FORMAT(in_time,'%Y-%m-%d') = CURRENT_DATE + limit 1 \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/BlackPictureRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/BlackPictureRequest.java new file mode 100644 index 0000000..fc92701 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/BlackPictureRequest.java @@ -0,0 +1,14 @@ +package com.casic.missiles.modular.dto; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/29 19:26 + */ +@Data +public class BlackPictureRequest { + private String picUri; + private String serverIndexCode; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/CancelSubscribeRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/CancelSubscribeRequest.java new file mode 100644 index 0000000..e2d390a --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/CancelSubscribeRequest.java @@ -0,0 +1,15 @@ +package com.casic.missiles.modular.dto.hik; + +import lombok.Data; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/24 15:14 + */ +@Data +public class CancelSubscribeRequest { + private List eventTypes; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/CardInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/CardInfo.java new file mode 100644 index 0000000..341457d --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/CardInfo.java @@ -0,0 +1,24 @@ +package com.casic.missiles.modular.dto.hik; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/26 16:08 + */ +@Data +public class CardInfo { + //卡号,8~20个字符,支持数字和大写字母 + private String cardNo; + //人员ID,员工工号 + private String personId; + //人员所属组织IndexCode + private String orgIndexCode; + //卡片类型,默认是1:IC卡 + //1:IC卡 + //2:CPU卡 + //3:远距离卡 + //4:MIFARE卡 + private Number cardType; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/FaceRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/FaceRequest.java new file mode 100644 index 0000000..edc04bf --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/FaceRequest.java @@ -0,0 +1,16 @@ +package com.casic.missiles.modular.dto.hik; + +import lombok.Data; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/25 16:53 + */ +@Data +public class FaceRequest { + private String certificateNum; + private List indexCodes; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/HikRecvEvent.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/HikRecvEvent.java index a3e9845..1b2b2b1 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/HikRecvEvent.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/HikRecvEvent.java @@ -28,12 +28,12 @@ /** * 事件类型,用于判断所需接收到的事件类型 */ - public Long getEventType(){ + public Number getEventType(){ JSONObject jsonObject = (JSONObject)JSONObject.toJSON(params); //事件类别对应SecurityEventTypeEnum JSONArray eventTypeArray = (JSONArray)jsonObject.get("events"); JSONObject eventJsonObject = (JSONObject)JSONObject.toJSON(eventTypeArray.get(0)); - Long eventType = (Long) eventJsonObject.get("eventType"); + Number eventType = (Number) eventJsonObject.get("eventType"); return eventType; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonBatchDeleteRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonBatchDeleteRequest.java index 027d31d..9751929 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonBatchDeleteRequest.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonBatchDeleteRequest.java @@ -12,4 +12,6 @@ @Data public class PersonBatchDeleteRequest { private List personIds; + //删除人脸接口使用 + private String faceId; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonInfoRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonInfoRequest.java new file mode 100644 index 0000000..05dc9e1 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonInfoRequest.java @@ -0,0 +1,20 @@ +package com.casic.missiles.modular.dto.hik; + +import lombok.Data; + +import java.util.List; + +/** + * @Description: 获取员工照片请求实体 + * @Author: wangpeng + * @Date: 2022/8/25 16:53 + */ +@Data +public class PersonInfoRequest { + //获取员工详细信息使用 + private String paramName; + private List paramValue; + //获取照片使用 + private String picUri; + private String serverIndexCode; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonListRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonListRequest.java new file mode 100644 index 0000000..3f7149b --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonListRequest.java @@ -0,0 +1,16 @@ +package com.casic.missiles.modular.dto.hik; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/25 16:53 + */ +@Data +public class PersonListRequest { + private Number pageNo; + private Number pageSize; + + private String orderId; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/SearchPicturesRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/SearchPicturesRequest.java new file mode 100644 index 0000000..0a95966 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/SearchPicturesRequest.java @@ -0,0 +1,24 @@ +package com.casic.missiles.modular.dto.hik; + +import lombok.Data; + +import java.util.List; + +/** + * @Description: 以图搜图请求 + * @Author: wangpeng + * @Date: 2022/8/29 10:46 + */ +@Data +public class SearchPicturesRequest { + private String facePicBinaryData; + private String facePicUrl; + private List cameraIndexCodes; + private String startTime; + private String endTime; + //指定搜图的最小相似度,最小为1,最大为100 + private String minSimilarity; + private Number age; + //male-男性,female-女性 + private String sex; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/StaffCardRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/StaffCardRequest.java new file mode 100644 index 0000000..4052e6d --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/StaffCardRequest.java @@ -0,0 +1,20 @@ +package com.casic.missiles.modular.dto.hik; + +import lombok.Data; + +import java.util.List; + +/** + * @Description: 人员开卡请求实体 + * @Author: wangpeng + * @Date: 2022/8/26 16:05 + */ +@Data +public class StaffCardRequest { + //卡片开始有效时间,时间格式:yyyy-MM-dd + private String startDate; + //卡片截止有效时间,时间格式:yyyy-MM-dd,不能大于2037年12月31日 + private String endDate; + //cardList,待开卡列表,最大支持50张卡 + private List cardList; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/VisitorInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/VisitorInfo.java index 73aa316..b99f301 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/VisitorInfo.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/VisitorInfo.java @@ -14,7 +14,7 @@ //访客性别 //1: 男 //2: 女 - private String gender; + private Integer gender; //联系电话建议填写手机号码 private String phoneNo; //证件类型 diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/ApplyReasonGroupDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/ApplyReasonGroupDTO.java index 514f382..786143e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/ApplyReasonGroupDTO.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/ApplyReasonGroupDTO.java @@ -13,4 +13,6 @@ private String visitReason; //访问人数 private Integer quantity; + //占比 + private String ratio; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/AttendanceNumberDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/AttendanceNumberDTO.java new file mode 100644 index 0000000..a494321 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/AttendanceNumberDTO.java @@ -0,0 +1,24 @@ +package com.casic.missiles.modular.dto.statistics; + +import com.fasterxml.jackson.annotation.JsonIgnore; +import lombok.Data; + +/** + * @Description: 出勤人数统计实体 + * @Author: wangpeng + * @Date: 2022/8/31 19:24 + */ +@Data +public class AttendanceNumberDTO { + //日期维度,周、今日,入参 + @JsonIgnore + private String dateDimension; + + //日期,具体天/小时,出参 + private String date; + //出勤人数 + private String quantity; + //员工类型 + private String staffType; + +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/AvgMonthAndWeekGroupDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/AvgMonthAndWeekGroupDTO.java index 4366916..331a9a9 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/AvgMonthAndWeekGroupDTO.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/AvgMonthAndWeekGroupDTO.java @@ -2,8 +2,6 @@ import lombok.Data; -import java.util.Map; - /** * @Description: 平均每月和每周的数据实体 * @Author: wangpeng @@ -13,6 +11,4 @@ public class AvgMonthAndWeekGroupDTO { //入参 private String year; - //出参,key:事件类型,value:周和月数据平均值 - private Map map; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/GateStatusGroupResponse.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/GateStatusGroupResponse.java new file mode 100644 index 0000000..d16f4e5 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/GateStatusGroupResponse.java @@ -0,0 +1,16 @@ +package com.casic.missiles.modular.dto.statistics; + +import lombok.Data; + +/** + * @Description: 闸机/摄像机统计响应实体 + * @Author: wangpeng + * @Date: 2022/8/30 14:22 + */ +@Data +public class GateStatusGroupResponse { + //设备状态 + private String status; + //占比 + private String ratio; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/MonthAndWeekDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/MonthAndWeekDTO.java index 7482b2a..284115a 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/MonthAndWeekDTO.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/MonthAndWeekDTO.java @@ -9,7 +9,7 @@ */ @Data public class MonthAndWeekDTO { -// private String levelName; + private String levelName; private Integer monthQuantity; private Integer weekQuantity; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/OnDutyRatioDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/OnDutyRatioDTO.java new file mode 100644 index 0000000..4f6a65d --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/OnDutyRatioDTO.java @@ -0,0 +1,15 @@ +package com.casic.missiles.modular.dto.statistics; + +import lombok.Data; + +/** + * @Description: 在岗率统计实体 + * @Author: wangpeng + * @Date: 2022/9/2 21:24 + */ +@Data +public class OnDutyRatioDTO { + private String date; + private String quantity; + private String ratio; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/SecurityLevelAssessDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/SecurityLevelAssessDTO.java new file mode 100644 index 0000000..40a0738 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/SecurityLevelAssessDTO.java @@ -0,0 +1,15 @@ +package com.casic.missiles.modular.dto.statistics; + +import lombok.Data; + +/** + * @Description: 出勤人数统计实体 + * @Author: wangpeng + * @Date: 2022/8/31 19:24 + */ +@Data +public class SecurityLevelAssessDTO { + private String date; + private String quantity; + private Double score; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/SecurityScoreDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/SecurityScoreDTO.java index 304d169..f7bd4a2 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/SecurityScoreDTO.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/SecurityScoreDTO.java @@ -14,5 +14,5 @@ //楼层,出参 private String area; //评分,出参 - private String score; + private Double score; } 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 6a30786..e5e613d 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 @@ -8,6 +8,10 @@ public interface HikUri { //事件订阅 String EVENT_SUBSCRIBE = "/api/eventService/v1/eventSubscriptionByEventTypes"; + //事件订阅信息查询 + String EVENT_INFO = "/api/eventService/v1/eventSubscriptionView"; + //事件订阅取消 + String EVENT_CANCEL = "/api/eventService/v1/eventUnSubscriptionByEventTypes"; //预约免登记 String APPOINTMENT_FREE_REGISTER = "/api/visitor/v1/appointment/registration"; //修改访客预约 @@ -32,8 +36,18 @@ String PERSON_SINGLE_UPDATE = "/api/resource/v1/person/single/update"; //批量删除人员 String PERSON_BATCH_DELETE = "/api/resource/v1/person/batch/delete"; + //根据人脸Id删除人脸 + String PERSON_SINGLE_DELETE = "/api/resource/v1/face/single/delete"; //门禁点反控 String DOOR_CONTROL = "/api/acs/v1/door/doControl"; //查询海康门禁点事件v2 String DOOR_EVENTS = "/api/acs/v2/door/events"; + //批量开卡 + String CARD_BINDING = "/api/cis/v1/card/binding"; + //提取人员照片 + String PERSON_PICTURE = "/api/resource/v1/person/picture"; + //根据人员唯一字段获取人员详细信息 + String PERSON_INFO = "/api/resource/v1/person/condition/personInfo"; + //以图搜图 + String SEARCH_PICTURES = "/api/frs/v1/application/captureSearch"; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/enums/SecurityEventType.java b/casic-server/src/main/java/com/casic/missiles/modular/enums/SecurityEventType.java index d51034c..42eacf8 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/enums/SecurityEventType.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/enums/SecurityEventType.java @@ -14,18 +14,27 @@ Number PERSONNEL_GATHER_EVENT = 131593; //监控点离线事件 Number MONITORING_POINT_OFFLINE = 889196545; + //监控点上线事件 + Number MONITORING_POINT_ONLINE = 889196546; //装置离线 Number DEVICE_OFFLINE = 199710; + //装置连线 + Number DEVICE_ONLINE = 199711; //访客登记 Number VISITOR_REGISTER = 1392513025; //访客签离 Number VISITOR_CHECKOUT = 1392513026; + //高空抛物 + Number HIGH_ALTITUDE_PARABOLIC = 930335; + //下面两个查询海康门禁点事件使用 //合法卡比对通过 Number CARD_COMPARE_PASS = 198914; //人脸认证通过 Number FACE_COMPARE_PASS = 196893; + + // //正常开门 // Number NORMAL_OPENING = 198913; // //按钮开门 @@ -46,7 +55,6 @@ // Number FIREWORKS_DETECTION = 192514; // //陌生人识别事件 // Number STRANGER_RECOGNITION = 1644171265; -// //高空抛物 -// Number HIGH_ALTITUDE_PARABOLIC = 930335; + } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/job/CockpitJob.java b/casic-server/src/main/java/com/casic/missiles/modular/job/CockpitJob.java index 7490a27..85dd016 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/job/CockpitJob.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/job/CockpitJob.java @@ -79,14 +79,6 @@ } }); } - } - /** - * 机动力量实时在岗率,在岗人数除以总应在岗人数,功能待定 - */ -// @Scheduled(cron = "0 0/1 * * * ?") - public void BeOnDutyRatio() { - - } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/service/HikCaseDefineService.java b/casic-server/src/main/java/com/casic/missiles/modular/service/HikCaseDefineService.java index d9bb3a9..18e2936 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/service/HikCaseDefineService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/service/HikCaseDefineService.java @@ -9,5 +9,5 @@ * @Date: 2022/7/21 17:20 */ public interface HikCaseDefineService extends IService { - HikCaseDefine getHikCaseDefine(Long caseTypeCode); + HikCaseDefine getHikCaseDefine(Number caseTypeCode); } 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 dd24101..bcc3b5d 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 @@ -18,6 +18,8 @@ CaseInfo monitorPointOfflineHandle(JSONObject event, CaseInfo caseInfo); + void monitorPointOnlineHandle(JSONObject event); + CaseInfo deviceOfflineHandle(JSONObject event, CaseInfo caseInfo); void propertyAttendanceHandle(JSONObject event); @@ -27,4 +29,6 @@ void visitorRegisterHandler(JSONObject event); void visitorCheckOutHandler(JSONObject event); + + void deviceOnlineHandle(JSONObject event); } 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 e55c016..01870bd 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.StaffCardRequest; import com.casic.missiles.modular.model.StaffInfo; import java.util.List; @@ -28,4 +29,6 @@ StaffInfo selectStaffInfoByCode(StaffInfo staffInfo); List staffInfoList(StaffInfoRequest staffInfoRequest); + + int saveCardInfo(StaffCardRequest staffCardRequest); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/service/impl/BlackInfoServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/service/impl/BlackInfoServiceImpl.java index 8f47b37..981b4cd 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/service/impl/BlackInfoServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/service/impl/BlackInfoServiceImpl.java @@ -17,7 +17,6 @@ import com.casic.missiles.modular.model.BlackInfo; import com.casic.missiles.modular.model.HikFaceGroupInfo; import com.casic.missiles.modular.service.BlackInfoService; -import com.casic.missiles.modular.system.service.ICasicFileService; import com.casic.missiles.modular.util.HikUtil; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; @@ -43,9 +42,6 @@ private HikFaceGroupInfoMapper hikFaceGroupInfoMapper; @Resource - private ICasicFileService fileService; - - @Resource private AbstractDictService dictService; @Override @@ -90,9 +86,6 @@ //设置海康人脸唯一标识、人脸分组唯一标识 blackInfo.setIndexCode(String.valueOf(dataJson.get("indexCode"))); blackInfo.setFaceGroupIndexCode(String.valueOf(dataJson.get("faceGroupIndexCode"))); - //保存图片到本地 - String picUrl = fileService.saveFile(blackInfo.getPicture()); - blackInfo.setPicture(picUrl); //插入数据库 if(blackInfoMapper.insert(blackInfo) > 0){ return ResponseData.success(); @@ -141,8 +134,6 @@ log.error("请求海康,单个修改人脸失败,海康response:{}", resultStr); return ResponseData.error("单个修改人脸失败"); } - String picUrl = fileService.saveFile(blackInfo.getPicture()); - blackInfo.setPicture(picUrl); if(blackInfoMapper.updateById(blackInfo) > 0){ return ResponseData.success(); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/service/impl/CockpitServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/service/impl/CockpitServiceImpl.java index 6e6076e..7402991 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/service/impl/CockpitServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/service/impl/CockpitServiceImpl.java @@ -4,15 +4,12 @@ import cn.hutool.core.date.DateUtil; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.core.application.service.AbstractDictService; import com.casic.missiles.modular.dto.hik.DoorEventsRequest; import com.casic.missiles.modular.enums.HikUri; -import com.casic.missiles.modular.enums.SecurityEventDict; import com.casic.missiles.modular.enums.SecurityEventType; import com.casic.missiles.modular.service.CockpitService; import com.casic.missiles.modular.util.HikUtil; import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.*; @@ -25,8 +22,6 @@ @Slf4j @Service public class CockpitServiceImpl implements CockpitService { - @Autowired - private AbstractDictService dictService; @Override public HashMap dataHandle(DoorEventsRequest doorEventsRequest, HashMap> configMap, HashMap jsonMap, HashMap resultMap) { @@ -36,8 +31,8 @@ Date date = new Date(); DateTime startTimeDate = DateUtil.beginOfDay(date); DateTime endTimeDate = DateUtil.endOfDay(date); - String startTime = DateUtil.format(startTimeDate, "yyyy-MM-dd'T'HH:mm:ss'Z'"); - String endTime = DateUtil.format(endTimeDate, "yyyy-MM-dd'T'HH:mm:ss'Z'"); + String startTime = DateUtil.format(startTimeDate, "yyyy-MM-dd'T'HH:mm:ssXXX"); + String endTime = DateUtil.format(endTimeDate, "yyyy-MM-dd'T'HH:mm:ssXXX"); configMap.keySet().stream().forEach(key -> { List doorIndexCodes = configMap.get(key); doorEventsRequest.setPageNo(1); @@ -95,8 +90,9 @@ return; } Integer num = 0; - while (list.stream().iterator().hasNext()) { - JSONObject next = (JSONObject) list.stream().iterator().next(); + Iterator iterator = list.stream().iterator(); + while (iterator.hasNext()) { + JSONObject next = (JSONObject) iterator.next(); Integer inAndOutType = next.getInteger("inAndOutType"); //进门 if (1 == inAndOutType) { @@ -105,8 +101,8 @@ --num; } } - String dictName = dictService.getDictNameByCode(SecurityEventDict.DEVICE_POSITION, String.valueOf(key)); - resultMap.put(dictName, num); +// String dictName = dictService.getDictNameByCode(SecurityEventDict.DEVICE_POSITION, String.valueOf(key)); + resultMap.put(String.valueOf(key), num); }); return resultMap; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/service/impl/HikCaseDefineServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/service/impl/HikCaseDefineServiceImpl.java index 98ab2a4..1a59c7e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/service/impl/HikCaseDefineServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/service/impl/HikCaseDefineServiceImpl.java @@ -16,7 +16,7 @@ private HikCaseDefineMapper hikCaseDefineMapper; @Override - public HikCaseDefine getHikCaseDefine(Long caseTypeCode) { + public HikCaseDefine getHikCaseDefine(Number caseTypeCode) { return hikCaseDefineMapper.getHikCaseDefine(caseTypeCode); } } 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 b47f78f..dbad48f 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 @@ -58,10 +58,16 @@ 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.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; } @@ -76,10 +82,16 @@ 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.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; } @@ -94,10 +106,16 @@ 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.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; } @@ -109,24 +127,44 @@ 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()); //事件状态(未解决的字典值) + // TODO: 2022/7/28 事件状态字典值选择 + caseInfo.setStatus(dict.get(0).getCode()); //事件状态("未解决"的字典值) DeviceInfo deviceInfo = deviceInfoMapper.getByIndexCode(srcIndex); + if(Objects.isNull(deviceInfo)){ + log.info("接收到监控点离线事件,但数据库中无该事件发生的设备信息"); + return caseInfo; + } 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()); //更新设备状态 // TODO: 2022/7/28 设备离线字典值选择 -// deviceInfo.setStatus(); + List deviceDict = dictService.findInDictByCode(SecurityEventDict.DEVICE_STATUS); + deviceInfo.setStatus(deviceDict.get(1).getCode()); if(deviceInfoMapper.updateById(deviceInfo) <= 0){ + log.error("海康回调,更新监控点离线线状态失败!"); return null; } return caseInfo; } @Override + public void monitorPointOnlineHandle(JSONObject event) { + String srcIndex = event.getString("srcIndex"); + DeviceInfo deviceInfo = deviceInfoMapper.getByIndexCode(srcIndex); + // TODO: 2022/7/28 设备在线字典值选择 + List deviceDict = dictService.findInDictByCode(SecurityEventDict.DEVICE_STATUS); + deviceInfo.setStatus(deviceDict.get(0).getCode()); + if(deviceInfoMapper.updateById(deviceInfo) <= 0){ + log.error("海康回调,更新监控点在线状态失败!"); + } + } + + @Override public CaseInfo deviceOfflineHandle(JSONObject event, CaseInfo caseInfo) { //加入到安防事件 String srcIndex = event.getString("srcIndex"); //海康资源唯一标识 @@ -138,19 +176,40 @@ 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.setDeviceCode(deviceInfo.getDevCode()); //设备code caseInfo.setDevName(deviceInfo.getDevName()); //设备名 caseInfo.setPosition(deviceInfo.getPosition()); //事件位置 caseInfo.setArea(deviceInfo.getArea()); //区域 + caseInfo.setIsKeyArea(deviceInfo.getIsKeyArea()); + caseInfo.setDetailLocation(deviceInfo.getDetailLocation()); //更新设备状态 // TODO: 2022/7/28 设备离线字典值选择 -// deviceInfo.setStatus(); + List deviceDict = dictService.findInDictByCode(SecurityEventDict.DEVICE_STATUS); + deviceInfo.setStatus(deviceDict.get(1).getCode()); if(deviceInfoMapper.updateById(deviceInfo) <= 0){ + log.error("海康回调,更新设备离线状态失败!"); return null; } return caseInfo; } + + @Override + public void deviceOnlineHandle(JSONObject event) { + String srcIndex = event.getString("srcIndex"); + DeviceInfo deviceInfo = deviceInfoMapper.getByIndexCode(srcIndex); + // TODO: 2022/7/28 设备在线字典值选择 + List deviceDict = dictService.findInDictByCode(SecurityEventDict.DEVICE_STATUS); + deviceInfo.setStatus(deviceDict.get(0).getCode()); + if(deviceInfoMapper.updateById(deviceInfo) <= 0){ + log.error("海康回调,更新门禁点装置在线状态失败!"); + } + } + @Override public void propertyAttendanceHandle(JSONObject event) { String srcIndex = event.getString("srcIndex"); @@ -182,8 +241,9 @@ info.setStaffName(staffInfo.getStaffName()); info.setStaffGender(staffInfo.getStaffGender()); // TODO: 2022/7/29 物业人员字典值选择 -// info.setStaffType(); -// info.setStaffTypeName(); + List staffDict = dictService.findInDictByCode(SecurityEventDict.STAFF_TYPE); + info.setStaffType(staffDict.get(0).getCode()); + info.setStaffTypeName(staffDict.get(0).getName()); info.setAtteDate(DateUtil.today()); info.setAtteStartTime(happenTime); info.setAtteStartDev(deviceInfo.getDevCode()); @@ -226,8 +286,9 @@ info.setStaffName(staffInfo.getStaffName()); info.setStaffGender(staffInfo.getStaffGender()); // TODO: 2022/7/29 安保人员字典值选择 -// info.setStaffType(); -// info.setStaffTypeName(); + List staffDict = dictService.findInDictByCode(SecurityEventDict.STAFF_TYPE); + info.setStaffType(staffDict.get(1).getCode()); + info.setStaffTypeName(staffDict.get(1).getName()); info.setAtteDate(DateUtil.today()); info.setAtteStartTime(happenTime); info.setAtteStartDev(deviceInfo.getDevCode()); @@ -259,8 +320,12 @@ visitInfo.setVisitReason(data.getString("purpose")); visitInfo.setPicUri(data.getString("captureUrl")); visitInfo.setServerIndexCode(data.getString("svrIndexCode")); - visitInfo.setVisitPosition(deviceInfo.getPosition()); - + visitInfo.setOrderId(data.getString("visitorId")); + if(!Objects.isNull(deviceInfo)){ + visitInfo.setVisitPosition(deviceInfo.getPosition()); + } else{ + log.info("识别访客的门禁不在数据库中"); + } if(visitInfoMapper.insert(visitInfo) <= 0){ log.error("新增访客记录异常"); } 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 b416f5c..d19dceb 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 @@ -10,12 +10,12 @@ import com.casic.missiles.modular.dto.StaffInfoRequest; import com.casic.missiles.modular.dto.hik.PersonBatchDeleteRequest; import com.casic.missiles.modular.dto.hik.PersonSingleAddOrUpdateRequest; +import com.casic.missiles.modular.dto.hik.StaffCardRequest; import com.casic.missiles.modular.enums.HikUri; import com.casic.missiles.modular.enums.SecurityEventDict; import com.casic.missiles.modular.model.DeviceInfo; import com.casic.missiles.modular.model.StaffInfo; import com.casic.missiles.modular.service.StaffInfoService; -import com.casic.missiles.modular.system.service.ICasicFileService; import com.casic.missiles.modular.util.Base64Util; import com.casic.missiles.modular.util.HikUtil; import lombok.extern.slf4j.Slf4j; @@ -51,9 +51,6 @@ @Resource private Validator validator; - @Resource - private ICasicFileService fileService; - @Value("${casic.file.uploadPath}") private String uploadPath; @@ -80,8 +77,6 @@ if(!Objects.isNull(staff)){ return ResponseData.error("数据已存在"); } - String picUrl = fileService.saveFile(staffInfo.getPicture()); - staffInfo.setPicture(picUrl); //添加人员到海康 PersonSingleAddOrUpdateRequest personSingleAddOrUpdateRequest = new PersonSingleAddOrUpdateRequest(); @@ -117,9 +112,6 @@ @Override @Transactional(rollbackFor = Exception.class) public Object updateStaffInfo(StaffInfo staffInfo) { - String picUrl = fileService.saveFile(staffInfo.getPicture()); - staffInfo.setPicture(picUrl); - //修改人员到海康 PersonSingleAddOrUpdateRequest personSingleAddOrUpdateRequest = new PersonSingleAddOrUpdateRequest(); personSingleAddOrUpdateRequest.setPersonId(staffInfo.getStaffCode()); @@ -162,7 +154,13 @@ String body = JSONObject.toJSONString(personBatchDeleteRequest); String resultStr = HikUtil.hikApi(HikUri.PERSON_BATCH_DELETE, body); JSONObject resultJson = (JSONObject)JSONObject.parse(resultStr); - if (!"0".equals(resultJson.get("code"))) { + //人脸要单独删除 + PersonBatchDeleteRequest personBatchDeleteRequest2 = new PersonBatchDeleteRequest(); + personBatchDeleteRequest2.setFaceId(staffInfo.getStaffFaceId()); + String body2 = JSONObject.toJSONString(personBatchDeleteRequest2); + String resultStr2 = HikUtil.hikApi(HikUri.PERSON_SINGLE_DELETE, body2); + JSONObject resultJson2 = (JSONObject)JSONObject.parse(resultStr2); + if (!"0".equals(resultJson.get("code")) && !"0".equals(resultJson2.get("code")) ) { log.error("请求海康,单个删除人员失败,海康response:{}", resultStr); return ResponseData.error("单个删除人员失败"); } @@ -269,4 +267,21 @@ } return null; } + + @Override + @Transactional(rollbackFor = Exception.class) + public int saveCardInfo(StaffCardRequest staffCardRequest) { + List numFlag = new ArrayList<>(); + staffCardRequest.getCardList().forEach(cardInfo -> { + String staffCode = cardInfo.getPersonId(); + String cardNo = cardInfo.getCardNo(); + if(staffInfoMapper.updateByCodeForCard(staffCode, cardNo) > 0){ + numFlag.add(cardNo); + } + }); + if(staffCardRequest.getCardList().size() != numFlag.size()){ + return 0; + } + return 1; + } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/service/impl/VisitorApplyServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/service/impl/VisitorApplyServiceImpl.java index 497003a..b219984 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/service/impl/VisitorApplyServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/service/impl/VisitorApplyServiceImpl.java @@ -74,9 +74,9 @@ AppointmentFreeRegisterRequest appointmentFreeRegisterRequest = new AppointmentFreeRegisterRequest(); //将时间转换为海康ISO8601格式 DateTime inTimeDate = DateUtil.parse(visitorApply.getInTime()); - String inTimeISODate = DateUtil.format(inTimeDate, "yyyy-MM-dd'T'HH:mm:ss'Z'"); + String inTimeISODate = DateUtil.format(inTimeDate, "yyyy-MM-dd'T'HH:mm:ssXXX"); DateTime outTimeDate = DateUtil.parse(visitorApply.getOutTime()); - String outTimeISODate = DateUtil.format(outTimeDate, "yyyy-MM-dd'T'HH:mm:ss'Z'"); + String outTimeISODate = DateUtil.format(outTimeDate, "yyyy-MM-dd'T'HH:mm:ssXXX"); //海康员工唯一标识receptionistId就是我们录入的到海康的员工号 appointmentFreeRegisterRequest.setReceptionistId(visitorApply.getStaffCode()); appointmentFreeRegisterRequest.setPersonNum(1); @@ -86,7 +86,7 @@ VisitorInfo visitorInfo = new VisitorInfo(); visitorInfo.setVisitorName(visitorApply.getVisitorName()); - visitorInfo.setGender(visitorApply.getVisitorGender()); + visitorInfo.setGender(Integer.valueOf(visitorApply.getVisitorGender())); visitorInfo.setPhoneNo(visitorApply.getVisitorPhone()); visitorInfo.setCertificateNo(visitorApply.getIdCard()); visitorInfo.setCertificateType(111); @@ -121,15 +121,15 @@ appointmentFreeRegisterRequest.setAppointRecordId(visitorApply1.getAppointRecordId()); appointmentFreeRegisterRequest.setReceptionistId(visitorApply1.getStaffCode()); DateTime inTimeDate = DateUtil.parse(visitorApply.getInTime()); - String inTimeISODate = DateUtil.format(inTimeDate, "yyyy-MM-dd'T'HH:mm:ss'Z'"); + String inTimeISODate = DateUtil.format(inTimeDate, "yyyy-MM-dd'T'HH:mm:ssXXX"); DateTime outTimeDate = DateUtil.parse(visitorApply.getOutTime()); - String outTimeISODate = DateUtil.format(outTimeDate, "yyyy-MM-dd'T'HH:mm:ss'Z'"); + String outTimeISODate = DateUtil.format(outTimeDate, "yyyy-MM-dd'T'HH:mm:ssXXX"); appointmentFreeRegisterRequest.setVisitStartTime(inTimeISODate); appointmentFreeRegisterRequest.setVisitEndTime(outTimeISODate); appointmentFreeRegisterRequest.setVisitPurpose(visitorApply.getVisitReason()); VisitorInfo visitorInfo = new VisitorInfo(); visitorInfo.setVisitorName(visitorApply.getVisitorName()); - visitorInfo.setGender(visitorApply.getVisitorGender()); + visitorInfo.setGender(Integer.valueOf(visitorApply.getVisitorGender())); visitorInfo.setPhoneNo(visitorApply.getVisitorPhone()); visitorInfo.setCertificateNo(visitorApply.getIdCard()); visitorInfo.setCertificateType(111); @@ -236,9 +236,9 @@ } } DateTime inTimeDate = DateUtil.parse(busConcentrator.getInTime()); - String inTimeISODate = DateUtil.format(inTimeDate, "yyyy-MM-dd'T'HH:mm:ss'Z'"); + String inTimeISODate = DateUtil.format(inTimeDate, "yyyy-MM-dd'T'HH:mm:ssXXX"); DateTime outTimeDate = DateUtil.parse(busConcentrator.getOutTime()); - String outTimeISODate = DateUtil.format(outTimeDate, "yyyy-MM-dd'T'HH:mm:ss'Z'"); + String outTimeISODate = DateUtil.format(outTimeDate, "yyyy-MM-dd'T'HH:mm:ssXXX"); AppointmentFreeRegisterRequest appointmentFreeRegisterRequest = new AppointmentFreeRegisterRequest(); appointmentFreeRegisterRequest.setReceptionistId(busConcentrator.getStaffCode()); appointmentFreeRegisterRequest.setPersonNum(1); @@ -247,7 +247,7 @@ appointmentFreeRegisterRequest.setVisitPurpose(busConcentrator.getVisitReason()); VisitorInfo visitorInfo = new VisitorInfo(); visitorInfo.setVisitorName(busConcentrator.getVisitorName()); - visitorInfo.setGender(busConcentrator.getVisitorGender()); + visitorInfo.setGender(Integer.valueOf(busConcentrator.getVisitorGender())); visitorInfo.setPhoneNo(busConcentrator.getVisitorPhone()); visitorInfo.setCertificateNo(busConcentrator.getIdCard()); visitorInfo.setCertificateType(111); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/util/ArtemisFor302Util.java b/casic-server/src/main/java/com/casic/missiles/modular/util/ArtemisFor302Util.java new file mode 100644 index 0000000..4edb075 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/util/ArtemisFor302Util.java @@ -0,0 +1,65 @@ +package com.casic.missiles.modular.util; + +import com.hikvision.artemis.sdk.Client; +import com.hikvision.artemis.sdk.Request; +import com.hikvision.artemis.sdk.Response; +import com.hikvision.artemis.sdk.config.ArtemisConfig; +import com.hikvision.artemis.sdk.constant.Constants; +import com.hikvision.artemis.sdk.enums.Method; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.apache.http.HttpHeaders; + +import java.util.HashMap; +import java.util.Map; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/29 20:25 + */ +@Slf4j +public class ArtemisFor302Util { + + public static String doPostStringArtemis(Map path, String body, Map querys, String accept, String contentType, Map header) { + String httpSchema = (String)path.keySet().toArray()[0]; + if (httpSchema != null && !StringUtils.isEmpty(httpSchema)) { + String responseStr = null; + + try { + Map headers = new HashMap(); + if (StringUtils.isNotBlank(accept)) { + headers.put("Accept", accept); + } else { + headers.put("Accept", "*/*"); + } + + if (StringUtils.isNotBlank(contentType)) { + headers.put("Content-Type", contentType); + } else { + headers.put("Content-Type", "application/text;charset=UTF-8"); + } + + if (header != null) { + headers.putAll(header); + } + + Request request = new Request(Method.POST_STRING, httpSchema + ArtemisConfig.host, (String)path.get(httpSchema), ArtemisConfig.appKey, ArtemisConfig.appSecret, Constants.DEFAULT_TIMEOUT); + request.setHeaders(headers); + request.setQuerys(querys); + request.setStringBody(body); + Response response = Client.execute(request); + int statusCode = response.getStatusCode(); + if(statusCode == 302){ + return response.getHeader((HttpHeaders.LOCATION)); + } + + } catch (Exception var11) { + log.error("the Artemis PostString Request is failed, exception:{}", var11.getMessage()); + } + return responseStr; + } else { + throw new RuntimeException("http和https参数错误httpSchema: " + httpSchema); + } + } +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/util/CaseInfoFactoryUtil.java b/casic-server/src/main/java/com/casic/missiles/modular/util/CaseInfoFactoryUtil.java index bde56a9..74da5ea 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/util/CaseInfoFactoryUtil.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/util/CaseInfoFactoryUtil.java @@ -10,6 +10,7 @@ import org.springframework.stereotype.Component; import javax.annotation.Resource; +import java.util.Objects; /** * @Description: 安防事件工厂类 @@ -27,9 +28,12 @@ @Resource private CategoryLevelMapper categoryLevelMapper; - public CaseInfo getCaseInfo(Long eventType) { + public CaseInfo getCaseInfo(Number eventType) { //获取海康事件定义 HikCaseDefine hikCaseDefine = hikCaseDefineMapper.getHikCaseDefine(eventType); + if(Objects.isNull(hikCaseDefine)){ + return null; + } //不同事件类别对事件封装为可入库事件 CaseInfo caseInfo = new CaseInfo(); caseInfo.setHazardLevelCode(hikCaseDefine.getHazardLevelCode()); //危险级别code @@ -39,6 +43,7 @@ caseInfo.setCategoryLevelCode(hikCaseDefine.getCategoryLevelCode()); //事件类别code CaseCategoryLevel categoryLevel = categoryLevelMapper.getCaseCategoryLevel(hikCaseDefine.getCategoryLevelCode()); caseInfo.setTypeName(categoryLevel.getName()); //事件类别 + caseInfo.setHikEventType(hikCaseDefine.getCaseTypeCode()); return caseInfo; } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/util/HikUtil.java b/casic-server/src/main/java/com/casic/missiles/modular/util/HikUtil.java index 2dc14a2..dde810c 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/util/HikUtil.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/util/HikUtil.java @@ -13,9 +13,9 @@ /** * STEP1:设置平台参数,根据实际情况,设置host appkey appsecret 三个参数. */ - ArtemisConfig.host = "192.168.1.22:443"; // artemis网关服务器ip端口 - ArtemisConfig.appKey = "25766251"; // 秘钥appkey - ArtemisConfig.appSecret = "h2o6zXtzCmt8eaOaMkXb";// 秘钥appSecret + ArtemisConfig.host = "192.168.10.2:443"; // artemis网关服务器ip端口 + ArtemisConfig.appKey = "20464298"; // 秘钥appkey + ArtemisConfig.appSecret = "YrvonURk8z9kzYuMWEto";// 秘钥appSecret /** * STEP2:设置OpenAPI接口的上下文 @@ -46,4 +46,43 @@ String result = ArtemisHttpUtil.doPostStringArtemis(path, body, null, null, contentType, null); return result; } + + public static String hikApiFor302(String uri, String body) { + + /** + * STEP1:设置平台参数,根据实际情况,设置host appkey appsecret 三个参数. + */ + ArtemisConfig.host = "192.168.10.2:443"; // artemis网关服务器ip端口 + ArtemisConfig.appKey = "20464298"; // 秘钥appkey + ArtemisConfig.appSecret = "YrvonURk8z9kzYuMWEto";// 秘钥appSecret + + /** + * STEP2:设置OpenAPI接口的上下文 + */ + final String ARTEMIS_PATH = "/artemis"; + + /** + * STEP3:设置接口的URI地址 + */ + final String previewURLsApi = ARTEMIS_PATH + uri; + Map path = new HashMap(2) { + { + put("https://", previewURLsApi);//根据现场环境部署确认是http还是https + } + }; + + /** + * STEP4:设置参数提交方式 + */ + String contentType = "application/json"; + + /** + * STEP5:组装请求参数 + */ + /** + * STEP6:调用接口,post请求application/json类型参数 + */ + String result = ArtemisFor302Util.doPostStringArtemis(path, body, null, null, contentType, null); + return result; + } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/BlackListController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/BlackListController.java index a27f9f8..0c06661 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/BlackListController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/BlackListController.java @@ -1,13 +1,18 @@ package com.casic.missiles.modular.controller; +import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.base.controller.ExportController; import com.casic.missiles.core.page.PageFactory; import com.casic.missiles.model.response.ResponseData; import com.casic.missiles.modular.dto.BlackInfoRequest; +import com.casic.missiles.modular.dto.BlackPictureRequest; +import com.casic.missiles.modular.dto.hik.PersonInfoRequest; +import com.casic.missiles.modular.enums.HikUri; import com.casic.missiles.modular.enums.OperateTypeEnum; import com.casic.missiles.modular.model.BlackInfo; import com.casic.missiles.modular.service.BlackInfoService; +import com.casic.missiles.modular.util.HikUtil; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; @@ -56,4 +61,22 @@ return null; } + /** + * 黑名单人员照片 + */ + @PostMapping("/personPicture") + @ResponseBody + public Object personPicture(@RequestBody BlackPictureRequest blackPictureRequest){ + //获取照片 + String picUri = blackPictureRequest.getPicUri(); + String serverIndexCode = blackPictureRequest.getServerIndexCode(); + PersonInfoRequest picRequest = new PersonInfoRequest(); + picRequest.setPicUri(picUri); + picRequest.setServerIndexCode(serverIndexCode); + String reBody = JSONObject.toJSONString(picRequest); + //重定向地址获取 + String url = HikUtil.hikApiFor302(HikUri.PERSON_PICTURE, reBody); + return ResponseData.success(url); + } + } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/DeviceController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/DeviceController.java index e1c4eba..666bbee 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/DeviceController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/DeviceController.java @@ -107,7 +107,7 @@ } /** - * 设备维修管理查询(分页),需计算MTTR=总维修时间/故障次数 + * 设备状态计算与评判/设备维修管理查询(分页),需计算MTTR=总维修时间/故障次数 */ @PostMapping("/repair/listPage") @ResponseBody @@ -211,7 +211,7 @@ //需根据设备编号获取到对应的门禁点唯一标识 doorControlRequest.setDoorIndexCodes(indexCodes); doorControlRequest.setControlType(Integer.valueOf(gateGroupDTO.getStatus())); - String body = JSONObject.toJSONString(deviceCodes); + String body = JSONObject.toJSONString(doorControlRequest); String resultStr = HikUtil.hikApi(HikUri.DOOR_CONTROL, body); JSONObject resultJson = (JSONObject)JSONObject.parse(resultStr); if (!"0".equals(resultJson.get("code"))) { diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/StaffController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/StaffController.java index b58ccab..704093c 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/StaffController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/StaffController.java @@ -2,15 +2,21 @@ import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.util.StrUtil; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.base.controller.ExportController; import com.casic.missiles.core.page.PageFactory; import com.casic.missiles.model.response.ErrorResponseData; import com.casic.missiles.model.response.ResponseData; import com.casic.missiles.modular.dto.StaffInfoRequest; +import com.casic.missiles.modular.dto.hik.PersonInfoRequest; +import com.casic.missiles.modular.dto.hik.StaffCardRequest; +import com.casic.missiles.modular.enums.HikUri; import com.casic.missiles.modular.enums.OperateTypeEnum; import com.casic.missiles.modular.model.StaffInfo; import com.casic.missiles.modular.service.StaffInfoService; +import com.casic.missiles.modular.util.HikUtil; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; @@ -110,4 +116,60 @@ } return ResponseData.success(); } + + /** + * 批量开卡,添加人员之后调用,若在一个接口中添加人员成功开卡失败则第二次添加时会有问题 + */ + @PostMapping("/cardBinding") + @ResponseBody + public Object cardBinding(@RequestBody StaffCardRequest staffCardRequest) { + String body = JSONObject.toJSONString(staffCardRequest); + String resultStr = HikUtil.hikApi(HikUri.CARD_BINDING, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (!"0".equals(resultJson.get("code"))) { + log.error("请求海康,批量开卡失败,海康response:{}", resultStr); + return ResponseData.error("批量开卡失败"); + } + //保存卡号 + if(staffInfoService.saveCardInfo(staffCardRequest) > 0){ + return ResponseData.success(); + } + return ResponseData.error("批量开卡失败"); + } + + /** + * 获取员工照片,海康存储 + */ + @PostMapping("/personPicture/{staffCode}") + @ResponseBody + public Object personPicture(@PathVariable("staffCode") String staffCode){ + //获取员工详细信息,含图片服务器、uri + PersonInfoRequest request = new PersonInfoRequest(); + List list = new ArrayList<>(); + list.add(staffCode); + request.setParamName("personId"); + request.setParamValue(list); + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi(HikUri.PERSON_INFO, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (!"0".equals(resultJson.get("code"))) { + log.error("请求海康,根据人员唯一字段获取人员详细信息失败,海康response:{}", resultStr); + return ResponseData.error("获取员工照片失败"); + } + //获取照片 + JSONObject data = (JSONObject) resultJson.get("data"); + JSONArray dataArray = (JSONArray) data.get("list"); + JSONObject jsonObject = (JSONObject) dataArray.get(0); + JSONArray personPhoto = (JSONArray) jsonObject.get("personPhoto"); + JSONObject photo = (JSONObject) personPhoto.get(0); + String picUri = photo.getString("picUri"); + String serverIndexCode = photo.getString("serverIndexCode"); + PersonInfoRequest picRequest = new PersonInfoRequest(); + picRequest.setPicUri(picUri); + picRequest.setServerIndexCode(serverIndexCode); + String reBody = JSONObject.toJSONString(picRequest); + //重定向地址获取 + String url = HikUtil.hikApiFor302(HikUri.PERSON_PICTURE, reBody); + return ResponseData.success(url); + } } 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 4a07dd9..7b1dcf6 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 @@ -16,6 +16,7 @@ import com.casic.missiles.modular.redis.key.CacheKeys; import com.casic.missiles.modular.service.CockpitService; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.util.CollectionUtils; import org.springframework.web.bind.annotation.*; @@ -24,10 +25,7 @@ import java.text.NumberFormat; import java.time.LocalDateTime; import java.time.temporal.ChronoUnit; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.util.*; import java.util.stream.Collectors; /** @@ -73,6 +71,9 @@ private StatisticNumberMapper numberMapper; @Autowired + private HazardLevelMapper hazardLevelMapper; + + @Autowired private AccessGroupConfig accessGroupConfig; /** @@ -104,8 +105,24 @@ public Object buildingNumberPerHour(){ //当天按小时分组的人数 List list = numberMapper.selectListByTime(); - Map> collect = list.stream().collect(Collectors.groupingBy(BuildingNumberDTO::getStatisticPosition)); - return ResponseData.success(collect); + Map> collect = list.stream().collect(Collectors.groupingBy(BuildingNumberDTO::getStatisticTime)); + //定时任务中已将每小时三栋楼人数存到数据库 + //将一期主楼和录制楼人数合并,二期单算 + List> resultList = new ArrayList<>(); + collect.keySet().forEach(key -> { + List buildingNumberDTOS = collect.get(key); + BuildingNumberDTO mainBuildingOne = buildingNumberDTOS.get(0); + BuildingNumberDTO mainBuildingTwo = buildingNumberDTOS.get(1); + BuildingNumberDTO recordingBuilding = buildingNumberDTOS.get(2); + HashMap resultMap = new HashMap<>(); + Integer oneQuantity = Integer.valueOf(mainBuildingOne.getStatisticQuantity()); + Integer recordingQuantity = Integer.valueOf(recordingBuilding.getStatisticQuantity()); + resultMap.put("staticTime", mainBuildingOne.getStatisticTime()); + resultMap.put(mainBuildingOne.getStatisticPositionName()+"、"+recordingBuilding.getStatisticPositionName(), String.valueOf(oneQuantity+recordingQuantity)); + resultMap.put(mainBuildingTwo.getStatisticPositionName(), mainBuildingTwo.getStatisticQuantity()); + resultList.add(resultMap); + }); + return ResponseData.success(resultList); } /** @@ -151,12 +168,11 @@ public Object securityNumber() { QueryWrapper wrapper = new QueryWrapper<>(); wrapper.eq("staff_type", 2); + // TODO: 2022/9/2 后续使用产品确定的每天出勤的安保人员的数量 Integer total = staffInfoMapper.selectCount(wrapper); - //当日离岗事件个数 - QueryWrapper wrapper1 = new QueryWrapper<>(); - wrapper1.eq("hik_event_type", SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); - wrapper1.apply("date_format(now(),'%Y-%m-%d') = date_format(happen_time,'%Y-%m-%d')"); - Integer leave = caseInfoMapper.selectCount(wrapper1); + //当日离岗事件按设备去重后的个数 + // TODO: 2022/9/2 目前相当于24小时内的计算,之后看需要可改成自定义小时数计算离岗率,即离岗+6小时内仅一次离岗则恢复为100%,多次则累加离岗次数计算离岗率 + Integer leave = caseInfoMapper.selectDemobilizedCount(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); NumberFormat numberFormat = NumberFormat.getInstance(); // 设置精确到小数点后2位 numberFormat.setMaximumFractionDigits(2); @@ -179,7 +195,6 @@ @ResponseBody public Object visitorApplyDetail() { List reasonGroup = applyMapper.selectByVisitReason(); - HashMap resultMap = new HashMap<>(); NumberFormat numberFormat = NumberFormat.getInstance(); // 设置精确到小数点后2位 numberFormat.setMaximumFractionDigits(2); @@ -187,12 +202,17 @@ if(0 == sum){ return ResponseData.success(); } + List resultList = new ArrayList<>(); reasonGroup.forEach(group -> { String reasonName = dictService.getDictNameByCode(SecurityEventDict.VISIT_REASON, group.getVisitReason()); String result = numberFormat.format((float) group.getQuantity() / (float) sum * 100); - resultMap.put(reasonName, result+"%"); + ApplyReasonGroupDTO applyReasonGroupDTO = new ApplyReasonGroupDTO(); + applyReasonGroupDTO.setQuantity(group.getQuantity()); + applyReasonGroupDTO.setVisitReason(reasonName); + applyReasonGroupDTO.setRatio(result+"%"); + resultList.add(applyReasonGroupDTO); }); - return ResponseData.success(resultMap); + return ResponseData.success(resultList); } /** @@ -247,6 +267,32 @@ } /** + * 机动力量实时在岗率,在岗人数除以总应在岗人数,用离岗+6小时内恢复为100%,6小时外再计算 + */ + @GetMapping("/staff/beOnDutyRatio") + @ResponseBody + public Object beOnDutyRatio() { + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("staff_type", 2); + // TODO: 2022/9/2 后续使用产品确定的每天出勤的安保人员的数量 + Integer total = staffInfoMapper.selectCount(wrapper); + if(0 == total){ + return ResponseData.success(null); + } + //当日离岗事件按设备去重后的个数 + // TODO: 2022/9/2 目前相当于24小时内的计算,之后看需要可改成自定义小时数计算离岗率,即离岗+6小时内仅一次离岗则恢复为100%,多次则累加离岗次数计算离岗率 + List onDutyRatioDTOS = caseInfoMapper.selectDemobilizedCountByHour(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); + onDutyRatioDTOS.forEach(dto -> { + NumberFormat numberFormat = NumberFormat.getInstance(); + // 设置精确到小数点后2位 + numberFormat.setMaximumFractionDigits(2); + String result = numberFormat.format(100 - Float.valueOf(dto.getQuantity()) / (float) total * 100); + dto.setRatio(result+"%"); + }); + return ResponseData.success(onDutyRatioDTOS); + } + + /** * 闸机速通门统计-设备状态分组计算数量,devType传闸机字典key * 视频频监控摄像机统计-设备状态分组计算数量,devType传摄像头字典key */ @@ -262,12 +308,17 @@ if(sum <= 0){ return ResponseData.error("无该类设备信息"); } + List resultList = new ArrayList<>(); gateStatusGroup.forEach(group -> { String devStatus = dictService.getDictNameByCode(SecurityEventDict.DEVICE_STATUS, group.getStatus()); String result = numberFormat.format((float) group.getQuantity() / (float) sum * 100); - resultMap.put(devStatus, result+"%"); + GateStatusGroupResponse gateStatusGroupResponse = new GateStatusGroupResponse(); + gateStatusGroupResponse.setStatus(devStatus); + gateStatusGroupResponse.setRatio(result+"%"); + resultList.add(gateStatusGroupResponse); }); - resultMap.put("总", sum); + resultMap.put("total", sum); + resultMap.put("list", resultList); return ResponseData.success(resultMap); } @@ -282,17 +333,38 @@ String position = securityScoreDTO.getPosition(); List caseInfos = caseInfoMapper.selectByPosition(position); //查询各危险级别权重、各类别权重,放入map,避免循环中多次查数据库 - + HashMap hazardScoreMap = new HashMap<>(); + List caseHazardLevelList = hazardLevelMapper.getCaseHazardLevelList(null); + caseHazardLevelList.forEach(hazardLevel -> { + hazardScoreMap.put(hazardLevel.getCode(), hazardLevel.getWeight()); + }); + HashMap categoryScoreMap = new HashMap<>(); + List categoryLevelList = categoryLevelMapper.getCaseCategoryLevelList(null); + categoryLevelList.forEach(categoryLevel -> { + categoryScoreMap.put(categoryLevel.getCode(), categoryLevel.getWeight()); + }); + //事件按楼层分组,计算 List securityScoreDTOs = new ArrayList<>(); caseInfos.forEach(caseInfo -> { SecurityScoreDTO securityScoreDTO1 = new SecurityScoreDTO(); + securityScoreDTO1.setPosition(caseInfo.getPosition()); securityScoreDTO1.setArea(caseInfo.getArea()); - // TODO: 2022/8/4 楼层评分计算根据产品定义调整 -// caseInfo.get -// securityScoreDTO1.setScore(); + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); + Double score = 100 - Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + securityScoreDTO1.setScore(score); + securityScoreDTOs.add(securityScoreDTO1); }); - - return null; + 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); + }); + return ResponseData.success(securityScoreDTOs); } /** @@ -303,9 +375,13 @@ public Object SecurityFrequency(@RequestBody SecurityFrequencyDTO securityFrequencyDTO) { String year = securityFrequencyDTO.getYear(); String month = securityFrequencyDTO.getMonth(); - Integer quantity = caseInfoMapper.selectCountByMonth(year, month); - securityFrequencyDTO.setQuantity(quantity); - return ResponseData.success(securityFrequencyDTO); + if(!StringUtils.isEmpty(year) && StringUtils.isEmpty(month)){ + Integer quantity = caseInfoMapper.selectCountByMonth(year, month); + securityFrequencyDTO.setQuantity(quantity); + return ResponseData.success(securityFrequencyDTO); + } + List list = caseInfoMapper.selectPreMonthCount(); + return ResponseData.success(list); } } 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 ae4d770..f4f075c 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 @@ -1,20 +1,25 @@ package com.casic.missiles.modular.controller.cockpit; +import cn.hutool.core.date.DateUnit; import cn.hutool.core.date.DateUtil; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.casic.missiles.model.response.ResponseData; -import com.casic.missiles.modular.dao.AttendanceInfoMapper; -import com.casic.missiles.modular.dao.CaseInfoMapper; -import com.casic.missiles.modular.dao.HazardLevelMapper; -import com.casic.missiles.modular.dao.StaffInfoMapper; +import com.casic.missiles.modular.dao.*; +import com.casic.missiles.modular.dto.DeviceRepairLogDTO; +import com.casic.missiles.modular.dto.DeviceRepairRequest; import com.casic.missiles.modular.dto.statistics.*; +import com.casic.missiles.modular.enums.SecurityEventType; +import com.casic.missiles.modular.model.CaseCategoryLevel; import com.casic.missiles.modular.model.CaseHazardLevel; +import com.casic.missiles.modular.model.CaseInfo; import com.casic.missiles.modular.model.StaffInfo; +import com.casic.missiles.modular.service.DeviceInfoService; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.util.CollectionUtils; import org.springframework.web.bind.annotation.*; +import java.math.BigDecimal; import java.text.NumberFormat; import java.util.*; import java.util.stream.Collectors; @@ -40,6 +45,12 @@ @Autowired private HazardLevelMapper hazardLevelMapper; + @Autowired + private CategoryLevelMapper categoryLevelMapper; + + @Autowired + private DeviceInfoService deviceInfoService; + /** * 安防事件时域频次统计,每月的每天安防事件个数(原方案) * 月维度:展示每个月的每天的数据 @@ -89,15 +100,17 @@ List monthList = caseInfoMapper.selectPreMonthCountByYear(year); Map> collect = monthList.stream().collect(Collectors.groupingBy(PreMonthOrWeekCaseDTO::getHazardLevelCode)); HashMap strAvgMap = new HashMap<>(); + List resultList = new ArrayList<>(); for (String key : collect.keySet()) { List preMonthOrWeekCaseDTOS = collect.get(key); int sum = preMonthOrWeekCaseDTOS.stream().mapToInt(PreMonthOrWeekCaseDTO::getQuantity).sum(); //若年份是本年,则使用个安防级别数量/当前月份数 //若不是本年,除数为12 MonthAndWeekDTO monthAndWeekDTO = new MonthAndWeekDTO(); + String hazardName = hazardLevelMapper.selectHazardNameByCode(key); + monthAndWeekDTO.setLevelName(hazardName); if(year.equals(String.valueOf(DateUtil.thisYear()))){ monthAndWeekDTO.setMonthQuantity(sum / DateUtil.thisMonth()); -// monthAndWeekDTO.setLevelName(); strAvgMap.put(key, monthAndWeekDTO); }else{ monthAndWeekDTO.setMonthQuantity(sum / 12); @@ -113,27 +126,37 @@ if(year.equals(String.valueOf(DateUtil.thisYear()))){ if(!Objects.isNull(strAvgMap.get(key))){ MonthAndWeekDTO monthAndWeekDTO = strAvgMap.get(key); + String hazardName = hazardLevelMapper.selectHazardNameByCode(key); + monthAndWeekDTO.setLevelName(hazardName); monthAndWeekDTO.setWeekQuantity(sum / DateUtil.thisWeekOfYear()); strAvgMap.put(key, monthAndWeekDTO); }else{ MonthAndWeekDTO monthAndWeekDTO = new MonthAndWeekDTO(); + String hazardName = hazardLevelMapper.selectHazardNameByCode(key); + monthAndWeekDTO.setLevelName(hazardName); monthAndWeekDTO.setWeekQuantity(sum / DateUtil.thisWeekOfYear()); strAvgMap.put(key, monthAndWeekDTO); } }else{ if(!Objects.isNull(strAvgMap.get(key))){ MonthAndWeekDTO monthAndWeekDTO = strAvgMap.get(key); + String hazardName = hazardLevelMapper.selectHazardNameByCode(key); + monthAndWeekDTO.setLevelName(hazardName); monthAndWeekDTO.setWeekQuantity(sum / 52); strAvgMap.put(key, monthAndWeekDTO); }else{ MonthAndWeekDTO monthAndWeekDTO = new MonthAndWeekDTO(); + String hazardName = hazardLevelMapper.selectHazardNameByCode(key); + monthAndWeekDTO.setLevelName(hazardName); monthAndWeekDTO.setWeekQuantity(sum / 52); strAvgMap.put(key, monthAndWeekDTO); } } } - avgMonthAndWeekGroupDTO.setMap(strAvgMap); - return ResponseData.success(avgMonthAndWeekGroupDTO); + strAvgMap.keySet().forEach(key -> { + resultList.add(strAvgMap.get(key)); + }); + return ResponseData.success(resultList); } /** @@ -181,12 +204,178 @@ } /** - * 员工考勤人数变化,功能待定 + * 员工考勤人数变化,统计当天(横坐标为时)及近7天(横坐标为天)的考勤人数变化,只要发生一次考勤识别,次数的基数就正常增加(没有上班下班区分) */ + @PostMapping("/staff/attendanceNumber/{dimension}") + @ResponseBody + public Object attendanceNumber(@PathVariable("dimension") String dimension) { + List attendanceNumberDTOs = null; + List> resultList = new ArrayList<>(); + if("week".equals(dimension)){ + //近7天数据按天分组统计 + attendanceNumberDTOs = attendanceInfoMapper.getCountForWeek(); + }else if("day".equals(dimension)) { + //今天数据按小时分组统计 + attendanceNumberDTOs = attendanceInfoMapper.getCountForDay(); + } + if(CollectionUtils.isEmpty(attendanceNumberDTOs)){ + return ResponseData.error("该查询条件下,无员工出勤数据!"); + } + Map> collect = attendanceNumberDTOs.stream().collect(Collectors.groupingBy(AttendanceNumberDTO::getDate)); + collect.keySet().forEach(key -> { + List attendanceNumberDTOS = collect.get(key); + AttendanceNumberDTO attendanceNumberDTO = attendanceNumberDTOS.get(0); + AttendanceNumberDTO attendanceNumberDTO2 = attendanceNumberDTOS.get(1); + Map resultMap = new HashMap<>(); + resultMap.put(attendanceNumberDTO.getStaffType(), attendanceNumberDTO.getQuantity()); + resultMap.put(attendanceNumberDTO2.getStaffType(), attendanceNumberDTO2.getQuantity()); + resultMap.put("staticTime", attendanceNumberDTO.getDate()); + resultList.add(resultMap); + }); + return ResponseData.success(resultList); + } /** - * 近30天/近一周安保人员到岗排行 + * 早晚高峰区域安防评估 */ + @PostMapping("/security/assessment/{dimension}") + @ResponseBody + public Object securityAssessment(@PathVariable("dimension") String dimension) { + //查询各危险级别权重、各类别权重,放入map,避免循环中多次查数据库 + HashMap hazardScoreMap = new HashMap<>(); + List caseHazardLevelList = hazardLevelMapper.getCaseHazardLevelList(null); + caseHazardLevelList.forEach(hazardLevel -> { + hazardScoreMap.put(hazardLevel.getCode(), hazardLevel.getWeight()); + }); + HashMap categoryScoreMap = new HashMap<>(); + List categoryLevelList = categoryLevelMapper.getCaseCategoryLevelList(null); + categoryLevelList.forEach(categoryLevel -> { + categoryScoreMap.put(categoryLevel.getCode(), categoryLevel.getWeight()); + }); + HashMap hashMap = new HashMap<>(); + if("week".equals(dimension)){ + //近7天早晚高峰数据 + List caseInfos = caseInfoMapper.selectListBySevenDay(); + //按时间(天)进行分组 + caseInfos.forEach(caseInfo -> { + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); + Double score = Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + String[] array = caseInfo.getHappenTime().split(" "); + String dayTime = array[0]; + BigDecimal preScore; + if(hashMap.containsKey(dayTime)){ + Double aDouble = hashMap.get(dayTime); + preScore = new BigDecimal(aDouble.toString()); + + }else{ + preScore = new BigDecimal("100.0"); + } + BigDecimal nowScore = new BigDecimal(score.toString()); + hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); + }); + return ResponseData.success(hashMap); + }else if("day".equals(dimension)) { + //今天数据按小时分组统计 + List caseInfos = caseInfoMapper.selectListByToday(); + caseInfos.forEach(caseInfo -> { + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); + Double score = Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + String[] array = caseInfo.getHappenTime().split(":"); + String dayTime = array[0]; + BigDecimal preScore; + if(hashMap.containsKey(dayTime)){ + Double aDouble = hashMap.get(dayTime); + preScore = new BigDecimal(aDouble.toString()); + + }else{ + preScore = new BigDecimal("100.0"); + } + BigDecimal nowScore = new BigDecimal(score.toString()); + hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); + }); + return ResponseData.success(hashMap); + } + return null; + } + + /** + * 重点区域安防事态评估,统计重点区域6:00-23:00按小时分组数据 + */ + @GetMapping("/security/keyAreaStatistic") + @ResponseBody + public Object keyAreaStatistic() { + //查询各危险级别权重、各类别权重,放入map,避免循环中多次查数据库 + HashMap hazardScoreMap = new HashMap<>(); + List caseHazardLevelList = hazardLevelMapper.getCaseHazardLevelList(null); + caseHazardLevelList.forEach(hazardLevel -> { + hazardScoreMap.put(hazardLevel.getCode(), hazardLevel.getWeight()); + }); + HashMap categoryScoreMap = new HashMap<>(); + List categoryLevelList = categoryLevelMapper.getCaseCategoryLevelList(null); + categoryLevelList.forEach(categoryLevel -> { + categoryScoreMap.put(categoryLevel.getCode(), categoryLevel.getWeight()); + }); + HashMap hashMap = new HashMap<>(); + //今天数据按小时分组统计 + List caseInfos = caseInfoMapper.selectListByToday2(); + caseInfos.forEach(caseInfo -> { + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); + Double score = Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + String[] array = caseInfo.getHappenTime().split(":"); + String dayTime = array[0]; + BigDecimal preScore; + if(hashMap.containsKey(dayTime)){ + Double aDouble = hashMap.get(dayTime); + preScore = new BigDecimal(aDouble.toString()); + + }else{ + preScore = new BigDecimal("100.0"); + } + BigDecimal nowScore = new BigDecimal(score.toString()); + hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); + }); + return ResponseData.success(hashMap); + } + + /** + * 安防机动支援力量调配响应评估,根据事件已解决状态及已解决时间-发送时间,按时间(小时)分组统计 + */ + @GetMapping("/security/responseAssess") + @ResponseBody + public Object responseAssess() { + //查询各危险级别权重、各类别权重,放入map,避免循环中多次查数据库 + HashMap hazardScoreMap = new HashMap<>(); + List caseHazardLevelList = hazardLevelMapper.getCaseHazardLevelList(null); + caseHazardLevelList.forEach(hazardLevel -> { + hazardScoreMap.put(hazardLevel.getCode(), hazardLevel.getWeight()); + }); + HashMap hashMap = new HashMap<>(); + //今天数据按小时分组统计 + List caseInfos = caseInfoMapper.selectListByToday3(); + caseInfos.forEach(caseInfo -> { + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + //扣分=事件级别权重*未解决小时数 + Date updateTime = DateUtil.parse(caseInfo.getUpdateTime()); + Date happenTime = DateUtil.parse(caseInfo.getHappenTime()); + long between = DateUtil.between(updateTime, happenTime, DateUnit.HOUR); + Double score = Double.valueOf(hazardWeight)*between; + String[] array = caseInfo.getHappenTime().split(":"); + String dayTime = array[0]; + BigDecimal preScore; + if(hashMap.containsKey(dayTime)){ + Double aDouble = hashMap.get(dayTime); + preScore = new BigDecimal(aDouble.toString()); + }else{ + preScore = new BigDecimal("100.0"); + } + BigDecimal nowScore = new BigDecimal(score.toString()); + hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); + }); + return ResponseData.success(hashMap); + } /** * 重点区域威胁事件类型统计,优先级2,统计近7天和近30天 @@ -224,7 +413,34 @@ } /** - * 设备状态计算系数和评判,优先级3,需确认设备恢复时间是否可以获取 + * 近30天/近一周安保人员到岗排行 */ + + /** + * 安保等级评估,发生离岗事件减1分 + */ + @GetMapping("/security/levelAssess") + @ResponseBody + public Object securityLevelAssess() { + //今天数据按小时分组统计 + List resultList = caseInfoMapper.selectListByType(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); + resultList.forEach(result -> { + BigDecimal deScore = new BigDecimal(result.getQuantity()); + BigDecimal preScore = new BigDecimal("100.0"); + result.setScore(preScore.subtract(deScore).doubleValue()); + }); + return ResponseData.success(resultList); + } + + /** + * 设备状态计算系数和评判,即设备维修管理查询(不分页) + */ + @PostMapping("/device/repairList") + @ResponseBody + public Object repairList(@RequestBody DeviceRepairRequest deviceRepairRequest) { + List deviceRepairLogDTOS = deviceInfoService.deviceRepairListPage(deviceRepairRequest); + return ResponseData.success(deviceRepairLogDTOS); + } + } 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 fbf8ab6..c71a15a 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 @@ -1,13 +1,12 @@ package com.casic.missiles.modular.controller.hik; +import cn.hutool.core.date.DateTime; +import cn.hutool.core.date.DateUtil; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.casic.missiles.model.response.ResponseData; import com.casic.missiles.modular.dao.HikFaceGroupInfoMapper; -import com.casic.missiles.modular.dto.hik.EventSubscribeRequest; -import com.casic.missiles.modular.dto.hik.FaceGroupAdditionRequest; -import com.casic.missiles.modular.dto.hik.HikRecvEvent; -import com.casic.missiles.modular.dto.hik.OrgBatchAdd; +import com.casic.missiles.modular.dto.hik.*; import com.casic.missiles.modular.enums.HikUri; import com.casic.missiles.modular.enums.SecurityEventType; import com.casic.missiles.modular.model.CaseInfo; @@ -18,16 +17,20 @@ import com.casic.missiles.modular.util.CaseInfoFactoryUtil; import com.casic.missiles.modular.util.HikUtil; import com.casic.missiles.modular.util.ThreadPoolUtil; +import com.casic.missiles.modular.util.WebSocket; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; -import org.springframework.web.bind.annotation.*; +import org.springframework.util.CollectionUtils; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.RestController; -import java.net.InetAddress; -import java.net.UnknownHostException; import java.util.ArrayList; +import java.util.Iterator; import java.util.List; import java.util.Objects; @@ -38,7 +41,6 @@ */ @Slf4j @RestController -@RequestMapping("/hik") public class HikController { @Autowired @@ -53,28 +55,37 @@ @Autowired private HikService hikService; + @Autowired + private HikFaceGroupInfoMapper hikFaceGroupInfoMapper; + + @Autowired + private WebSocket webSocket; + @Value("${server.port}") private int serverPort; - @Autowired - private HikFaceGroupInfoMapper hikFaceGroupInfoMapper; /** * 海康事件订阅 */ - @PostMapping("/event/subscribe") + @PostMapping("/hik/event/subscribe") @ResponseBody - public Object eventSubscribe() throws UnknownHostException { + public Object eventSubscribe() { EventSubscribeRequest eventSubscribeRequest = new EventSubscribeRequest(); ArrayList list = new ArrayList<>(); list.add(SecurityEventType.DEVICE_OFFLINE); + list.add(SecurityEventType.DEVICE_ONLINE); list.add(SecurityEventType.KEY_PERSONNEL_IDENTIFY_EVENT); list.add(SecurityEventType.MONITORING_POINT_OFFLINE); + list.add(SecurityEventType.MONITORING_POINT_ONLINE); list.add(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); list.add(SecurityEventType.PERSONNEL_GATHER_EVENT); - InetAddress localHost = InetAddress.getLocalHost(); + list.add(SecurityEventType.VISITOR_REGISTER); + list.add(SecurityEventType.VISITOR_CHECKOUT); + list.add(SecurityEventType.HIGH_ALTITUDE_PARABOLIC); +// InetAddress localHost = InetAddress.getLocalHost(); eventSubscribeRequest.setEventTypes(list); - eventSubscribeRequest.setEventDest("https://" + localHost + ":" + serverPort + "/eventRcv"); + eventSubscribeRequest.setEventDest("http://" + "192.168.10.6" + ":" + serverPort + "/eventRcv"); //订阅类型,0-订阅原始事件,1-联动事件,2-原始事件和联动事件,不填使用默认值0 eventSubscribeRequest.setSubType(0); /** @@ -92,19 +103,25 @@ } /** + * 查询事件订阅信息 + */ + @PostMapping("/hik/event/query") + @ResponseBody + public Object eventQuery() { + String result = HikUtil.hikApi(HikUri.EVENT_INFO, ""); + return result; + } + + /** * 海康事件接收 */ @PostMapping("/eventRcv") @ResponseBody public Object eventRcv(@RequestBody HikRecvEvent hikRecvEvent) { //1、接收所需事件类型 - Long eventType = hikRecvEvent.getEventType(); + Number eventType = hikRecvEvent.getEventType(); log.info("接收到安防事件类型为:{}", eventType); CaseInfo caseInfo = caseInfoFactoryUtil.getCaseInfo(eventType); - //接收到不关心事件直接返回 - if(Objects.isNull(caseInfo)){ - return ResponseData.success(); - } //2、不同事件不同处理,caseInfoFactoryUtil已设置好事件基础定义信息 // 再为事件添加状态、设备编码、设备名称、位置、区域、时间 // 异步处理事件 @@ -114,19 +131,23 @@ caseHandle(hikRecvEvent, eventType, caseInfo); } })); +// caseHandle(hikRecvEvent, eventType, caseInfo); - return null; + return ResponseData.success(); } - private void caseHandle(HikRecvEvent hikRecvEvent, Long eventType, CaseInfo caseInfo) { + private void caseHandle(HikRecvEvent hikRecvEvent, Number eventType, CaseInfo caseInfo) { JSONArray eventArray = hikRecvEvent.getEventArray(); List caseInfos = new ArrayList<>(); - while (eventArray.stream().iterator().hasNext()) { + Iterator iterator = eventArray.iterator(); + while (iterator.hasNext()) { CaseInfo caseInfo1 = new CaseInfo(); - BeanUtils.copyProperties(caseInfo, caseInfo1); - JSONObject event = (JSONObject) eventArray.stream().iterator().next(); + if(!Objects.isNull(caseInfo)){ + BeanUtils.copyProperties(caseInfo, caseInfo1); + } + JSONObject event = (JSONObject) iterator.next(); //5种事件进行不同处理 - if(SecurityEventType.KEY_PERSONNEL_IDENTIFY_EVENT == eventType){ + if (SecurityEventType.KEY_PERSONNEL_IDENTIFY_EVENT.equals(eventType)) { //判断所属人脸分组 JSONObject data = (JSONObject) event.get("data"); JSONObject faceRecognitionResult = (JSONObject) data.get("faceRecognitionResult"); @@ -142,52 +163,101 @@ if (faceGroupCode.equals(blackListGroup.getFaceGroupCode())) { //黑名单分组处理 caseInfo1 = hikService.blackListHandle(event, caseInfo1); - }else if(faceGroupCode.equals(propertyPersonnelGroup.getFaceGroupCode())){ + } else if (faceGroupCode.equals(propertyPersonnelGroup.getFaceGroupCode())) { //考勤分组处理-物业人员,添加到考勤表 hikService.propertyAttendanceHandle(event); - }else if(faceGroupCode.equals(securityPersonnelGroup.getFaceGroupCode())){ + } else if (faceGroupCode.equals(securityPersonnelGroup.getFaceGroupCode())) { //考勤分组处理-安保人员,添加到考勤表 hikService.securityPersonnelHandle(event); - }else { + } else { return; } - }else if(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT == eventType){ + } else if (SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT.equals(eventType)) { //离岗事件处理 caseInfo1 = hikService.demobilizedHandle(event, caseInfo1); - }else if(SecurityEventType.PERSONNEL_GATHER_EVENT == eventType){ + } else if (SecurityEventType.PERSONNEL_GATHER_EVENT.equals(eventType)) { //人员聚集事件处理 caseInfo1 = hikService.personGatherHandle(event, caseInfo1); - }else if(SecurityEventType.MONITORING_POINT_OFFLINE == eventType){ + } else if (SecurityEventType.MONITORING_POINT_OFFLINE.equals(eventType)) { //监控点离线事件处理 caseInfo1 = hikService.monitorPointOfflineHandle(event, caseInfo1); - }else if(SecurityEventType.DEVICE_OFFLINE == eventType){ + } else if (SecurityEventType.MONITORING_POINT_ONLINE.equals(eventType)) { + //监控点上线事件处理 + hikService.monitorPointOnlineHandle(event); + } else if (SecurityEventType.DEVICE_OFFLINE.equals(eventType)) { //装置离线事件处理 caseInfo1 = hikService.deviceOfflineHandle(event, caseInfo1); - }else if(SecurityEventType.VISITOR_REGISTER == eventType){ + } else if (SecurityEventType.DEVICE_ONLINE.equals(eventType)) { + //装置上线处理 + hikService.deviceOnlineHandle(event); + } else if (SecurityEventType.VISITOR_REGISTER.equals(eventType)) { //记录访客登记记录,添加到访客记录表 hikService.visitorRegisterHandler(event); - }else if(SecurityEventType.VISITOR_CHECKOUT == eventType){ + } else if (SecurityEventType.VISITOR_CHECKOUT.equals(eventType)) { //记录访客签离记录 hikService.visitorCheckOutHandler(event); } - if(!Objects.isNull(caseInfo1) && !StringUtils.isEmpty(caseInfo1.getHappenTime())){ + if (!Objects.isNull(caseInfo1) && !StringUtils.isEmpty(caseInfo1.getHappenTime())) { caseInfos.add(caseInfo1); } } //3、安防事件入库 - if(!caseInfoService.insertCaseInfoBatch(caseInfos)){ - log.error("安防事件批量入库异常"); + if (!CollectionUtils.isEmpty(caseInfos) && !caseInfoService.insertCaseInfoBatch(caseInfos)) { + log.error("安防事件批量入库异常!"); } // TODO: 2022/8/15 webSocket推送 + if (CollectionUtils.isEmpty(caseInfos)) { + log.info("webSocket事件推送"); + webSocket.sendAllMessage(JSONObject.toJSONString(caseInfos)); + } return; } /** + * 以图搜图,前端用于轨迹追踪 + */ + @PostMapping("/hik/search/picture") + @ResponseBody + public Object searchPictures(@RequestBody SearchPicturesRequest searchPicturesRequest) { + DateTime startDateTime = DateUtil.parse(searchPicturesRequest.getStartTime()); + DateTime endDateTime = DateUtil.parse(searchPicturesRequest.getEndTime()); + String startTime = DateUtil.format(startDateTime, "yyyy-MM-dd'T'HH:mm:ss.SSSXXX"); + String endTime = DateUtil.format(endDateTime, "yyyy-MM-dd'T'HH:mm:ss.SSSXXX"); + searchPicturesRequest.setStartTime(startTime); + searchPicturesRequest.setEndTime(endTime); + String body = JSONObject.toJSONString(searchPicturesRequest); + String resultStr = HikUtil.hikApi(HikUri.SEARCH_PICTURES, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (!"0".equals(resultJson.get("code"))) { + log.error("请求海康,以图搜图失败,海康response:{}", resultStr); + return ResponseData.error("以图搜图失败"); + } + return ResponseData.success(resultJson); + } + + + /** + * 海康事件取消订阅 + */ + @PostMapping("/hik/event/cancel") + @ResponseBody + public Object eventCancelSubscribe(@RequestBody CancelSubscribeRequest cancelSubscribeRequest) { + String body = JSONObject.toJSONString(cancelSubscribeRequest); + String resultStr = HikUtil.hikApi(HikUri.EVENT_CANCEL, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (!"0".equals(resultJson.get("code"))) { + log.error("请求海康,取消订阅失败,海康response:{}", resultStr); + return ResponseData.error("取消订阅失败"); + } + return ResponseData.success(resultJson); + } + + /** * 单个添加海康人脸分组 * api->hik单个添加人脸分组api->response->mysql */ - @PostMapping("/faceGroup/single/add") + @PostMapping("/hik/faceGroup/single/add") @ResponseBody public Object faceGroupAddition(@RequestBody FaceGroupAdditionRequest faceGroupAdditionRequest) { String body = JSONObject.toJSONString(faceGroupAdditionRequest); @@ -212,7 +282,7 @@ * 批量添加海康组织 * api->hik批量添加组织api->response */ - @PostMapping("/org/batch/add") + @PostMapping("/hik/org/batch/add") @ResponseBody public Object orgBatchAdd(@RequestBody List orgBatchAddRequest) { String body = JSONObject.toJSONString(orgBatchAddRequest); @@ -232,4 +302,62 @@ return ResponseData.error("批量添加组织失败"); } + /** + * 获取人员列表 + */ + @PostMapping("/hik/person/personList") + @ResponseBody + public Object personList() { + PersonListRequest request = new PersonListRequest(); + request.setPageNo(1); + request.setPageSize(100); + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi("/api/resource/v2/person/personList", body); + return resultStr; + } + + /** + * 获取组织列表 + */ + @PostMapping("/hik/org/orgList") + @ResponseBody + public Object orgList() { + PersonListRequest request = new PersonListRequest(); + request.setPageNo(1); + request.setPageSize(100); + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi("/api/resource/v1/org/orgList", body); + return resultStr; + } + + /** + * 查询访客权限下载记录 + */ + @PostMapping("/hik/auth/result") + @ResponseBody + public Object authResult() { + PersonListRequest request = new PersonListRequest(); + request.setPageNo(1); + request.setPageSize(100); + request.setOrderId("ba101db6246711edaea66f7939a13638"); + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi("/api/visitor/v1/auth/result", body); + return resultStr; + } + + /** + * 人脸图片获取 + */ + @PostMapping("/hik/face/picture") + @ResponseBody + public Object facePicture() { + FaceRequest request = new FaceRequest(); +// List list = new ArrayList<>(); +// list.add(""); + request.setCertificateNum("wanggong"); + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi("/api/frs/v1/face", body); + return resultStr; + } + } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/AssetInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/AssetInfoMapper.java index 4f64e83..c0684ee 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/AssetInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/AssetInfoMapper.java @@ -17,6 +17,6 @@ @Mapper public interface AssetInfoMapper extends BaseMapper { - List getAssetInfoListPage(@Param("page") Page page, AssetInfoRequest assetInfoRequest); + List getAssetInfoListPage(@Param("page") Page page, @Param("assetInfoRequest") AssetInfoRequest assetInfoRequest); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/AttendanceInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/AttendanceInfoMapper.java index f9e793e..ec87e46 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/AttendanceInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/AttendanceInfoMapper.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.statistics.AttendanceNumberDTO; import com.casic.missiles.modular.dto.statistics.AttendanceRatioDTO; import com.casic.missiles.modular.model.AttendanceInfo; import org.apache.ibatis.annotations.Mapper; @@ -17,7 +18,7 @@ */ @Mapper public interface AttendanceInfoMapper extends BaseMapper { - List getAttendanceInfoListPage(@Param("page") Page page, StaffInfoRequest attendanceInfoRequest); + List getAttendanceInfoListPage(@Param("page") Page page, @Param("attendanceInfoRequest") StaffInfoRequest attendanceInfoRequest); AttendanceInfo selectByCodeAndDate(@Param("staffCode") String staffCode); @@ -26,4 +27,8 @@ List getCountByTypeAndDateForMonth(@Param("staffType")String staffType); List getCountByTypeAndDateForYear(@Param("staffType")String staffType); + + List getCountForWeek(); + + List getCountForDay(); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java index ce94b8f..6137a7d 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java @@ -17,5 +17,5 @@ @Mapper public interface BlackInfoMapper extends BaseMapper { - List getBlackInfoListPage(@Param("page") Page page, BlackInfoRequest blackInfoRequest); + List getBlackInfoListPage(@Param("page") Page page, @Param("blackInfoRequest") BlackInfoRequest blackInfoRequest); } 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 efda6b3..50aaa6f 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 @@ -20,7 +20,7 @@ List getCaseInfoListPage(@Param("page") Page page, @Param("caseInfoRequest") CaseInfoRequest caseInfoRequest); - int updateStatusById(CaseInfoRequest caseInfoRequest); + int updateStatusById(@Param("caseInfoRequest") CaseInfoRequest caseInfoRequest); List selectByLevelAndMonth(@Param("year") String year); @@ -47,4 +47,20 @@ List selectPreWeekCountByThirtyDay(); List selectPreDayCountBySevenDay(); + + Integer selectDemobilizedCount(@Param("eventType") Number personnelDemobilizedEvent); + + List selectPreMonthCount(); + + List selectListBySevenDay(); + + List selectListByToday(); + + List selectListByToday2(); + + List selectListByToday3(); + + List selectListByType(@Param("eventType") Number eventType); + + List selectDemobilizedCountByHour(@Param("eventType") Number eventType); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/CategoryLevelMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/CategoryLevelMapper.java index 52fc714..afe1650 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/CategoryLevelMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/CategoryLevelMapper.java @@ -17,9 +17,9 @@ @Mapper public interface CategoryLevelMapper extends BaseMapper { - List getCaseCategoryLevelListPage(@Param("page") Page page, CategoryLevelRequest categoryLevelRequest); + List getCaseCategoryLevelListPage(@Param("page") Page page, @Param("categoryLevelRequest") CategoryLevelRequest categoryLevelRequest); - List getCaseCategoryLevelList(CategoryLevelRequest categoryLevelRequest); + List getCaseCategoryLevelList(@Param("categoryLevelRequest") CategoryLevelRequest categoryLevelRequest); CaseCategoryLevel getCaseCategoryLevel(@Param("categoryLevelCode") String categoryLevelCode); 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 66353b1..2555a09 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 @@ -19,7 +19,7 @@ @Mapper public interface DeviceInfoMapper extends BaseMapper { - List getDeviceInfoListPage(@Param("page") Page page, DeviceInfoRequest deviceInfoRequest); + List getDeviceInfoListPage(@Param("page") Page page, @Param("deviceInfoRequest") DeviceInfoRequest deviceInfoRequest); List getDeviceInfoList(@Param("deviceInfoRequest") DeviceInfoRequest deviceInfoRequest); @@ -27,6 +27,8 @@ DeviceInfo getByIndexCode(@Param("srcIndex") String srcIndex); + DeviceInfo getByIp(@Param("ip") String ip); + List selectIndexCodesByCodes(@Param("deviceCodes") List deviceCodes); List selectByType(@Param("devType") String devType); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java index 41dd0af..5bfaf63 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java @@ -5,6 +5,7 @@ import com.casic.missiles.modular.dto.DeviceRepairRequest; import com.casic.missiles.modular.model.DeviceRepairLog; import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; import java.util.List; @@ -16,7 +17,7 @@ @Mapper public interface DeviceRepairLogMapper extends BaseMapper { - List getDeviceRepairListPage(Page page, DeviceRepairRequest deviceRepairRequest); + List getDeviceRepairListPage(@Param("page") Page page, @Param("deviceRepairRequest")DeviceRepairRequest deviceRepairRequest); - List getDeviceRepairList(DeviceRepairRequest deviceRepairRequest); + List getDeviceRepairList(@Param("deviceRepairRequest") DeviceRepairRequest deviceRepairRequest); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java index 9035c47..4823ac1 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java @@ -18,7 +18,7 @@ @Mapper public interface FireEquipInfoMapper extends BaseMapper { - List getFireEquipInfoListPage(@Param("page") Page page, FireEquipRequest fireEquipRequest); + List getFireEquipInfoListPage(@Param("page") Page page, @Param("fireEquipRequest") FireEquipRequest fireEquipRequest); FireEquipInfo getFireEquipInfo(@Param("equipCode") String equipCode); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/GateGroupMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/GateGroupMapper.java index d8c330d..977a427 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/GateGroupMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/GateGroupMapper.java @@ -17,7 +17,7 @@ */ @Mapper public interface GateGroupMapper extends BaseMapper { - List getGateGroupListPage(@Param("page") Page page, GateGroupRequest gateGroupRequest); + List getGateGroupListPage(@Param("page") Page page, @Param("gateGroupRequest") GateGroupRequest gateGroupRequest); GateGroup getGateGroupByName(@Param("groupName") String groupName); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/HazardLevelMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/HazardLevelMapper.java index 8957780..dcf47bb 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/HazardLevelMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/HazardLevelMapper.java @@ -17,11 +17,13 @@ @Mapper public interface HazardLevelMapper extends BaseMapper { - List getCaseHazardLevelListPage(@Param("page") Page page, HazardLevelRequest hazardLevelRequest); + List getCaseHazardLevelListPage(@Param("page") Page page, @Param("hazardLevelRequest") HazardLevelRequest hazardLevelRequest); - List getCaseHazardLevelList(HazardLevelRequest hazardLevelRequest); + List getCaseHazardLevelList(@Param("hazardLevelRequest") HazardLevelRequest hazardLevelRequest); CaseHazardLevel getCaseHazardLevel(@Param("hazardLevelCode") String hazardLevelCode); List selectHazardName(); + + String selectHazardNameByCode(@Param("hazardLevelCode") String hazardLevelCode); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/HikCaseDefineMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/HikCaseDefineMapper.java index 0dc47d1..f162fef 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/HikCaseDefineMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/HikCaseDefineMapper.java @@ -12,5 +12,5 @@ */ @Mapper public interface HikCaseDefineMapper extends BaseMapper { - HikCaseDefine getHikCaseDefine(@Param("caseTypeCode") Long caseTypeCode); + HikCaseDefine getHikCaseDefine(@Param("caseTypeCode") Number caseTypeCode); } 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 f8a674c..fe5afc2 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 @@ -17,11 +17,13 @@ @Mapper public interface StaffInfoMapper extends BaseMapper { - List getStaffInfoListPage(@Param("page") Page page, StaffInfoRequest staffInfoRequest); + List getStaffInfoListPage(@Param("page") Page page, @Param("staffInfoRequest") StaffInfoRequest staffInfoRequest); StaffInfo selectByCode(@Param("staffCode") String staffCode); - List getStaffInfoList(StaffInfoRequest staffInfoRequest); + List getStaffInfoList(@Param("staffInfoRequest") StaffInfoRequest staffInfoRequest); - List selectBatchCodes(List list); + List selectBatchCodes(@Param("list") List list); + + int updateByCodeForCard(@Param("staffCode") String staffCode, @Param("cardNo") String cardNo); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitInfoMapper.java index b1217c5..6c52542 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitInfoMapper.java @@ -16,7 +16,7 @@ */ @Mapper public interface VisitInfoMapper extends BaseMapper { - List getVisitInfoListPage(@Param("page") Page page, VisitorRequest visitorRequest); + List getVisitInfoListPage(@Param("page") Page page, @Param("visitorRequest") VisitorRequest visitorRequest); VisitInfo selectByOrderId(@Param("orderId") String orderId); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitorApplyMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitorApplyMapper.java index c09f3c0..6ea55bd 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitorApplyMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitorApplyMapper.java @@ -18,7 +18,7 @@ @Mapper public interface VisitorApplyMapper extends BaseMapper { - List getVisitorApplyListPage(@Param("page") Page page, VisitorApplyRequest visitorApplyRequest); + List getVisitorApplyListPage(@Param("page") Page page, @Param("visitorApplyRequest") VisitorApplyRequest visitorApplyRequest); List selectByVisitReason(); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/AttendanceInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/AttendanceInfoMapper.xml index b2ece71..f8bdd6e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/AttendanceInfoMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/AttendanceInfoMapper.xml @@ -43,7 +43,8 @@ and staff_type = #{staffType} - and YEARWEEK(date_format(atte_date, '%Y-%m-%d'), 1) = YEARWEEK(now(),1); + AND DATE_SUB(CURDATE(), INTERVAL 7 DAY) <= DATE(atte_date) + GROUP BY DATE_FORMAT(atte_date, '%Y-%m-%d') @@ -69,4 +70,20 @@ GROUP BY DATE_FORMAT(atte_date, '%Y-%m') + + + \ No newline at end of file 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 2b6953f..06ec0a8 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 @@ -28,7 +28,9 @@ @@ -87,7 +89,8 @@ SELECT hazard_level_code as levelCode, count(id) as quantity FROM bus_case_info WHERE hazard_level_code is not null - AND DATE_SUB(CURDATE(), INTERVAL 7 DAY) <= date(happen_time); + AND is_key_area = 1 + AND DATE_SUB(CURDATE(), INTERVAL 7 DAY) <= date(happen_time) GROUP BY hazard_level_code @@ -95,7 +98,8 @@ SELECT hazard_level_code as levelCode, count(id) as quantity FROM bus_case_info WHERE hazard_level_code is not null - AND DATE_SUB(CURDATE(), INTERVAL 30 DAY) <= date(happen_time); + AND is_key_area = 1 + AND DATE_SUB(CURDATE(), INTERVAL 30 DAY) <= date(happen_time) GROUP BY hazard_level_code @@ -122,4 +126,71 @@ AND hazard_level_code is not null GROUP BY DATE_FORMAT(happen_time,'%Y-%m-%d') + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/CategoryLevelMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/CategoryLevelMapper.xml index 4670b1f..1d25cbd 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/CategoryLevelMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/CategoryLevelMapper.xml @@ -20,11 +20,11 @@ SELECT * FROM bus_case_category_level WHERE 1=1 - - and code = #{code} + + and code = #{categoryLevelRequest.code} - - and name = #{name} + + and name = #{categoryLevelRequest.name} ORDER by create_time DESC 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 9b66fd8..bfd84b7 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 @@ -98,4 +98,10 @@ #{item} + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceRepairLogMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceRepairLogMapper.xml index 078ed3c..cf1a481 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceRepairLogMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceRepairLogMapper.xml @@ -22,14 +22,14 @@ SELECT * FROM bus_device_repair_log WHERE 1=1 - - and device_code = #{devCode} + + and device_code = #{deviceRepairRequest.devCode} - - and device_name = #{devName} + + and device_name = #{deviceRepairRequest.devName} - - and DATE_FORMAT(create_time,"%y%m%d") = DATE_FORMAT(#{createTime},"%y%m%d") + + and DATE_FORMAT(create_time,"%y%m%d") = DATE_FORMAT(#{deviceRepairRequest.createTime},"%y%m%d") ORDER by create_time DESC diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/HazardLevelMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/HazardLevelMapper.xml index f16f2b9..458322b 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/HazardLevelMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/HazardLevelMapper.xml @@ -20,11 +20,11 @@ SELECT * FROM bus_case_hazard_level WHERE 1=1 - - and code = #{code} + + and code = #{hazardLevelRequest.code} - - and name = #{name} + + and name = #{hazardLevelRequest.name} ORDER by create_time DESC @@ -42,4 +42,10 @@ SELECT name FROM bus_case_hazard_level + + \ 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 557237e..b6a183a 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 @@ -50,4 +50,10 @@ + + + UPDATE bus_staff_info + SET card_no = #{cardNo} + WHERE staff_code = #{staffCode} + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitInfoMapper.xml index 84aa84f..230529a 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitInfoMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitInfoMapper.xml @@ -27,5 +27,6 @@ SELECT * FROM bus_visit_info WHERE order_id = #{orderId} and DATE_FORMAT(in_time,'%Y-%m-%d') = CURRENT_DATE + limit 1 \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/BlackPictureRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/BlackPictureRequest.java new file mode 100644 index 0000000..fc92701 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/BlackPictureRequest.java @@ -0,0 +1,14 @@ +package com.casic.missiles.modular.dto; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/29 19:26 + */ +@Data +public class BlackPictureRequest { + private String picUri; + private String serverIndexCode; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/CancelSubscribeRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/CancelSubscribeRequest.java new file mode 100644 index 0000000..e2d390a --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/CancelSubscribeRequest.java @@ -0,0 +1,15 @@ +package com.casic.missiles.modular.dto.hik; + +import lombok.Data; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/24 15:14 + */ +@Data +public class CancelSubscribeRequest { + private List eventTypes; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/CardInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/CardInfo.java new file mode 100644 index 0000000..341457d --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/CardInfo.java @@ -0,0 +1,24 @@ +package com.casic.missiles.modular.dto.hik; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/26 16:08 + */ +@Data +public class CardInfo { + //卡号,8~20个字符,支持数字和大写字母 + private String cardNo; + //人员ID,员工工号 + private String personId; + //人员所属组织IndexCode + private String orgIndexCode; + //卡片类型,默认是1:IC卡 + //1:IC卡 + //2:CPU卡 + //3:远距离卡 + //4:MIFARE卡 + private Number cardType; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/FaceRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/FaceRequest.java new file mode 100644 index 0000000..edc04bf --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/FaceRequest.java @@ -0,0 +1,16 @@ +package com.casic.missiles.modular.dto.hik; + +import lombok.Data; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/25 16:53 + */ +@Data +public class FaceRequest { + private String certificateNum; + private List indexCodes; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/HikRecvEvent.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/HikRecvEvent.java index a3e9845..1b2b2b1 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/HikRecvEvent.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/HikRecvEvent.java @@ -28,12 +28,12 @@ /** * 事件类型,用于判断所需接收到的事件类型 */ - public Long getEventType(){ + public Number getEventType(){ JSONObject jsonObject = (JSONObject)JSONObject.toJSON(params); //事件类别对应SecurityEventTypeEnum JSONArray eventTypeArray = (JSONArray)jsonObject.get("events"); JSONObject eventJsonObject = (JSONObject)JSONObject.toJSON(eventTypeArray.get(0)); - Long eventType = (Long) eventJsonObject.get("eventType"); + Number eventType = (Number) eventJsonObject.get("eventType"); return eventType; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonBatchDeleteRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonBatchDeleteRequest.java index 027d31d..9751929 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonBatchDeleteRequest.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonBatchDeleteRequest.java @@ -12,4 +12,6 @@ @Data public class PersonBatchDeleteRequest { private List personIds; + //删除人脸接口使用 + private String faceId; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonInfoRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonInfoRequest.java new file mode 100644 index 0000000..05dc9e1 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonInfoRequest.java @@ -0,0 +1,20 @@ +package com.casic.missiles.modular.dto.hik; + +import lombok.Data; + +import java.util.List; + +/** + * @Description: 获取员工照片请求实体 + * @Author: wangpeng + * @Date: 2022/8/25 16:53 + */ +@Data +public class PersonInfoRequest { + //获取员工详细信息使用 + private String paramName; + private List paramValue; + //获取照片使用 + private String picUri; + private String serverIndexCode; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonListRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonListRequest.java new file mode 100644 index 0000000..3f7149b --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonListRequest.java @@ -0,0 +1,16 @@ +package com.casic.missiles.modular.dto.hik; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/25 16:53 + */ +@Data +public class PersonListRequest { + private Number pageNo; + private Number pageSize; + + private String orderId; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/SearchPicturesRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/SearchPicturesRequest.java new file mode 100644 index 0000000..0a95966 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/SearchPicturesRequest.java @@ -0,0 +1,24 @@ +package com.casic.missiles.modular.dto.hik; + +import lombok.Data; + +import java.util.List; + +/** + * @Description: 以图搜图请求 + * @Author: wangpeng + * @Date: 2022/8/29 10:46 + */ +@Data +public class SearchPicturesRequest { + private String facePicBinaryData; + private String facePicUrl; + private List cameraIndexCodes; + private String startTime; + private String endTime; + //指定搜图的最小相似度,最小为1,最大为100 + private String minSimilarity; + private Number age; + //male-男性,female-女性 + private String sex; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/StaffCardRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/StaffCardRequest.java new file mode 100644 index 0000000..4052e6d --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/StaffCardRequest.java @@ -0,0 +1,20 @@ +package com.casic.missiles.modular.dto.hik; + +import lombok.Data; + +import java.util.List; + +/** + * @Description: 人员开卡请求实体 + * @Author: wangpeng + * @Date: 2022/8/26 16:05 + */ +@Data +public class StaffCardRequest { + //卡片开始有效时间,时间格式:yyyy-MM-dd + private String startDate; + //卡片截止有效时间,时间格式:yyyy-MM-dd,不能大于2037年12月31日 + private String endDate; + //cardList,待开卡列表,最大支持50张卡 + private List cardList; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/VisitorInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/VisitorInfo.java index 73aa316..b99f301 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/VisitorInfo.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/VisitorInfo.java @@ -14,7 +14,7 @@ //访客性别 //1: 男 //2: 女 - private String gender; + private Integer gender; //联系电话建议填写手机号码 private String phoneNo; //证件类型 diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/ApplyReasonGroupDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/ApplyReasonGroupDTO.java index 514f382..786143e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/ApplyReasonGroupDTO.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/ApplyReasonGroupDTO.java @@ -13,4 +13,6 @@ private String visitReason; //访问人数 private Integer quantity; + //占比 + private String ratio; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/AttendanceNumberDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/AttendanceNumberDTO.java new file mode 100644 index 0000000..a494321 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/AttendanceNumberDTO.java @@ -0,0 +1,24 @@ +package com.casic.missiles.modular.dto.statistics; + +import com.fasterxml.jackson.annotation.JsonIgnore; +import lombok.Data; + +/** + * @Description: 出勤人数统计实体 + * @Author: wangpeng + * @Date: 2022/8/31 19:24 + */ +@Data +public class AttendanceNumberDTO { + //日期维度,周、今日,入参 + @JsonIgnore + private String dateDimension; + + //日期,具体天/小时,出参 + private String date; + //出勤人数 + private String quantity; + //员工类型 + private String staffType; + +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/AvgMonthAndWeekGroupDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/AvgMonthAndWeekGroupDTO.java index 4366916..331a9a9 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/AvgMonthAndWeekGroupDTO.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/AvgMonthAndWeekGroupDTO.java @@ -2,8 +2,6 @@ import lombok.Data; -import java.util.Map; - /** * @Description: 平均每月和每周的数据实体 * @Author: wangpeng @@ -13,6 +11,4 @@ public class AvgMonthAndWeekGroupDTO { //入参 private String year; - //出参,key:事件类型,value:周和月数据平均值 - private Map map; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/GateStatusGroupResponse.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/GateStatusGroupResponse.java new file mode 100644 index 0000000..d16f4e5 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/GateStatusGroupResponse.java @@ -0,0 +1,16 @@ +package com.casic.missiles.modular.dto.statistics; + +import lombok.Data; + +/** + * @Description: 闸机/摄像机统计响应实体 + * @Author: wangpeng + * @Date: 2022/8/30 14:22 + */ +@Data +public class GateStatusGroupResponse { + //设备状态 + private String status; + //占比 + private String ratio; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/MonthAndWeekDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/MonthAndWeekDTO.java index 7482b2a..284115a 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/MonthAndWeekDTO.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/MonthAndWeekDTO.java @@ -9,7 +9,7 @@ */ @Data public class MonthAndWeekDTO { -// private String levelName; + private String levelName; private Integer monthQuantity; private Integer weekQuantity; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/OnDutyRatioDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/OnDutyRatioDTO.java new file mode 100644 index 0000000..4f6a65d --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/OnDutyRatioDTO.java @@ -0,0 +1,15 @@ +package com.casic.missiles.modular.dto.statistics; + +import lombok.Data; + +/** + * @Description: 在岗率统计实体 + * @Author: wangpeng + * @Date: 2022/9/2 21:24 + */ +@Data +public class OnDutyRatioDTO { + private String date; + private String quantity; + private String ratio; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/SecurityLevelAssessDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/SecurityLevelAssessDTO.java new file mode 100644 index 0000000..40a0738 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/SecurityLevelAssessDTO.java @@ -0,0 +1,15 @@ +package com.casic.missiles.modular.dto.statistics; + +import lombok.Data; + +/** + * @Description: 出勤人数统计实体 + * @Author: wangpeng + * @Date: 2022/8/31 19:24 + */ +@Data +public class SecurityLevelAssessDTO { + private String date; + private String quantity; + private Double score; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/SecurityScoreDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/SecurityScoreDTO.java index 304d169..f7bd4a2 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/SecurityScoreDTO.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/SecurityScoreDTO.java @@ -14,5 +14,5 @@ //楼层,出参 private String area; //评分,出参 - private String score; + private Double score; } 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 6a30786..e5e613d 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 @@ -8,6 +8,10 @@ public interface HikUri { //事件订阅 String EVENT_SUBSCRIBE = "/api/eventService/v1/eventSubscriptionByEventTypes"; + //事件订阅信息查询 + String EVENT_INFO = "/api/eventService/v1/eventSubscriptionView"; + //事件订阅取消 + String EVENT_CANCEL = "/api/eventService/v1/eventUnSubscriptionByEventTypes"; //预约免登记 String APPOINTMENT_FREE_REGISTER = "/api/visitor/v1/appointment/registration"; //修改访客预约 @@ -32,8 +36,18 @@ String PERSON_SINGLE_UPDATE = "/api/resource/v1/person/single/update"; //批量删除人员 String PERSON_BATCH_DELETE = "/api/resource/v1/person/batch/delete"; + //根据人脸Id删除人脸 + String PERSON_SINGLE_DELETE = "/api/resource/v1/face/single/delete"; //门禁点反控 String DOOR_CONTROL = "/api/acs/v1/door/doControl"; //查询海康门禁点事件v2 String DOOR_EVENTS = "/api/acs/v2/door/events"; + //批量开卡 + String CARD_BINDING = "/api/cis/v1/card/binding"; + //提取人员照片 + String PERSON_PICTURE = "/api/resource/v1/person/picture"; + //根据人员唯一字段获取人员详细信息 + String PERSON_INFO = "/api/resource/v1/person/condition/personInfo"; + //以图搜图 + String SEARCH_PICTURES = "/api/frs/v1/application/captureSearch"; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/enums/SecurityEventType.java b/casic-server/src/main/java/com/casic/missiles/modular/enums/SecurityEventType.java index d51034c..42eacf8 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/enums/SecurityEventType.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/enums/SecurityEventType.java @@ -14,18 +14,27 @@ Number PERSONNEL_GATHER_EVENT = 131593; //监控点离线事件 Number MONITORING_POINT_OFFLINE = 889196545; + //监控点上线事件 + Number MONITORING_POINT_ONLINE = 889196546; //装置离线 Number DEVICE_OFFLINE = 199710; + //装置连线 + Number DEVICE_ONLINE = 199711; //访客登记 Number VISITOR_REGISTER = 1392513025; //访客签离 Number VISITOR_CHECKOUT = 1392513026; + //高空抛物 + Number HIGH_ALTITUDE_PARABOLIC = 930335; + //下面两个查询海康门禁点事件使用 //合法卡比对通过 Number CARD_COMPARE_PASS = 198914; //人脸认证通过 Number FACE_COMPARE_PASS = 196893; + + // //正常开门 // Number NORMAL_OPENING = 198913; // //按钮开门 @@ -46,7 +55,6 @@ // Number FIREWORKS_DETECTION = 192514; // //陌生人识别事件 // Number STRANGER_RECOGNITION = 1644171265; -// //高空抛物 -// Number HIGH_ALTITUDE_PARABOLIC = 930335; + } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/job/CockpitJob.java b/casic-server/src/main/java/com/casic/missiles/modular/job/CockpitJob.java index 7490a27..85dd016 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/job/CockpitJob.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/job/CockpitJob.java @@ -79,14 +79,6 @@ } }); } - } - /** - * 机动力量实时在岗率,在岗人数除以总应在岗人数,功能待定 - */ -// @Scheduled(cron = "0 0/1 * * * ?") - public void BeOnDutyRatio() { - - } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/service/HikCaseDefineService.java b/casic-server/src/main/java/com/casic/missiles/modular/service/HikCaseDefineService.java index d9bb3a9..18e2936 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/service/HikCaseDefineService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/service/HikCaseDefineService.java @@ -9,5 +9,5 @@ * @Date: 2022/7/21 17:20 */ public interface HikCaseDefineService extends IService { - HikCaseDefine getHikCaseDefine(Long caseTypeCode); + HikCaseDefine getHikCaseDefine(Number caseTypeCode); } 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 dd24101..bcc3b5d 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 @@ -18,6 +18,8 @@ CaseInfo monitorPointOfflineHandle(JSONObject event, CaseInfo caseInfo); + void monitorPointOnlineHandle(JSONObject event); + CaseInfo deviceOfflineHandle(JSONObject event, CaseInfo caseInfo); void propertyAttendanceHandle(JSONObject event); @@ -27,4 +29,6 @@ void visitorRegisterHandler(JSONObject event); void visitorCheckOutHandler(JSONObject event); + + void deviceOnlineHandle(JSONObject event); } 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 e55c016..01870bd 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.StaffCardRequest; import com.casic.missiles.modular.model.StaffInfo; import java.util.List; @@ -28,4 +29,6 @@ StaffInfo selectStaffInfoByCode(StaffInfo staffInfo); List staffInfoList(StaffInfoRequest staffInfoRequest); + + int saveCardInfo(StaffCardRequest staffCardRequest); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/service/impl/BlackInfoServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/service/impl/BlackInfoServiceImpl.java index 8f47b37..981b4cd 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/service/impl/BlackInfoServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/service/impl/BlackInfoServiceImpl.java @@ -17,7 +17,6 @@ import com.casic.missiles.modular.model.BlackInfo; import com.casic.missiles.modular.model.HikFaceGroupInfo; import com.casic.missiles.modular.service.BlackInfoService; -import com.casic.missiles.modular.system.service.ICasicFileService; import com.casic.missiles.modular.util.HikUtil; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; @@ -43,9 +42,6 @@ private HikFaceGroupInfoMapper hikFaceGroupInfoMapper; @Resource - private ICasicFileService fileService; - - @Resource private AbstractDictService dictService; @Override @@ -90,9 +86,6 @@ //设置海康人脸唯一标识、人脸分组唯一标识 blackInfo.setIndexCode(String.valueOf(dataJson.get("indexCode"))); blackInfo.setFaceGroupIndexCode(String.valueOf(dataJson.get("faceGroupIndexCode"))); - //保存图片到本地 - String picUrl = fileService.saveFile(blackInfo.getPicture()); - blackInfo.setPicture(picUrl); //插入数据库 if(blackInfoMapper.insert(blackInfo) > 0){ return ResponseData.success(); @@ -141,8 +134,6 @@ log.error("请求海康,单个修改人脸失败,海康response:{}", resultStr); return ResponseData.error("单个修改人脸失败"); } - String picUrl = fileService.saveFile(blackInfo.getPicture()); - blackInfo.setPicture(picUrl); if(blackInfoMapper.updateById(blackInfo) > 0){ return ResponseData.success(); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/service/impl/CockpitServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/service/impl/CockpitServiceImpl.java index 6e6076e..7402991 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/service/impl/CockpitServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/service/impl/CockpitServiceImpl.java @@ -4,15 +4,12 @@ import cn.hutool.core.date.DateUtil; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.core.application.service.AbstractDictService; import com.casic.missiles.modular.dto.hik.DoorEventsRequest; import com.casic.missiles.modular.enums.HikUri; -import com.casic.missiles.modular.enums.SecurityEventDict; import com.casic.missiles.modular.enums.SecurityEventType; import com.casic.missiles.modular.service.CockpitService; import com.casic.missiles.modular.util.HikUtil; import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.*; @@ -25,8 +22,6 @@ @Slf4j @Service public class CockpitServiceImpl implements CockpitService { - @Autowired - private AbstractDictService dictService; @Override public HashMap dataHandle(DoorEventsRequest doorEventsRequest, HashMap> configMap, HashMap jsonMap, HashMap resultMap) { @@ -36,8 +31,8 @@ Date date = new Date(); DateTime startTimeDate = DateUtil.beginOfDay(date); DateTime endTimeDate = DateUtil.endOfDay(date); - String startTime = DateUtil.format(startTimeDate, "yyyy-MM-dd'T'HH:mm:ss'Z'"); - String endTime = DateUtil.format(endTimeDate, "yyyy-MM-dd'T'HH:mm:ss'Z'"); + String startTime = DateUtil.format(startTimeDate, "yyyy-MM-dd'T'HH:mm:ssXXX"); + String endTime = DateUtil.format(endTimeDate, "yyyy-MM-dd'T'HH:mm:ssXXX"); configMap.keySet().stream().forEach(key -> { List doorIndexCodes = configMap.get(key); doorEventsRequest.setPageNo(1); @@ -95,8 +90,9 @@ return; } Integer num = 0; - while (list.stream().iterator().hasNext()) { - JSONObject next = (JSONObject) list.stream().iterator().next(); + Iterator iterator = list.stream().iterator(); + while (iterator.hasNext()) { + JSONObject next = (JSONObject) iterator.next(); Integer inAndOutType = next.getInteger("inAndOutType"); //进门 if (1 == inAndOutType) { @@ -105,8 +101,8 @@ --num; } } - String dictName = dictService.getDictNameByCode(SecurityEventDict.DEVICE_POSITION, String.valueOf(key)); - resultMap.put(dictName, num); +// String dictName = dictService.getDictNameByCode(SecurityEventDict.DEVICE_POSITION, String.valueOf(key)); + resultMap.put(String.valueOf(key), num); }); return resultMap; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/service/impl/HikCaseDefineServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/service/impl/HikCaseDefineServiceImpl.java index 98ab2a4..1a59c7e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/service/impl/HikCaseDefineServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/service/impl/HikCaseDefineServiceImpl.java @@ -16,7 +16,7 @@ private HikCaseDefineMapper hikCaseDefineMapper; @Override - public HikCaseDefine getHikCaseDefine(Long caseTypeCode) { + public HikCaseDefine getHikCaseDefine(Number caseTypeCode) { return hikCaseDefineMapper.getHikCaseDefine(caseTypeCode); } } 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 b47f78f..dbad48f 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 @@ -58,10 +58,16 @@ 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.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; } @@ -76,10 +82,16 @@ 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.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; } @@ -94,10 +106,16 @@ 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.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; } @@ -109,24 +127,44 @@ 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()); //事件状态(未解决的字典值) + // TODO: 2022/7/28 事件状态字典值选择 + caseInfo.setStatus(dict.get(0).getCode()); //事件状态("未解决"的字典值) DeviceInfo deviceInfo = deviceInfoMapper.getByIndexCode(srcIndex); + if(Objects.isNull(deviceInfo)){ + log.info("接收到监控点离线事件,但数据库中无该事件发生的设备信息"); + return caseInfo; + } 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()); //更新设备状态 // TODO: 2022/7/28 设备离线字典值选择 -// deviceInfo.setStatus(); + List deviceDict = dictService.findInDictByCode(SecurityEventDict.DEVICE_STATUS); + deviceInfo.setStatus(deviceDict.get(1).getCode()); if(deviceInfoMapper.updateById(deviceInfo) <= 0){ + log.error("海康回调,更新监控点离线线状态失败!"); return null; } return caseInfo; } @Override + public void monitorPointOnlineHandle(JSONObject event) { + String srcIndex = event.getString("srcIndex"); + DeviceInfo deviceInfo = deviceInfoMapper.getByIndexCode(srcIndex); + // TODO: 2022/7/28 设备在线字典值选择 + List deviceDict = dictService.findInDictByCode(SecurityEventDict.DEVICE_STATUS); + deviceInfo.setStatus(deviceDict.get(0).getCode()); + if(deviceInfoMapper.updateById(deviceInfo) <= 0){ + log.error("海康回调,更新监控点在线状态失败!"); + } + } + + @Override public CaseInfo deviceOfflineHandle(JSONObject event, CaseInfo caseInfo) { //加入到安防事件 String srcIndex = event.getString("srcIndex"); //海康资源唯一标识 @@ -138,19 +176,40 @@ 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.setDeviceCode(deviceInfo.getDevCode()); //设备code caseInfo.setDevName(deviceInfo.getDevName()); //设备名 caseInfo.setPosition(deviceInfo.getPosition()); //事件位置 caseInfo.setArea(deviceInfo.getArea()); //区域 + caseInfo.setIsKeyArea(deviceInfo.getIsKeyArea()); + caseInfo.setDetailLocation(deviceInfo.getDetailLocation()); //更新设备状态 // TODO: 2022/7/28 设备离线字典值选择 -// deviceInfo.setStatus(); + List deviceDict = dictService.findInDictByCode(SecurityEventDict.DEVICE_STATUS); + deviceInfo.setStatus(deviceDict.get(1).getCode()); if(deviceInfoMapper.updateById(deviceInfo) <= 0){ + log.error("海康回调,更新设备离线状态失败!"); return null; } return caseInfo; } + + @Override + public void deviceOnlineHandle(JSONObject event) { + String srcIndex = event.getString("srcIndex"); + DeviceInfo deviceInfo = deviceInfoMapper.getByIndexCode(srcIndex); + // TODO: 2022/7/28 设备在线字典值选择 + List deviceDict = dictService.findInDictByCode(SecurityEventDict.DEVICE_STATUS); + deviceInfo.setStatus(deviceDict.get(0).getCode()); + if(deviceInfoMapper.updateById(deviceInfo) <= 0){ + log.error("海康回调,更新门禁点装置在线状态失败!"); + } + } + @Override public void propertyAttendanceHandle(JSONObject event) { String srcIndex = event.getString("srcIndex"); @@ -182,8 +241,9 @@ info.setStaffName(staffInfo.getStaffName()); info.setStaffGender(staffInfo.getStaffGender()); // TODO: 2022/7/29 物业人员字典值选择 -// info.setStaffType(); -// info.setStaffTypeName(); + List staffDict = dictService.findInDictByCode(SecurityEventDict.STAFF_TYPE); + info.setStaffType(staffDict.get(0).getCode()); + info.setStaffTypeName(staffDict.get(0).getName()); info.setAtteDate(DateUtil.today()); info.setAtteStartTime(happenTime); info.setAtteStartDev(deviceInfo.getDevCode()); @@ -226,8 +286,9 @@ info.setStaffName(staffInfo.getStaffName()); info.setStaffGender(staffInfo.getStaffGender()); // TODO: 2022/7/29 安保人员字典值选择 -// info.setStaffType(); -// info.setStaffTypeName(); + List staffDict = dictService.findInDictByCode(SecurityEventDict.STAFF_TYPE); + info.setStaffType(staffDict.get(1).getCode()); + info.setStaffTypeName(staffDict.get(1).getName()); info.setAtteDate(DateUtil.today()); info.setAtteStartTime(happenTime); info.setAtteStartDev(deviceInfo.getDevCode()); @@ -259,8 +320,12 @@ visitInfo.setVisitReason(data.getString("purpose")); visitInfo.setPicUri(data.getString("captureUrl")); visitInfo.setServerIndexCode(data.getString("svrIndexCode")); - visitInfo.setVisitPosition(deviceInfo.getPosition()); - + visitInfo.setOrderId(data.getString("visitorId")); + if(!Objects.isNull(deviceInfo)){ + visitInfo.setVisitPosition(deviceInfo.getPosition()); + } else{ + log.info("识别访客的门禁不在数据库中"); + } if(visitInfoMapper.insert(visitInfo) <= 0){ log.error("新增访客记录异常"); } 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 b416f5c..d19dceb 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 @@ -10,12 +10,12 @@ import com.casic.missiles.modular.dto.StaffInfoRequest; import com.casic.missiles.modular.dto.hik.PersonBatchDeleteRequest; import com.casic.missiles.modular.dto.hik.PersonSingleAddOrUpdateRequest; +import com.casic.missiles.modular.dto.hik.StaffCardRequest; import com.casic.missiles.modular.enums.HikUri; import com.casic.missiles.modular.enums.SecurityEventDict; import com.casic.missiles.modular.model.DeviceInfo; import com.casic.missiles.modular.model.StaffInfo; import com.casic.missiles.modular.service.StaffInfoService; -import com.casic.missiles.modular.system.service.ICasicFileService; import com.casic.missiles.modular.util.Base64Util; import com.casic.missiles.modular.util.HikUtil; import lombok.extern.slf4j.Slf4j; @@ -51,9 +51,6 @@ @Resource private Validator validator; - @Resource - private ICasicFileService fileService; - @Value("${casic.file.uploadPath}") private String uploadPath; @@ -80,8 +77,6 @@ if(!Objects.isNull(staff)){ return ResponseData.error("数据已存在"); } - String picUrl = fileService.saveFile(staffInfo.getPicture()); - staffInfo.setPicture(picUrl); //添加人员到海康 PersonSingleAddOrUpdateRequest personSingleAddOrUpdateRequest = new PersonSingleAddOrUpdateRequest(); @@ -117,9 +112,6 @@ @Override @Transactional(rollbackFor = Exception.class) public Object updateStaffInfo(StaffInfo staffInfo) { - String picUrl = fileService.saveFile(staffInfo.getPicture()); - staffInfo.setPicture(picUrl); - //修改人员到海康 PersonSingleAddOrUpdateRequest personSingleAddOrUpdateRequest = new PersonSingleAddOrUpdateRequest(); personSingleAddOrUpdateRequest.setPersonId(staffInfo.getStaffCode()); @@ -162,7 +154,13 @@ String body = JSONObject.toJSONString(personBatchDeleteRequest); String resultStr = HikUtil.hikApi(HikUri.PERSON_BATCH_DELETE, body); JSONObject resultJson = (JSONObject)JSONObject.parse(resultStr); - if (!"0".equals(resultJson.get("code"))) { + //人脸要单独删除 + PersonBatchDeleteRequest personBatchDeleteRequest2 = new PersonBatchDeleteRequest(); + personBatchDeleteRequest2.setFaceId(staffInfo.getStaffFaceId()); + String body2 = JSONObject.toJSONString(personBatchDeleteRequest2); + String resultStr2 = HikUtil.hikApi(HikUri.PERSON_SINGLE_DELETE, body2); + JSONObject resultJson2 = (JSONObject)JSONObject.parse(resultStr2); + if (!"0".equals(resultJson.get("code")) && !"0".equals(resultJson2.get("code")) ) { log.error("请求海康,单个删除人员失败,海康response:{}", resultStr); return ResponseData.error("单个删除人员失败"); } @@ -269,4 +267,21 @@ } return null; } + + @Override + @Transactional(rollbackFor = Exception.class) + public int saveCardInfo(StaffCardRequest staffCardRequest) { + List numFlag = new ArrayList<>(); + staffCardRequest.getCardList().forEach(cardInfo -> { + String staffCode = cardInfo.getPersonId(); + String cardNo = cardInfo.getCardNo(); + if(staffInfoMapper.updateByCodeForCard(staffCode, cardNo) > 0){ + numFlag.add(cardNo); + } + }); + if(staffCardRequest.getCardList().size() != numFlag.size()){ + return 0; + } + return 1; + } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/service/impl/VisitorApplyServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/service/impl/VisitorApplyServiceImpl.java index 497003a..b219984 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/service/impl/VisitorApplyServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/service/impl/VisitorApplyServiceImpl.java @@ -74,9 +74,9 @@ AppointmentFreeRegisterRequest appointmentFreeRegisterRequest = new AppointmentFreeRegisterRequest(); //将时间转换为海康ISO8601格式 DateTime inTimeDate = DateUtil.parse(visitorApply.getInTime()); - String inTimeISODate = DateUtil.format(inTimeDate, "yyyy-MM-dd'T'HH:mm:ss'Z'"); + String inTimeISODate = DateUtil.format(inTimeDate, "yyyy-MM-dd'T'HH:mm:ssXXX"); DateTime outTimeDate = DateUtil.parse(visitorApply.getOutTime()); - String outTimeISODate = DateUtil.format(outTimeDate, "yyyy-MM-dd'T'HH:mm:ss'Z'"); + String outTimeISODate = DateUtil.format(outTimeDate, "yyyy-MM-dd'T'HH:mm:ssXXX"); //海康员工唯一标识receptionistId就是我们录入的到海康的员工号 appointmentFreeRegisterRequest.setReceptionistId(visitorApply.getStaffCode()); appointmentFreeRegisterRequest.setPersonNum(1); @@ -86,7 +86,7 @@ VisitorInfo visitorInfo = new VisitorInfo(); visitorInfo.setVisitorName(visitorApply.getVisitorName()); - visitorInfo.setGender(visitorApply.getVisitorGender()); + visitorInfo.setGender(Integer.valueOf(visitorApply.getVisitorGender())); visitorInfo.setPhoneNo(visitorApply.getVisitorPhone()); visitorInfo.setCertificateNo(visitorApply.getIdCard()); visitorInfo.setCertificateType(111); @@ -121,15 +121,15 @@ appointmentFreeRegisterRequest.setAppointRecordId(visitorApply1.getAppointRecordId()); appointmentFreeRegisterRequest.setReceptionistId(visitorApply1.getStaffCode()); DateTime inTimeDate = DateUtil.parse(visitorApply.getInTime()); - String inTimeISODate = DateUtil.format(inTimeDate, "yyyy-MM-dd'T'HH:mm:ss'Z'"); + String inTimeISODate = DateUtil.format(inTimeDate, "yyyy-MM-dd'T'HH:mm:ssXXX"); DateTime outTimeDate = DateUtil.parse(visitorApply.getOutTime()); - String outTimeISODate = DateUtil.format(outTimeDate, "yyyy-MM-dd'T'HH:mm:ss'Z'"); + String outTimeISODate = DateUtil.format(outTimeDate, "yyyy-MM-dd'T'HH:mm:ssXXX"); appointmentFreeRegisterRequest.setVisitStartTime(inTimeISODate); appointmentFreeRegisterRequest.setVisitEndTime(outTimeISODate); appointmentFreeRegisterRequest.setVisitPurpose(visitorApply.getVisitReason()); VisitorInfo visitorInfo = new VisitorInfo(); visitorInfo.setVisitorName(visitorApply.getVisitorName()); - visitorInfo.setGender(visitorApply.getVisitorGender()); + visitorInfo.setGender(Integer.valueOf(visitorApply.getVisitorGender())); visitorInfo.setPhoneNo(visitorApply.getVisitorPhone()); visitorInfo.setCertificateNo(visitorApply.getIdCard()); visitorInfo.setCertificateType(111); @@ -236,9 +236,9 @@ } } DateTime inTimeDate = DateUtil.parse(busConcentrator.getInTime()); - String inTimeISODate = DateUtil.format(inTimeDate, "yyyy-MM-dd'T'HH:mm:ss'Z'"); + String inTimeISODate = DateUtil.format(inTimeDate, "yyyy-MM-dd'T'HH:mm:ssXXX"); DateTime outTimeDate = DateUtil.parse(busConcentrator.getOutTime()); - String outTimeISODate = DateUtil.format(outTimeDate, "yyyy-MM-dd'T'HH:mm:ss'Z'"); + String outTimeISODate = DateUtil.format(outTimeDate, "yyyy-MM-dd'T'HH:mm:ssXXX"); AppointmentFreeRegisterRequest appointmentFreeRegisterRequest = new AppointmentFreeRegisterRequest(); appointmentFreeRegisterRequest.setReceptionistId(busConcentrator.getStaffCode()); appointmentFreeRegisterRequest.setPersonNum(1); @@ -247,7 +247,7 @@ appointmentFreeRegisterRequest.setVisitPurpose(busConcentrator.getVisitReason()); VisitorInfo visitorInfo = new VisitorInfo(); visitorInfo.setVisitorName(busConcentrator.getVisitorName()); - visitorInfo.setGender(busConcentrator.getVisitorGender()); + visitorInfo.setGender(Integer.valueOf(busConcentrator.getVisitorGender())); visitorInfo.setPhoneNo(busConcentrator.getVisitorPhone()); visitorInfo.setCertificateNo(busConcentrator.getIdCard()); visitorInfo.setCertificateType(111); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/util/ArtemisFor302Util.java b/casic-server/src/main/java/com/casic/missiles/modular/util/ArtemisFor302Util.java new file mode 100644 index 0000000..4edb075 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/util/ArtemisFor302Util.java @@ -0,0 +1,65 @@ +package com.casic.missiles.modular.util; + +import com.hikvision.artemis.sdk.Client; +import com.hikvision.artemis.sdk.Request; +import com.hikvision.artemis.sdk.Response; +import com.hikvision.artemis.sdk.config.ArtemisConfig; +import com.hikvision.artemis.sdk.constant.Constants; +import com.hikvision.artemis.sdk.enums.Method; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.apache.http.HttpHeaders; + +import java.util.HashMap; +import java.util.Map; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/29 20:25 + */ +@Slf4j +public class ArtemisFor302Util { + + public static String doPostStringArtemis(Map path, String body, Map querys, String accept, String contentType, Map header) { + String httpSchema = (String)path.keySet().toArray()[0]; + if (httpSchema != null && !StringUtils.isEmpty(httpSchema)) { + String responseStr = null; + + try { + Map headers = new HashMap(); + if (StringUtils.isNotBlank(accept)) { + headers.put("Accept", accept); + } else { + headers.put("Accept", "*/*"); + } + + if (StringUtils.isNotBlank(contentType)) { + headers.put("Content-Type", contentType); + } else { + headers.put("Content-Type", "application/text;charset=UTF-8"); + } + + if (header != null) { + headers.putAll(header); + } + + Request request = new Request(Method.POST_STRING, httpSchema + ArtemisConfig.host, (String)path.get(httpSchema), ArtemisConfig.appKey, ArtemisConfig.appSecret, Constants.DEFAULT_TIMEOUT); + request.setHeaders(headers); + request.setQuerys(querys); + request.setStringBody(body); + Response response = Client.execute(request); + int statusCode = response.getStatusCode(); + if(statusCode == 302){ + return response.getHeader((HttpHeaders.LOCATION)); + } + + } catch (Exception var11) { + log.error("the Artemis PostString Request is failed, exception:{}", var11.getMessage()); + } + return responseStr; + } else { + throw new RuntimeException("http和https参数错误httpSchema: " + httpSchema); + } + } +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/util/CaseInfoFactoryUtil.java b/casic-server/src/main/java/com/casic/missiles/modular/util/CaseInfoFactoryUtil.java index bde56a9..74da5ea 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/util/CaseInfoFactoryUtil.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/util/CaseInfoFactoryUtil.java @@ -10,6 +10,7 @@ import org.springframework.stereotype.Component; import javax.annotation.Resource; +import java.util.Objects; /** * @Description: 安防事件工厂类 @@ -27,9 +28,12 @@ @Resource private CategoryLevelMapper categoryLevelMapper; - public CaseInfo getCaseInfo(Long eventType) { + public CaseInfo getCaseInfo(Number eventType) { //获取海康事件定义 HikCaseDefine hikCaseDefine = hikCaseDefineMapper.getHikCaseDefine(eventType); + if(Objects.isNull(hikCaseDefine)){ + return null; + } //不同事件类别对事件封装为可入库事件 CaseInfo caseInfo = new CaseInfo(); caseInfo.setHazardLevelCode(hikCaseDefine.getHazardLevelCode()); //危险级别code @@ -39,6 +43,7 @@ caseInfo.setCategoryLevelCode(hikCaseDefine.getCategoryLevelCode()); //事件类别code CaseCategoryLevel categoryLevel = categoryLevelMapper.getCaseCategoryLevel(hikCaseDefine.getCategoryLevelCode()); caseInfo.setTypeName(categoryLevel.getName()); //事件类别 + caseInfo.setHikEventType(hikCaseDefine.getCaseTypeCode()); return caseInfo; } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/util/HikUtil.java b/casic-server/src/main/java/com/casic/missiles/modular/util/HikUtil.java index 2dc14a2..dde810c 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/util/HikUtil.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/util/HikUtil.java @@ -13,9 +13,9 @@ /** * STEP1:设置平台参数,根据实际情况,设置host appkey appsecret 三个参数. */ - ArtemisConfig.host = "192.168.1.22:443"; // artemis网关服务器ip端口 - ArtemisConfig.appKey = "25766251"; // 秘钥appkey - ArtemisConfig.appSecret = "h2o6zXtzCmt8eaOaMkXb";// 秘钥appSecret + ArtemisConfig.host = "192.168.10.2:443"; // artemis网关服务器ip端口 + ArtemisConfig.appKey = "20464298"; // 秘钥appkey + ArtemisConfig.appSecret = "YrvonURk8z9kzYuMWEto";// 秘钥appSecret /** * STEP2:设置OpenAPI接口的上下文 @@ -46,4 +46,43 @@ String result = ArtemisHttpUtil.doPostStringArtemis(path, body, null, null, contentType, null); return result; } + + public static String hikApiFor302(String uri, String body) { + + /** + * STEP1:设置平台参数,根据实际情况,设置host appkey appsecret 三个参数. + */ + ArtemisConfig.host = "192.168.10.2:443"; // artemis网关服务器ip端口 + ArtemisConfig.appKey = "20464298"; // 秘钥appkey + ArtemisConfig.appSecret = "YrvonURk8z9kzYuMWEto";// 秘钥appSecret + + /** + * STEP2:设置OpenAPI接口的上下文 + */ + final String ARTEMIS_PATH = "/artemis"; + + /** + * STEP3:设置接口的URI地址 + */ + final String previewURLsApi = ARTEMIS_PATH + uri; + Map path = new HashMap(2) { + { + put("https://", previewURLsApi);//根据现场环境部署确认是http还是https + } + }; + + /** + * STEP4:设置参数提交方式 + */ + String contentType = "application/json"; + + /** + * STEP5:组装请求参数 + */ + /** + * STEP6:调用接口,post请求application/json类型参数 + */ + String result = ArtemisFor302Util.doPostStringArtemis(path, body, null, null, contentType, null); + return result; + } } diff --git a/casic-web/src/main/resources/config/application-dev.yml b/casic-web/src/main/resources/config/application-dev.yml index e7963bb..835aeb4 100644 --- a/casic-web/src/main/resources/config/application-dev.yml +++ b/casic-web/src/main/resources/config/application-dev.yml @@ -20,7 +20,7 @@ casic: kaptcha-open: false #是否开启登录时验证码 (true/false) - no-login-urls: ${casic.sysUrl}/user/login,${casic.sysUrl}/user/appLogin,${casic.sysUrl}/kaptcha/base64,${casic.sysUrl}/config/baseConfig,/route/mockToken,/cockpit/**,/propertyManage/** + no-login-urls: ${casic.sysUrl}/user/login,${casic.sysUrl}/user/appLogin,${casic.sysUrl}/kaptcha/base64,${casic.sysUrl}/config/baseConfig,/route/mockToken,/cockpit/**,/propertyManage/**,/eventRcv/**,/hik/**,/staffInfo/**,/**/listPage,/**/list #flowable数据源和多数据源配置 db: init: @@ -41,9 +41,8 @@ level.org.springframework.web: info #所属楼栋及各楼栋内门禁点列表配置 -#1/2/3对应字典中一期二期主楼和录制楼 +#1/2对应字典中一期(包含一期+录制楼)、二期主楼 accessgroup: configMap: - 1: [1,2,3] - 2: [2,3,4] - 3: [3,4,5] \ No newline at end of file + 1: [eaf4c45a20734a6d88cdf32cbec3fdab] + 2: [2,3,4] \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/BlackListController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/BlackListController.java index a27f9f8..0c06661 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/BlackListController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/BlackListController.java @@ -1,13 +1,18 @@ package com.casic.missiles.modular.controller; +import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.base.controller.ExportController; import com.casic.missiles.core.page.PageFactory; import com.casic.missiles.model.response.ResponseData; import com.casic.missiles.modular.dto.BlackInfoRequest; +import com.casic.missiles.modular.dto.BlackPictureRequest; +import com.casic.missiles.modular.dto.hik.PersonInfoRequest; +import com.casic.missiles.modular.enums.HikUri; import com.casic.missiles.modular.enums.OperateTypeEnum; import com.casic.missiles.modular.model.BlackInfo; import com.casic.missiles.modular.service.BlackInfoService; +import com.casic.missiles.modular.util.HikUtil; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; @@ -56,4 +61,22 @@ return null; } + /** + * 黑名单人员照片 + */ + @PostMapping("/personPicture") + @ResponseBody + public Object personPicture(@RequestBody BlackPictureRequest blackPictureRequest){ + //获取照片 + String picUri = blackPictureRequest.getPicUri(); + String serverIndexCode = blackPictureRequest.getServerIndexCode(); + PersonInfoRequest picRequest = new PersonInfoRequest(); + picRequest.setPicUri(picUri); + picRequest.setServerIndexCode(serverIndexCode); + String reBody = JSONObject.toJSONString(picRequest); + //重定向地址获取 + String url = HikUtil.hikApiFor302(HikUri.PERSON_PICTURE, reBody); + return ResponseData.success(url); + } + } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/DeviceController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/DeviceController.java index e1c4eba..666bbee 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/DeviceController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/DeviceController.java @@ -107,7 +107,7 @@ } /** - * 设备维修管理查询(分页),需计算MTTR=总维修时间/故障次数 + * 设备状态计算与评判/设备维修管理查询(分页),需计算MTTR=总维修时间/故障次数 */ @PostMapping("/repair/listPage") @ResponseBody @@ -211,7 +211,7 @@ //需根据设备编号获取到对应的门禁点唯一标识 doorControlRequest.setDoorIndexCodes(indexCodes); doorControlRequest.setControlType(Integer.valueOf(gateGroupDTO.getStatus())); - String body = JSONObject.toJSONString(deviceCodes); + String body = JSONObject.toJSONString(doorControlRequest); String resultStr = HikUtil.hikApi(HikUri.DOOR_CONTROL, body); JSONObject resultJson = (JSONObject)JSONObject.parse(resultStr); if (!"0".equals(resultJson.get("code"))) { diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/StaffController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/StaffController.java index b58ccab..704093c 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/StaffController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/StaffController.java @@ -2,15 +2,21 @@ import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.util.StrUtil; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.base.controller.ExportController; import com.casic.missiles.core.page.PageFactory; import com.casic.missiles.model.response.ErrorResponseData; import com.casic.missiles.model.response.ResponseData; import com.casic.missiles.modular.dto.StaffInfoRequest; +import com.casic.missiles.modular.dto.hik.PersonInfoRequest; +import com.casic.missiles.modular.dto.hik.StaffCardRequest; +import com.casic.missiles.modular.enums.HikUri; import com.casic.missiles.modular.enums.OperateTypeEnum; import com.casic.missiles.modular.model.StaffInfo; import com.casic.missiles.modular.service.StaffInfoService; +import com.casic.missiles.modular.util.HikUtil; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; @@ -110,4 +116,60 @@ } return ResponseData.success(); } + + /** + * 批量开卡,添加人员之后调用,若在一个接口中添加人员成功开卡失败则第二次添加时会有问题 + */ + @PostMapping("/cardBinding") + @ResponseBody + public Object cardBinding(@RequestBody StaffCardRequest staffCardRequest) { + String body = JSONObject.toJSONString(staffCardRequest); + String resultStr = HikUtil.hikApi(HikUri.CARD_BINDING, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (!"0".equals(resultJson.get("code"))) { + log.error("请求海康,批量开卡失败,海康response:{}", resultStr); + return ResponseData.error("批量开卡失败"); + } + //保存卡号 + if(staffInfoService.saveCardInfo(staffCardRequest) > 0){ + return ResponseData.success(); + } + return ResponseData.error("批量开卡失败"); + } + + /** + * 获取员工照片,海康存储 + */ + @PostMapping("/personPicture/{staffCode}") + @ResponseBody + public Object personPicture(@PathVariable("staffCode") String staffCode){ + //获取员工详细信息,含图片服务器、uri + PersonInfoRequest request = new PersonInfoRequest(); + List list = new ArrayList<>(); + list.add(staffCode); + request.setParamName("personId"); + request.setParamValue(list); + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi(HikUri.PERSON_INFO, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (!"0".equals(resultJson.get("code"))) { + log.error("请求海康,根据人员唯一字段获取人员详细信息失败,海康response:{}", resultStr); + return ResponseData.error("获取员工照片失败"); + } + //获取照片 + JSONObject data = (JSONObject) resultJson.get("data"); + JSONArray dataArray = (JSONArray) data.get("list"); + JSONObject jsonObject = (JSONObject) dataArray.get(0); + JSONArray personPhoto = (JSONArray) jsonObject.get("personPhoto"); + JSONObject photo = (JSONObject) personPhoto.get(0); + String picUri = photo.getString("picUri"); + String serverIndexCode = photo.getString("serverIndexCode"); + PersonInfoRequest picRequest = new PersonInfoRequest(); + picRequest.setPicUri(picUri); + picRequest.setServerIndexCode(serverIndexCode); + String reBody = JSONObject.toJSONString(picRequest); + //重定向地址获取 + String url = HikUtil.hikApiFor302(HikUri.PERSON_PICTURE, reBody); + return ResponseData.success(url); + } } 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 4a07dd9..7b1dcf6 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 @@ -16,6 +16,7 @@ import com.casic.missiles.modular.redis.key.CacheKeys; import com.casic.missiles.modular.service.CockpitService; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.util.CollectionUtils; import org.springframework.web.bind.annotation.*; @@ -24,10 +25,7 @@ import java.text.NumberFormat; import java.time.LocalDateTime; import java.time.temporal.ChronoUnit; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.util.*; import java.util.stream.Collectors; /** @@ -73,6 +71,9 @@ private StatisticNumberMapper numberMapper; @Autowired + private HazardLevelMapper hazardLevelMapper; + + @Autowired private AccessGroupConfig accessGroupConfig; /** @@ -104,8 +105,24 @@ public Object buildingNumberPerHour(){ //当天按小时分组的人数 List list = numberMapper.selectListByTime(); - Map> collect = list.stream().collect(Collectors.groupingBy(BuildingNumberDTO::getStatisticPosition)); - return ResponseData.success(collect); + Map> collect = list.stream().collect(Collectors.groupingBy(BuildingNumberDTO::getStatisticTime)); + //定时任务中已将每小时三栋楼人数存到数据库 + //将一期主楼和录制楼人数合并,二期单算 + List> resultList = new ArrayList<>(); + collect.keySet().forEach(key -> { + List buildingNumberDTOS = collect.get(key); + BuildingNumberDTO mainBuildingOne = buildingNumberDTOS.get(0); + BuildingNumberDTO mainBuildingTwo = buildingNumberDTOS.get(1); + BuildingNumberDTO recordingBuilding = buildingNumberDTOS.get(2); + HashMap resultMap = new HashMap<>(); + Integer oneQuantity = Integer.valueOf(mainBuildingOne.getStatisticQuantity()); + Integer recordingQuantity = Integer.valueOf(recordingBuilding.getStatisticQuantity()); + resultMap.put("staticTime", mainBuildingOne.getStatisticTime()); + resultMap.put(mainBuildingOne.getStatisticPositionName()+"、"+recordingBuilding.getStatisticPositionName(), String.valueOf(oneQuantity+recordingQuantity)); + resultMap.put(mainBuildingTwo.getStatisticPositionName(), mainBuildingTwo.getStatisticQuantity()); + resultList.add(resultMap); + }); + return ResponseData.success(resultList); } /** @@ -151,12 +168,11 @@ public Object securityNumber() { QueryWrapper wrapper = new QueryWrapper<>(); wrapper.eq("staff_type", 2); + // TODO: 2022/9/2 后续使用产品确定的每天出勤的安保人员的数量 Integer total = staffInfoMapper.selectCount(wrapper); - //当日离岗事件个数 - QueryWrapper wrapper1 = new QueryWrapper<>(); - wrapper1.eq("hik_event_type", SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); - wrapper1.apply("date_format(now(),'%Y-%m-%d') = date_format(happen_time,'%Y-%m-%d')"); - Integer leave = caseInfoMapper.selectCount(wrapper1); + //当日离岗事件按设备去重后的个数 + // TODO: 2022/9/2 目前相当于24小时内的计算,之后看需要可改成自定义小时数计算离岗率,即离岗+6小时内仅一次离岗则恢复为100%,多次则累加离岗次数计算离岗率 + Integer leave = caseInfoMapper.selectDemobilizedCount(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); NumberFormat numberFormat = NumberFormat.getInstance(); // 设置精确到小数点后2位 numberFormat.setMaximumFractionDigits(2); @@ -179,7 +195,6 @@ @ResponseBody public Object visitorApplyDetail() { List reasonGroup = applyMapper.selectByVisitReason(); - HashMap resultMap = new HashMap<>(); NumberFormat numberFormat = NumberFormat.getInstance(); // 设置精确到小数点后2位 numberFormat.setMaximumFractionDigits(2); @@ -187,12 +202,17 @@ if(0 == sum){ return ResponseData.success(); } + List resultList = new ArrayList<>(); reasonGroup.forEach(group -> { String reasonName = dictService.getDictNameByCode(SecurityEventDict.VISIT_REASON, group.getVisitReason()); String result = numberFormat.format((float) group.getQuantity() / (float) sum * 100); - resultMap.put(reasonName, result+"%"); + ApplyReasonGroupDTO applyReasonGroupDTO = new ApplyReasonGroupDTO(); + applyReasonGroupDTO.setQuantity(group.getQuantity()); + applyReasonGroupDTO.setVisitReason(reasonName); + applyReasonGroupDTO.setRatio(result+"%"); + resultList.add(applyReasonGroupDTO); }); - return ResponseData.success(resultMap); + return ResponseData.success(resultList); } /** @@ -247,6 +267,32 @@ } /** + * 机动力量实时在岗率,在岗人数除以总应在岗人数,用离岗+6小时内恢复为100%,6小时外再计算 + */ + @GetMapping("/staff/beOnDutyRatio") + @ResponseBody + public Object beOnDutyRatio() { + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("staff_type", 2); + // TODO: 2022/9/2 后续使用产品确定的每天出勤的安保人员的数量 + Integer total = staffInfoMapper.selectCount(wrapper); + if(0 == total){ + return ResponseData.success(null); + } + //当日离岗事件按设备去重后的个数 + // TODO: 2022/9/2 目前相当于24小时内的计算,之后看需要可改成自定义小时数计算离岗率,即离岗+6小时内仅一次离岗则恢复为100%,多次则累加离岗次数计算离岗率 + List onDutyRatioDTOS = caseInfoMapper.selectDemobilizedCountByHour(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); + onDutyRatioDTOS.forEach(dto -> { + NumberFormat numberFormat = NumberFormat.getInstance(); + // 设置精确到小数点后2位 + numberFormat.setMaximumFractionDigits(2); + String result = numberFormat.format(100 - Float.valueOf(dto.getQuantity()) / (float) total * 100); + dto.setRatio(result+"%"); + }); + return ResponseData.success(onDutyRatioDTOS); + } + + /** * 闸机速通门统计-设备状态分组计算数量,devType传闸机字典key * 视频频监控摄像机统计-设备状态分组计算数量,devType传摄像头字典key */ @@ -262,12 +308,17 @@ if(sum <= 0){ return ResponseData.error("无该类设备信息"); } + List resultList = new ArrayList<>(); gateStatusGroup.forEach(group -> { String devStatus = dictService.getDictNameByCode(SecurityEventDict.DEVICE_STATUS, group.getStatus()); String result = numberFormat.format((float) group.getQuantity() / (float) sum * 100); - resultMap.put(devStatus, result+"%"); + GateStatusGroupResponse gateStatusGroupResponse = new GateStatusGroupResponse(); + gateStatusGroupResponse.setStatus(devStatus); + gateStatusGroupResponse.setRatio(result+"%"); + resultList.add(gateStatusGroupResponse); }); - resultMap.put("总", sum); + resultMap.put("total", sum); + resultMap.put("list", resultList); return ResponseData.success(resultMap); } @@ -282,17 +333,38 @@ String position = securityScoreDTO.getPosition(); List caseInfos = caseInfoMapper.selectByPosition(position); //查询各危险级别权重、各类别权重,放入map,避免循环中多次查数据库 - + HashMap hazardScoreMap = new HashMap<>(); + List caseHazardLevelList = hazardLevelMapper.getCaseHazardLevelList(null); + caseHazardLevelList.forEach(hazardLevel -> { + hazardScoreMap.put(hazardLevel.getCode(), hazardLevel.getWeight()); + }); + HashMap categoryScoreMap = new HashMap<>(); + List categoryLevelList = categoryLevelMapper.getCaseCategoryLevelList(null); + categoryLevelList.forEach(categoryLevel -> { + categoryScoreMap.put(categoryLevel.getCode(), categoryLevel.getWeight()); + }); + //事件按楼层分组,计算 List securityScoreDTOs = new ArrayList<>(); caseInfos.forEach(caseInfo -> { SecurityScoreDTO securityScoreDTO1 = new SecurityScoreDTO(); + securityScoreDTO1.setPosition(caseInfo.getPosition()); securityScoreDTO1.setArea(caseInfo.getArea()); - // TODO: 2022/8/4 楼层评分计算根据产品定义调整 -// caseInfo.get -// securityScoreDTO1.setScore(); + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); + Double score = 100 - Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + securityScoreDTO1.setScore(score); + securityScoreDTOs.add(securityScoreDTO1); }); - - return null; + 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); + }); + return ResponseData.success(securityScoreDTOs); } /** @@ -303,9 +375,13 @@ public Object SecurityFrequency(@RequestBody SecurityFrequencyDTO securityFrequencyDTO) { String year = securityFrequencyDTO.getYear(); String month = securityFrequencyDTO.getMonth(); - Integer quantity = caseInfoMapper.selectCountByMonth(year, month); - securityFrequencyDTO.setQuantity(quantity); - return ResponseData.success(securityFrequencyDTO); + if(!StringUtils.isEmpty(year) && StringUtils.isEmpty(month)){ + Integer quantity = caseInfoMapper.selectCountByMonth(year, month); + securityFrequencyDTO.setQuantity(quantity); + return ResponseData.success(securityFrequencyDTO); + } + List list = caseInfoMapper.selectPreMonthCount(); + return ResponseData.success(list); } } 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 ae4d770..f4f075c 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 @@ -1,20 +1,25 @@ package com.casic.missiles.modular.controller.cockpit; +import cn.hutool.core.date.DateUnit; import cn.hutool.core.date.DateUtil; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.casic.missiles.model.response.ResponseData; -import com.casic.missiles.modular.dao.AttendanceInfoMapper; -import com.casic.missiles.modular.dao.CaseInfoMapper; -import com.casic.missiles.modular.dao.HazardLevelMapper; -import com.casic.missiles.modular.dao.StaffInfoMapper; +import com.casic.missiles.modular.dao.*; +import com.casic.missiles.modular.dto.DeviceRepairLogDTO; +import com.casic.missiles.modular.dto.DeviceRepairRequest; import com.casic.missiles.modular.dto.statistics.*; +import com.casic.missiles.modular.enums.SecurityEventType; +import com.casic.missiles.modular.model.CaseCategoryLevel; import com.casic.missiles.modular.model.CaseHazardLevel; +import com.casic.missiles.modular.model.CaseInfo; import com.casic.missiles.modular.model.StaffInfo; +import com.casic.missiles.modular.service.DeviceInfoService; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.util.CollectionUtils; import org.springframework.web.bind.annotation.*; +import java.math.BigDecimal; import java.text.NumberFormat; import java.util.*; import java.util.stream.Collectors; @@ -40,6 +45,12 @@ @Autowired private HazardLevelMapper hazardLevelMapper; + @Autowired + private CategoryLevelMapper categoryLevelMapper; + + @Autowired + private DeviceInfoService deviceInfoService; + /** * 安防事件时域频次统计,每月的每天安防事件个数(原方案) * 月维度:展示每个月的每天的数据 @@ -89,15 +100,17 @@ List monthList = caseInfoMapper.selectPreMonthCountByYear(year); Map> collect = monthList.stream().collect(Collectors.groupingBy(PreMonthOrWeekCaseDTO::getHazardLevelCode)); HashMap strAvgMap = new HashMap<>(); + List resultList = new ArrayList<>(); for (String key : collect.keySet()) { List preMonthOrWeekCaseDTOS = collect.get(key); int sum = preMonthOrWeekCaseDTOS.stream().mapToInt(PreMonthOrWeekCaseDTO::getQuantity).sum(); //若年份是本年,则使用个安防级别数量/当前月份数 //若不是本年,除数为12 MonthAndWeekDTO monthAndWeekDTO = new MonthAndWeekDTO(); + String hazardName = hazardLevelMapper.selectHazardNameByCode(key); + monthAndWeekDTO.setLevelName(hazardName); if(year.equals(String.valueOf(DateUtil.thisYear()))){ monthAndWeekDTO.setMonthQuantity(sum / DateUtil.thisMonth()); -// monthAndWeekDTO.setLevelName(); strAvgMap.put(key, monthAndWeekDTO); }else{ monthAndWeekDTO.setMonthQuantity(sum / 12); @@ -113,27 +126,37 @@ if(year.equals(String.valueOf(DateUtil.thisYear()))){ if(!Objects.isNull(strAvgMap.get(key))){ MonthAndWeekDTO monthAndWeekDTO = strAvgMap.get(key); + String hazardName = hazardLevelMapper.selectHazardNameByCode(key); + monthAndWeekDTO.setLevelName(hazardName); monthAndWeekDTO.setWeekQuantity(sum / DateUtil.thisWeekOfYear()); strAvgMap.put(key, monthAndWeekDTO); }else{ MonthAndWeekDTO monthAndWeekDTO = new MonthAndWeekDTO(); + String hazardName = hazardLevelMapper.selectHazardNameByCode(key); + monthAndWeekDTO.setLevelName(hazardName); monthAndWeekDTO.setWeekQuantity(sum / DateUtil.thisWeekOfYear()); strAvgMap.put(key, monthAndWeekDTO); } }else{ if(!Objects.isNull(strAvgMap.get(key))){ MonthAndWeekDTO monthAndWeekDTO = strAvgMap.get(key); + String hazardName = hazardLevelMapper.selectHazardNameByCode(key); + monthAndWeekDTO.setLevelName(hazardName); monthAndWeekDTO.setWeekQuantity(sum / 52); strAvgMap.put(key, monthAndWeekDTO); }else{ MonthAndWeekDTO monthAndWeekDTO = new MonthAndWeekDTO(); + String hazardName = hazardLevelMapper.selectHazardNameByCode(key); + monthAndWeekDTO.setLevelName(hazardName); monthAndWeekDTO.setWeekQuantity(sum / 52); strAvgMap.put(key, monthAndWeekDTO); } } } - avgMonthAndWeekGroupDTO.setMap(strAvgMap); - return ResponseData.success(avgMonthAndWeekGroupDTO); + strAvgMap.keySet().forEach(key -> { + resultList.add(strAvgMap.get(key)); + }); + return ResponseData.success(resultList); } /** @@ -181,12 +204,178 @@ } /** - * 员工考勤人数变化,功能待定 + * 员工考勤人数变化,统计当天(横坐标为时)及近7天(横坐标为天)的考勤人数变化,只要发生一次考勤识别,次数的基数就正常增加(没有上班下班区分) */ + @PostMapping("/staff/attendanceNumber/{dimension}") + @ResponseBody + public Object attendanceNumber(@PathVariable("dimension") String dimension) { + List attendanceNumberDTOs = null; + List> resultList = new ArrayList<>(); + if("week".equals(dimension)){ + //近7天数据按天分组统计 + attendanceNumberDTOs = attendanceInfoMapper.getCountForWeek(); + }else if("day".equals(dimension)) { + //今天数据按小时分组统计 + attendanceNumberDTOs = attendanceInfoMapper.getCountForDay(); + } + if(CollectionUtils.isEmpty(attendanceNumberDTOs)){ + return ResponseData.error("该查询条件下,无员工出勤数据!"); + } + Map> collect = attendanceNumberDTOs.stream().collect(Collectors.groupingBy(AttendanceNumberDTO::getDate)); + collect.keySet().forEach(key -> { + List attendanceNumberDTOS = collect.get(key); + AttendanceNumberDTO attendanceNumberDTO = attendanceNumberDTOS.get(0); + AttendanceNumberDTO attendanceNumberDTO2 = attendanceNumberDTOS.get(1); + Map resultMap = new HashMap<>(); + resultMap.put(attendanceNumberDTO.getStaffType(), attendanceNumberDTO.getQuantity()); + resultMap.put(attendanceNumberDTO2.getStaffType(), attendanceNumberDTO2.getQuantity()); + resultMap.put("staticTime", attendanceNumberDTO.getDate()); + resultList.add(resultMap); + }); + return ResponseData.success(resultList); + } /** - * 近30天/近一周安保人员到岗排行 + * 早晚高峰区域安防评估 */ + @PostMapping("/security/assessment/{dimension}") + @ResponseBody + public Object securityAssessment(@PathVariable("dimension") String dimension) { + //查询各危险级别权重、各类别权重,放入map,避免循环中多次查数据库 + HashMap hazardScoreMap = new HashMap<>(); + List caseHazardLevelList = hazardLevelMapper.getCaseHazardLevelList(null); + caseHazardLevelList.forEach(hazardLevel -> { + hazardScoreMap.put(hazardLevel.getCode(), hazardLevel.getWeight()); + }); + HashMap categoryScoreMap = new HashMap<>(); + List categoryLevelList = categoryLevelMapper.getCaseCategoryLevelList(null); + categoryLevelList.forEach(categoryLevel -> { + categoryScoreMap.put(categoryLevel.getCode(), categoryLevel.getWeight()); + }); + HashMap hashMap = new HashMap<>(); + if("week".equals(dimension)){ + //近7天早晚高峰数据 + List caseInfos = caseInfoMapper.selectListBySevenDay(); + //按时间(天)进行分组 + caseInfos.forEach(caseInfo -> { + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); + Double score = Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + String[] array = caseInfo.getHappenTime().split(" "); + String dayTime = array[0]; + BigDecimal preScore; + if(hashMap.containsKey(dayTime)){ + Double aDouble = hashMap.get(dayTime); + preScore = new BigDecimal(aDouble.toString()); + + }else{ + preScore = new BigDecimal("100.0"); + } + BigDecimal nowScore = new BigDecimal(score.toString()); + hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); + }); + return ResponseData.success(hashMap); + }else if("day".equals(dimension)) { + //今天数据按小时分组统计 + List caseInfos = caseInfoMapper.selectListByToday(); + caseInfos.forEach(caseInfo -> { + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); + Double score = Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + String[] array = caseInfo.getHappenTime().split(":"); + String dayTime = array[0]; + BigDecimal preScore; + if(hashMap.containsKey(dayTime)){ + Double aDouble = hashMap.get(dayTime); + preScore = new BigDecimal(aDouble.toString()); + + }else{ + preScore = new BigDecimal("100.0"); + } + BigDecimal nowScore = new BigDecimal(score.toString()); + hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); + }); + return ResponseData.success(hashMap); + } + return null; + } + + /** + * 重点区域安防事态评估,统计重点区域6:00-23:00按小时分组数据 + */ + @GetMapping("/security/keyAreaStatistic") + @ResponseBody + public Object keyAreaStatistic() { + //查询各危险级别权重、各类别权重,放入map,避免循环中多次查数据库 + HashMap hazardScoreMap = new HashMap<>(); + List caseHazardLevelList = hazardLevelMapper.getCaseHazardLevelList(null); + caseHazardLevelList.forEach(hazardLevel -> { + hazardScoreMap.put(hazardLevel.getCode(), hazardLevel.getWeight()); + }); + HashMap categoryScoreMap = new HashMap<>(); + List categoryLevelList = categoryLevelMapper.getCaseCategoryLevelList(null); + categoryLevelList.forEach(categoryLevel -> { + categoryScoreMap.put(categoryLevel.getCode(), categoryLevel.getWeight()); + }); + HashMap hashMap = new HashMap<>(); + //今天数据按小时分组统计 + List caseInfos = caseInfoMapper.selectListByToday2(); + caseInfos.forEach(caseInfo -> { + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); + Double score = Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + String[] array = caseInfo.getHappenTime().split(":"); + String dayTime = array[0]; + BigDecimal preScore; + if(hashMap.containsKey(dayTime)){ + Double aDouble = hashMap.get(dayTime); + preScore = new BigDecimal(aDouble.toString()); + + }else{ + preScore = new BigDecimal("100.0"); + } + BigDecimal nowScore = new BigDecimal(score.toString()); + hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); + }); + return ResponseData.success(hashMap); + } + + /** + * 安防机动支援力量调配响应评估,根据事件已解决状态及已解决时间-发送时间,按时间(小时)分组统计 + */ + @GetMapping("/security/responseAssess") + @ResponseBody + public Object responseAssess() { + //查询各危险级别权重、各类别权重,放入map,避免循环中多次查数据库 + HashMap hazardScoreMap = new HashMap<>(); + List caseHazardLevelList = hazardLevelMapper.getCaseHazardLevelList(null); + caseHazardLevelList.forEach(hazardLevel -> { + hazardScoreMap.put(hazardLevel.getCode(), hazardLevel.getWeight()); + }); + HashMap hashMap = new HashMap<>(); + //今天数据按小时分组统计 + List caseInfos = caseInfoMapper.selectListByToday3(); + caseInfos.forEach(caseInfo -> { + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + //扣分=事件级别权重*未解决小时数 + Date updateTime = DateUtil.parse(caseInfo.getUpdateTime()); + Date happenTime = DateUtil.parse(caseInfo.getHappenTime()); + long between = DateUtil.between(updateTime, happenTime, DateUnit.HOUR); + Double score = Double.valueOf(hazardWeight)*between; + String[] array = caseInfo.getHappenTime().split(":"); + String dayTime = array[0]; + BigDecimal preScore; + if(hashMap.containsKey(dayTime)){ + Double aDouble = hashMap.get(dayTime); + preScore = new BigDecimal(aDouble.toString()); + }else{ + preScore = new BigDecimal("100.0"); + } + BigDecimal nowScore = new BigDecimal(score.toString()); + hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); + }); + return ResponseData.success(hashMap); + } /** * 重点区域威胁事件类型统计,优先级2,统计近7天和近30天 @@ -224,7 +413,34 @@ } /** - * 设备状态计算系数和评判,优先级3,需确认设备恢复时间是否可以获取 + * 近30天/近一周安保人员到岗排行 */ + + /** + * 安保等级评估,发生离岗事件减1分 + */ + @GetMapping("/security/levelAssess") + @ResponseBody + public Object securityLevelAssess() { + //今天数据按小时分组统计 + List resultList = caseInfoMapper.selectListByType(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); + resultList.forEach(result -> { + BigDecimal deScore = new BigDecimal(result.getQuantity()); + BigDecimal preScore = new BigDecimal("100.0"); + result.setScore(preScore.subtract(deScore).doubleValue()); + }); + return ResponseData.success(resultList); + } + + /** + * 设备状态计算系数和评判,即设备维修管理查询(不分页) + */ + @PostMapping("/device/repairList") + @ResponseBody + public Object repairList(@RequestBody DeviceRepairRequest deviceRepairRequest) { + List deviceRepairLogDTOS = deviceInfoService.deviceRepairListPage(deviceRepairRequest); + return ResponseData.success(deviceRepairLogDTOS); + } + } 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 fbf8ab6..c71a15a 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 @@ -1,13 +1,12 @@ package com.casic.missiles.modular.controller.hik; +import cn.hutool.core.date.DateTime; +import cn.hutool.core.date.DateUtil; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.casic.missiles.model.response.ResponseData; import com.casic.missiles.modular.dao.HikFaceGroupInfoMapper; -import com.casic.missiles.modular.dto.hik.EventSubscribeRequest; -import com.casic.missiles.modular.dto.hik.FaceGroupAdditionRequest; -import com.casic.missiles.modular.dto.hik.HikRecvEvent; -import com.casic.missiles.modular.dto.hik.OrgBatchAdd; +import com.casic.missiles.modular.dto.hik.*; import com.casic.missiles.modular.enums.HikUri; import com.casic.missiles.modular.enums.SecurityEventType; import com.casic.missiles.modular.model.CaseInfo; @@ -18,16 +17,20 @@ import com.casic.missiles.modular.util.CaseInfoFactoryUtil; import com.casic.missiles.modular.util.HikUtil; import com.casic.missiles.modular.util.ThreadPoolUtil; +import com.casic.missiles.modular.util.WebSocket; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; -import org.springframework.web.bind.annotation.*; +import org.springframework.util.CollectionUtils; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.RestController; -import java.net.InetAddress; -import java.net.UnknownHostException; import java.util.ArrayList; +import java.util.Iterator; import java.util.List; import java.util.Objects; @@ -38,7 +41,6 @@ */ @Slf4j @RestController -@RequestMapping("/hik") public class HikController { @Autowired @@ -53,28 +55,37 @@ @Autowired private HikService hikService; + @Autowired + private HikFaceGroupInfoMapper hikFaceGroupInfoMapper; + + @Autowired + private WebSocket webSocket; + @Value("${server.port}") private int serverPort; - @Autowired - private HikFaceGroupInfoMapper hikFaceGroupInfoMapper; /** * 海康事件订阅 */ - @PostMapping("/event/subscribe") + @PostMapping("/hik/event/subscribe") @ResponseBody - public Object eventSubscribe() throws UnknownHostException { + public Object eventSubscribe() { EventSubscribeRequest eventSubscribeRequest = new EventSubscribeRequest(); ArrayList list = new ArrayList<>(); list.add(SecurityEventType.DEVICE_OFFLINE); + list.add(SecurityEventType.DEVICE_ONLINE); list.add(SecurityEventType.KEY_PERSONNEL_IDENTIFY_EVENT); list.add(SecurityEventType.MONITORING_POINT_OFFLINE); + list.add(SecurityEventType.MONITORING_POINT_ONLINE); list.add(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); list.add(SecurityEventType.PERSONNEL_GATHER_EVENT); - InetAddress localHost = InetAddress.getLocalHost(); + list.add(SecurityEventType.VISITOR_REGISTER); + list.add(SecurityEventType.VISITOR_CHECKOUT); + list.add(SecurityEventType.HIGH_ALTITUDE_PARABOLIC); +// InetAddress localHost = InetAddress.getLocalHost(); eventSubscribeRequest.setEventTypes(list); - eventSubscribeRequest.setEventDest("https://" + localHost + ":" + serverPort + "/eventRcv"); + eventSubscribeRequest.setEventDest("http://" + "192.168.10.6" + ":" + serverPort + "/eventRcv"); //订阅类型,0-订阅原始事件,1-联动事件,2-原始事件和联动事件,不填使用默认值0 eventSubscribeRequest.setSubType(0); /** @@ -92,19 +103,25 @@ } /** + * 查询事件订阅信息 + */ + @PostMapping("/hik/event/query") + @ResponseBody + public Object eventQuery() { + String result = HikUtil.hikApi(HikUri.EVENT_INFO, ""); + return result; + } + + /** * 海康事件接收 */ @PostMapping("/eventRcv") @ResponseBody public Object eventRcv(@RequestBody HikRecvEvent hikRecvEvent) { //1、接收所需事件类型 - Long eventType = hikRecvEvent.getEventType(); + Number eventType = hikRecvEvent.getEventType(); log.info("接收到安防事件类型为:{}", eventType); CaseInfo caseInfo = caseInfoFactoryUtil.getCaseInfo(eventType); - //接收到不关心事件直接返回 - if(Objects.isNull(caseInfo)){ - return ResponseData.success(); - } //2、不同事件不同处理,caseInfoFactoryUtil已设置好事件基础定义信息 // 再为事件添加状态、设备编码、设备名称、位置、区域、时间 // 异步处理事件 @@ -114,19 +131,23 @@ caseHandle(hikRecvEvent, eventType, caseInfo); } })); +// caseHandle(hikRecvEvent, eventType, caseInfo); - return null; + return ResponseData.success(); } - private void caseHandle(HikRecvEvent hikRecvEvent, Long eventType, CaseInfo caseInfo) { + private void caseHandle(HikRecvEvent hikRecvEvent, Number eventType, CaseInfo caseInfo) { JSONArray eventArray = hikRecvEvent.getEventArray(); List caseInfos = new ArrayList<>(); - while (eventArray.stream().iterator().hasNext()) { + Iterator iterator = eventArray.iterator(); + while (iterator.hasNext()) { CaseInfo caseInfo1 = new CaseInfo(); - BeanUtils.copyProperties(caseInfo, caseInfo1); - JSONObject event = (JSONObject) eventArray.stream().iterator().next(); + if(!Objects.isNull(caseInfo)){ + BeanUtils.copyProperties(caseInfo, caseInfo1); + } + JSONObject event = (JSONObject) iterator.next(); //5种事件进行不同处理 - if(SecurityEventType.KEY_PERSONNEL_IDENTIFY_EVENT == eventType){ + if (SecurityEventType.KEY_PERSONNEL_IDENTIFY_EVENT.equals(eventType)) { //判断所属人脸分组 JSONObject data = (JSONObject) event.get("data"); JSONObject faceRecognitionResult = (JSONObject) data.get("faceRecognitionResult"); @@ -142,52 +163,101 @@ if (faceGroupCode.equals(blackListGroup.getFaceGroupCode())) { //黑名单分组处理 caseInfo1 = hikService.blackListHandle(event, caseInfo1); - }else if(faceGroupCode.equals(propertyPersonnelGroup.getFaceGroupCode())){ + } else if (faceGroupCode.equals(propertyPersonnelGroup.getFaceGroupCode())) { //考勤分组处理-物业人员,添加到考勤表 hikService.propertyAttendanceHandle(event); - }else if(faceGroupCode.equals(securityPersonnelGroup.getFaceGroupCode())){ + } else if (faceGroupCode.equals(securityPersonnelGroup.getFaceGroupCode())) { //考勤分组处理-安保人员,添加到考勤表 hikService.securityPersonnelHandle(event); - }else { + } else { return; } - }else if(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT == eventType){ + } else if (SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT.equals(eventType)) { //离岗事件处理 caseInfo1 = hikService.demobilizedHandle(event, caseInfo1); - }else if(SecurityEventType.PERSONNEL_GATHER_EVENT == eventType){ + } else if (SecurityEventType.PERSONNEL_GATHER_EVENT.equals(eventType)) { //人员聚集事件处理 caseInfo1 = hikService.personGatherHandle(event, caseInfo1); - }else if(SecurityEventType.MONITORING_POINT_OFFLINE == eventType){ + } else if (SecurityEventType.MONITORING_POINT_OFFLINE.equals(eventType)) { //监控点离线事件处理 caseInfo1 = hikService.monitorPointOfflineHandle(event, caseInfo1); - }else if(SecurityEventType.DEVICE_OFFLINE == eventType){ + } else if (SecurityEventType.MONITORING_POINT_ONLINE.equals(eventType)) { + //监控点上线事件处理 + hikService.monitorPointOnlineHandle(event); + } else if (SecurityEventType.DEVICE_OFFLINE.equals(eventType)) { //装置离线事件处理 caseInfo1 = hikService.deviceOfflineHandle(event, caseInfo1); - }else if(SecurityEventType.VISITOR_REGISTER == eventType){ + } else if (SecurityEventType.DEVICE_ONLINE.equals(eventType)) { + //装置上线处理 + hikService.deviceOnlineHandle(event); + } else if (SecurityEventType.VISITOR_REGISTER.equals(eventType)) { //记录访客登记记录,添加到访客记录表 hikService.visitorRegisterHandler(event); - }else if(SecurityEventType.VISITOR_CHECKOUT == eventType){ + } else if (SecurityEventType.VISITOR_CHECKOUT.equals(eventType)) { //记录访客签离记录 hikService.visitorCheckOutHandler(event); } - if(!Objects.isNull(caseInfo1) && !StringUtils.isEmpty(caseInfo1.getHappenTime())){ + if (!Objects.isNull(caseInfo1) && !StringUtils.isEmpty(caseInfo1.getHappenTime())) { caseInfos.add(caseInfo1); } } //3、安防事件入库 - if(!caseInfoService.insertCaseInfoBatch(caseInfos)){ - log.error("安防事件批量入库异常"); + if (!CollectionUtils.isEmpty(caseInfos) && !caseInfoService.insertCaseInfoBatch(caseInfos)) { + log.error("安防事件批量入库异常!"); } // TODO: 2022/8/15 webSocket推送 + if (CollectionUtils.isEmpty(caseInfos)) { + log.info("webSocket事件推送"); + webSocket.sendAllMessage(JSONObject.toJSONString(caseInfos)); + } return; } /** + * 以图搜图,前端用于轨迹追踪 + */ + @PostMapping("/hik/search/picture") + @ResponseBody + public Object searchPictures(@RequestBody SearchPicturesRequest searchPicturesRequest) { + DateTime startDateTime = DateUtil.parse(searchPicturesRequest.getStartTime()); + DateTime endDateTime = DateUtil.parse(searchPicturesRequest.getEndTime()); + String startTime = DateUtil.format(startDateTime, "yyyy-MM-dd'T'HH:mm:ss.SSSXXX"); + String endTime = DateUtil.format(endDateTime, "yyyy-MM-dd'T'HH:mm:ss.SSSXXX"); + searchPicturesRequest.setStartTime(startTime); + searchPicturesRequest.setEndTime(endTime); + String body = JSONObject.toJSONString(searchPicturesRequest); + String resultStr = HikUtil.hikApi(HikUri.SEARCH_PICTURES, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (!"0".equals(resultJson.get("code"))) { + log.error("请求海康,以图搜图失败,海康response:{}", resultStr); + return ResponseData.error("以图搜图失败"); + } + return ResponseData.success(resultJson); + } + + + /** + * 海康事件取消订阅 + */ + @PostMapping("/hik/event/cancel") + @ResponseBody + public Object eventCancelSubscribe(@RequestBody CancelSubscribeRequest cancelSubscribeRequest) { + String body = JSONObject.toJSONString(cancelSubscribeRequest); + String resultStr = HikUtil.hikApi(HikUri.EVENT_CANCEL, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (!"0".equals(resultJson.get("code"))) { + log.error("请求海康,取消订阅失败,海康response:{}", resultStr); + return ResponseData.error("取消订阅失败"); + } + return ResponseData.success(resultJson); + } + + /** * 单个添加海康人脸分组 * api->hik单个添加人脸分组api->response->mysql */ - @PostMapping("/faceGroup/single/add") + @PostMapping("/hik/faceGroup/single/add") @ResponseBody public Object faceGroupAddition(@RequestBody FaceGroupAdditionRequest faceGroupAdditionRequest) { String body = JSONObject.toJSONString(faceGroupAdditionRequest); @@ -212,7 +282,7 @@ * 批量添加海康组织 * api->hik批量添加组织api->response */ - @PostMapping("/org/batch/add") + @PostMapping("/hik/org/batch/add") @ResponseBody public Object orgBatchAdd(@RequestBody List orgBatchAddRequest) { String body = JSONObject.toJSONString(orgBatchAddRequest); @@ -232,4 +302,62 @@ return ResponseData.error("批量添加组织失败"); } + /** + * 获取人员列表 + */ + @PostMapping("/hik/person/personList") + @ResponseBody + public Object personList() { + PersonListRequest request = new PersonListRequest(); + request.setPageNo(1); + request.setPageSize(100); + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi("/api/resource/v2/person/personList", body); + return resultStr; + } + + /** + * 获取组织列表 + */ + @PostMapping("/hik/org/orgList") + @ResponseBody + public Object orgList() { + PersonListRequest request = new PersonListRequest(); + request.setPageNo(1); + request.setPageSize(100); + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi("/api/resource/v1/org/orgList", body); + return resultStr; + } + + /** + * 查询访客权限下载记录 + */ + @PostMapping("/hik/auth/result") + @ResponseBody + public Object authResult() { + PersonListRequest request = new PersonListRequest(); + request.setPageNo(1); + request.setPageSize(100); + request.setOrderId("ba101db6246711edaea66f7939a13638"); + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi("/api/visitor/v1/auth/result", body); + return resultStr; + } + + /** + * 人脸图片获取 + */ + @PostMapping("/hik/face/picture") + @ResponseBody + public Object facePicture() { + FaceRequest request = new FaceRequest(); +// List list = new ArrayList<>(); +// list.add(""); + request.setCertificateNum("wanggong"); + String body = JSONObject.toJSONString(request); + String resultStr = HikUtil.hikApi("/api/frs/v1/face", body); + return resultStr; + } + } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/AssetInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/AssetInfoMapper.java index 4f64e83..c0684ee 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/AssetInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/AssetInfoMapper.java @@ -17,6 +17,6 @@ @Mapper public interface AssetInfoMapper extends BaseMapper { - List getAssetInfoListPage(@Param("page") Page page, AssetInfoRequest assetInfoRequest); + List getAssetInfoListPage(@Param("page") Page page, @Param("assetInfoRequest") AssetInfoRequest assetInfoRequest); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/AttendanceInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/AttendanceInfoMapper.java index f9e793e..ec87e46 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/AttendanceInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/AttendanceInfoMapper.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.statistics.AttendanceNumberDTO; import com.casic.missiles.modular.dto.statistics.AttendanceRatioDTO; import com.casic.missiles.modular.model.AttendanceInfo; import org.apache.ibatis.annotations.Mapper; @@ -17,7 +18,7 @@ */ @Mapper public interface AttendanceInfoMapper extends BaseMapper { - List getAttendanceInfoListPage(@Param("page") Page page, StaffInfoRequest attendanceInfoRequest); + List getAttendanceInfoListPage(@Param("page") Page page, @Param("attendanceInfoRequest") StaffInfoRequest attendanceInfoRequest); AttendanceInfo selectByCodeAndDate(@Param("staffCode") String staffCode); @@ -26,4 +27,8 @@ List getCountByTypeAndDateForMonth(@Param("staffType")String staffType); List getCountByTypeAndDateForYear(@Param("staffType")String staffType); + + List getCountForWeek(); + + List getCountForDay(); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java index ce94b8f..6137a7d 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java @@ -17,5 +17,5 @@ @Mapper public interface BlackInfoMapper extends BaseMapper { - List getBlackInfoListPage(@Param("page") Page page, BlackInfoRequest blackInfoRequest); + List getBlackInfoListPage(@Param("page") Page page, @Param("blackInfoRequest") BlackInfoRequest blackInfoRequest); } 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 efda6b3..50aaa6f 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 @@ -20,7 +20,7 @@ List getCaseInfoListPage(@Param("page") Page page, @Param("caseInfoRequest") CaseInfoRequest caseInfoRequest); - int updateStatusById(CaseInfoRequest caseInfoRequest); + int updateStatusById(@Param("caseInfoRequest") CaseInfoRequest caseInfoRequest); List selectByLevelAndMonth(@Param("year") String year); @@ -47,4 +47,20 @@ List selectPreWeekCountByThirtyDay(); List selectPreDayCountBySevenDay(); + + Integer selectDemobilizedCount(@Param("eventType") Number personnelDemobilizedEvent); + + List selectPreMonthCount(); + + List selectListBySevenDay(); + + List selectListByToday(); + + List selectListByToday2(); + + List selectListByToday3(); + + List selectListByType(@Param("eventType") Number eventType); + + List selectDemobilizedCountByHour(@Param("eventType") Number eventType); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/CategoryLevelMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/CategoryLevelMapper.java index 52fc714..afe1650 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/CategoryLevelMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/CategoryLevelMapper.java @@ -17,9 +17,9 @@ @Mapper public interface CategoryLevelMapper extends BaseMapper { - List getCaseCategoryLevelListPage(@Param("page") Page page, CategoryLevelRequest categoryLevelRequest); + List getCaseCategoryLevelListPage(@Param("page") Page page, @Param("categoryLevelRequest") CategoryLevelRequest categoryLevelRequest); - List getCaseCategoryLevelList(CategoryLevelRequest categoryLevelRequest); + List getCaseCategoryLevelList(@Param("categoryLevelRequest") CategoryLevelRequest categoryLevelRequest); CaseCategoryLevel getCaseCategoryLevel(@Param("categoryLevelCode") String categoryLevelCode); 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 66353b1..2555a09 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 @@ -19,7 +19,7 @@ @Mapper public interface DeviceInfoMapper extends BaseMapper { - List getDeviceInfoListPage(@Param("page") Page page, DeviceInfoRequest deviceInfoRequest); + List getDeviceInfoListPage(@Param("page") Page page, @Param("deviceInfoRequest") DeviceInfoRequest deviceInfoRequest); List getDeviceInfoList(@Param("deviceInfoRequest") DeviceInfoRequest deviceInfoRequest); @@ -27,6 +27,8 @@ DeviceInfo getByIndexCode(@Param("srcIndex") String srcIndex); + DeviceInfo getByIp(@Param("ip") String ip); + List selectIndexCodesByCodes(@Param("deviceCodes") List deviceCodes); List selectByType(@Param("devType") String devType); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java index 41dd0af..5bfaf63 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java @@ -5,6 +5,7 @@ import com.casic.missiles.modular.dto.DeviceRepairRequest; import com.casic.missiles.modular.model.DeviceRepairLog; import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; import java.util.List; @@ -16,7 +17,7 @@ @Mapper public interface DeviceRepairLogMapper extends BaseMapper { - List getDeviceRepairListPage(Page page, DeviceRepairRequest deviceRepairRequest); + List getDeviceRepairListPage(@Param("page") Page page, @Param("deviceRepairRequest")DeviceRepairRequest deviceRepairRequest); - List getDeviceRepairList(DeviceRepairRequest deviceRepairRequest); + List getDeviceRepairList(@Param("deviceRepairRequest") DeviceRepairRequest deviceRepairRequest); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java index 9035c47..4823ac1 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java @@ -18,7 +18,7 @@ @Mapper public interface FireEquipInfoMapper extends BaseMapper { - List getFireEquipInfoListPage(@Param("page") Page page, FireEquipRequest fireEquipRequest); + List getFireEquipInfoListPage(@Param("page") Page page, @Param("fireEquipRequest") FireEquipRequest fireEquipRequest); FireEquipInfo getFireEquipInfo(@Param("equipCode") String equipCode); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/GateGroupMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/GateGroupMapper.java index d8c330d..977a427 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/GateGroupMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/GateGroupMapper.java @@ -17,7 +17,7 @@ */ @Mapper public interface GateGroupMapper extends BaseMapper { - List getGateGroupListPage(@Param("page") Page page, GateGroupRequest gateGroupRequest); + List getGateGroupListPage(@Param("page") Page page, @Param("gateGroupRequest") GateGroupRequest gateGroupRequest); GateGroup getGateGroupByName(@Param("groupName") String groupName); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/HazardLevelMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/HazardLevelMapper.java index 8957780..dcf47bb 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/HazardLevelMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/HazardLevelMapper.java @@ -17,11 +17,13 @@ @Mapper public interface HazardLevelMapper extends BaseMapper { - List getCaseHazardLevelListPage(@Param("page") Page page, HazardLevelRequest hazardLevelRequest); + List getCaseHazardLevelListPage(@Param("page") Page page, @Param("hazardLevelRequest") HazardLevelRequest hazardLevelRequest); - List getCaseHazardLevelList(HazardLevelRequest hazardLevelRequest); + List getCaseHazardLevelList(@Param("hazardLevelRequest") HazardLevelRequest hazardLevelRequest); CaseHazardLevel getCaseHazardLevel(@Param("hazardLevelCode") String hazardLevelCode); List selectHazardName(); + + String selectHazardNameByCode(@Param("hazardLevelCode") String hazardLevelCode); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/HikCaseDefineMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/HikCaseDefineMapper.java index 0dc47d1..f162fef 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/HikCaseDefineMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/HikCaseDefineMapper.java @@ -12,5 +12,5 @@ */ @Mapper public interface HikCaseDefineMapper extends BaseMapper { - HikCaseDefine getHikCaseDefine(@Param("caseTypeCode") Long caseTypeCode); + HikCaseDefine getHikCaseDefine(@Param("caseTypeCode") Number caseTypeCode); } 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 f8a674c..fe5afc2 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 @@ -17,11 +17,13 @@ @Mapper public interface StaffInfoMapper extends BaseMapper { - List getStaffInfoListPage(@Param("page") Page page, StaffInfoRequest staffInfoRequest); + List getStaffInfoListPage(@Param("page") Page page, @Param("staffInfoRequest") StaffInfoRequest staffInfoRequest); StaffInfo selectByCode(@Param("staffCode") String staffCode); - List getStaffInfoList(StaffInfoRequest staffInfoRequest); + List getStaffInfoList(@Param("staffInfoRequest") StaffInfoRequest staffInfoRequest); - List selectBatchCodes(List list); + List selectBatchCodes(@Param("list") List list); + + int updateByCodeForCard(@Param("staffCode") String staffCode, @Param("cardNo") String cardNo); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitInfoMapper.java index b1217c5..6c52542 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitInfoMapper.java @@ -16,7 +16,7 @@ */ @Mapper public interface VisitInfoMapper extends BaseMapper { - List getVisitInfoListPage(@Param("page") Page page, VisitorRequest visitorRequest); + List getVisitInfoListPage(@Param("page") Page page, @Param("visitorRequest") VisitorRequest visitorRequest); VisitInfo selectByOrderId(@Param("orderId") String orderId); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitorApplyMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitorApplyMapper.java index c09f3c0..6ea55bd 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitorApplyMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitorApplyMapper.java @@ -18,7 +18,7 @@ @Mapper public interface VisitorApplyMapper extends BaseMapper { - List getVisitorApplyListPage(@Param("page") Page page, VisitorApplyRequest visitorApplyRequest); + List getVisitorApplyListPage(@Param("page") Page page, @Param("visitorApplyRequest") VisitorApplyRequest visitorApplyRequest); List selectByVisitReason(); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/AttendanceInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/AttendanceInfoMapper.xml index b2ece71..f8bdd6e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/AttendanceInfoMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/AttendanceInfoMapper.xml @@ -43,7 +43,8 @@ and staff_type = #{staffType} - and YEARWEEK(date_format(atte_date, '%Y-%m-%d'), 1) = YEARWEEK(now(),1); + AND DATE_SUB(CURDATE(), INTERVAL 7 DAY) <= DATE(atte_date) + GROUP BY DATE_FORMAT(atte_date, '%Y-%m-%d') @@ -69,4 +70,20 @@ GROUP BY DATE_FORMAT(atte_date, '%Y-%m') + + + \ No newline at end of file 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 2b6953f..06ec0a8 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 @@ -28,7 +28,9 @@ @@ -87,7 +89,8 @@ SELECT hazard_level_code as levelCode, count(id) as quantity FROM bus_case_info WHERE hazard_level_code is not null - AND DATE_SUB(CURDATE(), INTERVAL 7 DAY) <= date(happen_time); + AND is_key_area = 1 + AND DATE_SUB(CURDATE(), INTERVAL 7 DAY) <= date(happen_time) GROUP BY hazard_level_code @@ -95,7 +98,8 @@ SELECT hazard_level_code as levelCode, count(id) as quantity FROM bus_case_info WHERE hazard_level_code is not null - AND DATE_SUB(CURDATE(), INTERVAL 30 DAY) <= date(happen_time); + AND is_key_area = 1 + AND DATE_SUB(CURDATE(), INTERVAL 30 DAY) <= date(happen_time) GROUP BY hazard_level_code @@ -122,4 +126,71 @@ AND hazard_level_code is not null GROUP BY DATE_FORMAT(happen_time,'%Y-%m-%d') + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/CategoryLevelMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/CategoryLevelMapper.xml index 4670b1f..1d25cbd 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/CategoryLevelMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/CategoryLevelMapper.xml @@ -20,11 +20,11 @@ SELECT * FROM bus_case_category_level WHERE 1=1 - - and code = #{code} + + and code = #{categoryLevelRequest.code} - - and name = #{name} + + and name = #{categoryLevelRequest.name} ORDER by create_time DESC 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 9b66fd8..bfd84b7 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 @@ -98,4 +98,10 @@ #{item} + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceRepairLogMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceRepairLogMapper.xml index 078ed3c..cf1a481 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceRepairLogMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceRepairLogMapper.xml @@ -22,14 +22,14 @@ SELECT * FROM bus_device_repair_log WHERE 1=1 - - and device_code = #{devCode} + + and device_code = #{deviceRepairRequest.devCode} - - and device_name = #{devName} + + and device_name = #{deviceRepairRequest.devName} - - and DATE_FORMAT(create_time,"%y%m%d") = DATE_FORMAT(#{createTime},"%y%m%d") + + and DATE_FORMAT(create_time,"%y%m%d") = DATE_FORMAT(#{deviceRepairRequest.createTime},"%y%m%d") ORDER by create_time DESC diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/HazardLevelMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/HazardLevelMapper.xml index f16f2b9..458322b 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/HazardLevelMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/HazardLevelMapper.xml @@ -20,11 +20,11 @@ SELECT * FROM bus_case_hazard_level WHERE 1=1 - - and code = #{code} + + and code = #{hazardLevelRequest.code} - - and name = #{name} + + and name = #{hazardLevelRequest.name} ORDER by create_time DESC @@ -42,4 +42,10 @@ SELECT name FROM bus_case_hazard_level + + \ 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 557237e..b6a183a 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 @@ -50,4 +50,10 @@ + + + UPDATE bus_staff_info + SET card_no = #{cardNo} + WHERE staff_code = #{staffCode} + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitInfoMapper.xml index 84aa84f..230529a 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitInfoMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitInfoMapper.xml @@ -27,5 +27,6 @@ SELECT * FROM bus_visit_info WHERE order_id = #{orderId} and DATE_FORMAT(in_time,'%Y-%m-%d') = CURRENT_DATE + limit 1 \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/BlackPictureRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/BlackPictureRequest.java new file mode 100644 index 0000000..fc92701 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/BlackPictureRequest.java @@ -0,0 +1,14 @@ +package com.casic.missiles.modular.dto; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/29 19:26 + */ +@Data +public class BlackPictureRequest { + private String picUri; + private String serverIndexCode; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/CancelSubscribeRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/CancelSubscribeRequest.java new file mode 100644 index 0000000..e2d390a --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/CancelSubscribeRequest.java @@ -0,0 +1,15 @@ +package com.casic.missiles.modular.dto.hik; + +import lombok.Data; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/24 15:14 + */ +@Data +public class CancelSubscribeRequest { + private List eventTypes; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/CardInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/CardInfo.java new file mode 100644 index 0000000..341457d --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/CardInfo.java @@ -0,0 +1,24 @@ +package com.casic.missiles.modular.dto.hik; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/26 16:08 + */ +@Data +public class CardInfo { + //卡号,8~20个字符,支持数字和大写字母 + private String cardNo; + //人员ID,员工工号 + private String personId; + //人员所属组织IndexCode + private String orgIndexCode; + //卡片类型,默认是1:IC卡 + //1:IC卡 + //2:CPU卡 + //3:远距离卡 + //4:MIFARE卡 + private Number cardType; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/FaceRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/FaceRequest.java new file mode 100644 index 0000000..edc04bf --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/FaceRequest.java @@ -0,0 +1,16 @@ +package com.casic.missiles.modular.dto.hik; + +import lombok.Data; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/25 16:53 + */ +@Data +public class FaceRequest { + private String certificateNum; + private List indexCodes; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/HikRecvEvent.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/HikRecvEvent.java index a3e9845..1b2b2b1 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/HikRecvEvent.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/HikRecvEvent.java @@ -28,12 +28,12 @@ /** * 事件类型,用于判断所需接收到的事件类型 */ - public Long getEventType(){ + public Number getEventType(){ JSONObject jsonObject = (JSONObject)JSONObject.toJSON(params); //事件类别对应SecurityEventTypeEnum JSONArray eventTypeArray = (JSONArray)jsonObject.get("events"); JSONObject eventJsonObject = (JSONObject)JSONObject.toJSON(eventTypeArray.get(0)); - Long eventType = (Long) eventJsonObject.get("eventType"); + Number eventType = (Number) eventJsonObject.get("eventType"); return eventType; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonBatchDeleteRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonBatchDeleteRequest.java index 027d31d..9751929 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonBatchDeleteRequest.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonBatchDeleteRequest.java @@ -12,4 +12,6 @@ @Data public class PersonBatchDeleteRequest { private List personIds; + //删除人脸接口使用 + private String faceId; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonInfoRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonInfoRequest.java new file mode 100644 index 0000000..05dc9e1 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonInfoRequest.java @@ -0,0 +1,20 @@ +package com.casic.missiles.modular.dto.hik; + +import lombok.Data; + +import java.util.List; + +/** + * @Description: 获取员工照片请求实体 + * @Author: wangpeng + * @Date: 2022/8/25 16:53 + */ +@Data +public class PersonInfoRequest { + //获取员工详细信息使用 + private String paramName; + private List paramValue; + //获取照片使用 + private String picUri; + private String serverIndexCode; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonListRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonListRequest.java new file mode 100644 index 0000000..3f7149b --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/PersonListRequest.java @@ -0,0 +1,16 @@ +package com.casic.missiles.modular.dto.hik; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/25 16:53 + */ +@Data +public class PersonListRequest { + private Number pageNo; + private Number pageSize; + + private String orderId; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/SearchPicturesRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/SearchPicturesRequest.java new file mode 100644 index 0000000..0a95966 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/SearchPicturesRequest.java @@ -0,0 +1,24 @@ +package com.casic.missiles.modular.dto.hik; + +import lombok.Data; + +import java.util.List; + +/** + * @Description: 以图搜图请求 + * @Author: wangpeng + * @Date: 2022/8/29 10:46 + */ +@Data +public class SearchPicturesRequest { + private String facePicBinaryData; + private String facePicUrl; + private List cameraIndexCodes; + private String startTime; + private String endTime; + //指定搜图的最小相似度,最小为1,最大为100 + private String minSimilarity; + private Number age; + //male-男性,female-女性 + private String sex; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/StaffCardRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/StaffCardRequest.java new file mode 100644 index 0000000..4052e6d --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/StaffCardRequest.java @@ -0,0 +1,20 @@ +package com.casic.missiles.modular.dto.hik; + +import lombok.Data; + +import java.util.List; + +/** + * @Description: 人员开卡请求实体 + * @Author: wangpeng + * @Date: 2022/8/26 16:05 + */ +@Data +public class StaffCardRequest { + //卡片开始有效时间,时间格式:yyyy-MM-dd + private String startDate; + //卡片截止有效时间,时间格式:yyyy-MM-dd,不能大于2037年12月31日 + private String endDate; + //cardList,待开卡列表,最大支持50张卡 + private List cardList; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/VisitorInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/VisitorInfo.java index 73aa316..b99f301 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/VisitorInfo.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/hik/VisitorInfo.java @@ -14,7 +14,7 @@ //访客性别 //1: 男 //2: 女 - private String gender; + private Integer gender; //联系电话建议填写手机号码 private String phoneNo; //证件类型 diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/ApplyReasonGroupDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/ApplyReasonGroupDTO.java index 514f382..786143e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/ApplyReasonGroupDTO.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/ApplyReasonGroupDTO.java @@ -13,4 +13,6 @@ private String visitReason; //访问人数 private Integer quantity; + //占比 + private String ratio; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/AttendanceNumberDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/AttendanceNumberDTO.java new file mode 100644 index 0000000..a494321 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/AttendanceNumberDTO.java @@ -0,0 +1,24 @@ +package com.casic.missiles.modular.dto.statistics; + +import com.fasterxml.jackson.annotation.JsonIgnore; +import lombok.Data; + +/** + * @Description: 出勤人数统计实体 + * @Author: wangpeng + * @Date: 2022/8/31 19:24 + */ +@Data +public class AttendanceNumberDTO { + //日期维度,周、今日,入参 + @JsonIgnore + private String dateDimension; + + //日期,具体天/小时,出参 + private String date; + //出勤人数 + private String quantity; + //员工类型 + private String staffType; + +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/AvgMonthAndWeekGroupDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/AvgMonthAndWeekGroupDTO.java index 4366916..331a9a9 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/AvgMonthAndWeekGroupDTO.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/AvgMonthAndWeekGroupDTO.java @@ -2,8 +2,6 @@ import lombok.Data; -import java.util.Map; - /** * @Description: 平均每月和每周的数据实体 * @Author: wangpeng @@ -13,6 +11,4 @@ public class AvgMonthAndWeekGroupDTO { //入参 private String year; - //出参,key:事件类型,value:周和月数据平均值 - private Map map; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/GateStatusGroupResponse.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/GateStatusGroupResponse.java new file mode 100644 index 0000000..d16f4e5 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/GateStatusGroupResponse.java @@ -0,0 +1,16 @@ +package com.casic.missiles.modular.dto.statistics; + +import lombok.Data; + +/** + * @Description: 闸机/摄像机统计响应实体 + * @Author: wangpeng + * @Date: 2022/8/30 14:22 + */ +@Data +public class GateStatusGroupResponse { + //设备状态 + private String status; + //占比 + private String ratio; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/MonthAndWeekDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/MonthAndWeekDTO.java index 7482b2a..284115a 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/MonthAndWeekDTO.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/MonthAndWeekDTO.java @@ -9,7 +9,7 @@ */ @Data public class MonthAndWeekDTO { -// private String levelName; + private String levelName; private Integer monthQuantity; private Integer weekQuantity; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/OnDutyRatioDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/OnDutyRatioDTO.java new file mode 100644 index 0000000..4f6a65d --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/OnDutyRatioDTO.java @@ -0,0 +1,15 @@ +package com.casic.missiles.modular.dto.statistics; + +import lombok.Data; + +/** + * @Description: 在岗率统计实体 + * @Author: wangpeng + * @Date: 2022/9/2 21:24 + */ +@Data +public class OnDutyRatioDTO { + private String date; + private String quantity; + private String ratio; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/SecurityLevelAssessDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/SecurityLevelAssessDTO.java new file mode 100644 index 0000000..40a0738 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/SecurityLevelAssessDTO.java @@ -0,0 +1,15 @@ +package com.casic.missiles.modular.dto.statistics; + +import lombok.Data; + +/** + * @Description: 出勤人数统计实体 + * @Author: wangpeng + * @Date: 2022/8/31 19:24 + */ +@Data +public class SecurityLevelAssessDTO { + private String date; + private String quantity; + private Double score; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/SecurityScoreDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/SecurityScoreDTO.java index 304d169..f7bd4a2 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/SecurityScoreDTO.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/SecurityScoreDTO.java @@ -14,5 +14,5 @@ //楼层,出参 private String area; //评分,出参 - private String score; + private Double score; } 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 6a30786..e5e613d 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 @@ -8,6 +8,10 @@ public interface HikUri { //事件订阅 String EVENT_SUBSCRIBE = "/api/eventService/v1/eventSubscriptionByEventTypes"; + //事件订阅信息查询 + String EVENT_INFO = "/api/eventService/v1/eventSubscriptionView"; + //事件订阅取消 + String EVENT_CANCEL = "/api/eventService/v1/eventUnSubscriptionByEventTypes"; //预约免登记 String APPOINTMENT_FREE_REGISTER = "/api/visitor/v1/appointment/registration"; //修改访客预约 @@ -32,8 +36,18 @@ String PERSON_SINGLE_UPDATE = "/api/resource/v1/person/single/update"; //批量删除人员 String PERSON_BATCH_DELETE = "/api/resource/v1/person/batch/delete"; + //根据人脸Id删除人脸 + String PERSON_SINGLE_DELETE = "/api/resource/v1/face/single/delete"; //门禁点反控 String DOOR_CONTROL = "/api/acs/v1/door/doControl"; //查询海康门禁点事件v2 String DOOR_EVENTS = "/api/acs/v2/door/events"; + //批量开卡 + String CARD_BINDING = "/api/cis/v1/card/binding"; + //提取人员照片 + String PERSON_PICTURE = "/api/resource/v1/person/picture"; + //根据人员唯一字段获取人员详细信息 + String PERSON_INFO = "/api/resource/v1/person/condition/personInfo"; + //以图搜图 + String SEARCH_PICTURES = "/api/frs/v1/application/captureSearch"; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/enums/SecurityEventType.java b/casic-server/src/main/java/com/casic/missiles/modular/enums/SecurityEventType.java index d51034c..42eacf8 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/enums/SecurityEventType.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/enums/SecurityEventType.java @@ -14,18 +14,27 @@ Number PERSONNEL_GATHER_EVENT = 131593; //监控点离线事件 Number MONITORING_POINT_OFFLINE = 889196545; + //监控点上线事件 + Number MONITORING_POINT_ONLINE = 889196546; //装置离线 Number DEVICE_OFFLINE = 199710; + //装置连线 + Number DEVICE_ONLINE = 199711; //访客登记 Number VISITOR_REGISTER = 1392513025; //访客签离 Number VISITOR_CHECKOUT = 1392513026; + //高空抛物 + Number HIGH_ALTITUDE_PARABOLIC = 930335; + //下面两个查询海康门禁点事件使用 //合法卡比对通过 Number CARD_COMPARE_PASS = 198914; //人脸认证通过 Number FACE_COMPARE_PASS = 196893; + + // //正常开门 // Number NORMAL_OPENING = 198913; // //按钮开门 @@ -46,7 +55,6 @@ // Number FIREWORKS_DETECTION = 192514; // //陌生人识别事件 // Number STRANGER_RECOGNITION = 1644171265; -// //高空抛物 -// Number HIGH_ALTITUDE_PARABOLIC = 930335; + } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/job/CockpitJob.java b/casic-server/src/main/java/com/casic/missiles/modular/job/CockpitJob.java index 7490a27..85dd016 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/job/CockpitJob.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/job/CockpitJob.java @@ -79,14 +79,6 @@ } }); } - } - /** - * 机动力量实时在岗率,在岗人数除以总应在岗人数,功能待定 - */ -// @Scheduled(cron = "0 0/1 * * * ?") - public void BeOnDutyRatio() { - - } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/service/HikCaseDefineService.java b/casic-server/src/main/java/com/casic/missiles/modular/service/HikCaseDefineService.java index d9bb3a9..18e2936 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/service/HikCaseDefineService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/service/HikCaseDefineService.java @@ -9,5 +9,5 @@ * @Date: 2022/7/21 17:20 */ public interface HikCaseDefineService extends IService { - HikCaseDefine getHikCaseDefine(Long caseTypeCode); + HikCaseDefine getHikCaseDefine(Number caseTypeCode); } 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 dd24101..bcc3b5d 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 @@ -18,6 +18,8 @@ CaseInfo monitorPointOfflineHandle(JSONObject event, CaseInfo caseInfo); + void monitorPointOnlineHandle(JSONObject event); + CaseInfo deviceOfflineHandle(JSONObject event, CaseInfo caseInfo); void propertyAttendanceHandle(JSONObject event); @@ -27,4 +29,6 @@ void visitorRegisterHandler(JSONObject event); void visitorCheckOutHandler(JSONObject event); + + void deviceOnlineHandle(JSONObject event); } 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 e55c016..01870bd 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.StaffCardRequest; import com.casic.missiles.modular.model.StaffInfo; import java.util.List; @@ -28,4 +29,6 @@ StaffInfo selectStaffInfoByCode(StaffInfo staffInfo); List staffInfoList(StaffInfoRequest staffInfoRequest); + + int saveCardInfo(StaffCardRequest staffCardRequest); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/service/impl/BlackInfoServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/service/impl/BlackInfoServiceImpl.java index 8f47b37..981b4cd 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/service/impl/BlackInfoServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/service/impl/BlackInfoServiceImpl.java @@ -17,7 +17,6 @@ import com.casic.missiles.modular.model.BlackInfo; import com.casic.missiles.modular.model.HikFaceGroupInfo; import com.casic.missiles.modular.service.BlackInfoService; -import com.casic.missiles.modular.system.service.ICasicFileService; import com.casic.missiles.modular.util.HikUtil; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; @@ -43,9 +42,6 @@ private HikFaceGroupInfoMapper hikFaceGroupInfoMapper; @Resource - private ICasicFileService fileService; - - @Resource private AbstractDictService dictService; @Override @@ -90,9 +86,6 @@ //设置海康人脸唯一标识、人脸分组唯一标识 blackInfo.setIndexCode(String.valueOf(dataJson.get("indexCode"))); blackInfo.setFaceGroupIndexCode(String.valueOf(dataJson.get("faceGroupIndexCode"))); - //保存图片到本地 - String picUrl = fileService.saveFile(blackInfo.getPicture()); - blackInfo.setPicture(picUrl); //插入数据库 if(blackInfoMapper.insert(blackInfo) > 0){ return ResponseData.success(); @@ -141,8 +134,6 @@ log.error("请求海康,单个修改人脸失败,海康response:{}", resultStr); return ResponseData.error("单个修改人脸失败"); } - String picUrl = fileService.saveFile(blackInfo.getPicture()); - blackInfo.setPicture(picUrl); if(blackInfoMapper.updateById(blackInfo) > 0){ return ResponseData.success(); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/service/impl/CockpitServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/service/impl/CockpitServiceImpl.java index 6e6076e..7402991 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/service/impl/CockpitServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/service/impl/CockpitServiceImpl.java @@ -4,15 +4,12 @@ import cn.hutool.core.date.DateUtil; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.core.application.service.AbstractDictService; import com.casic.missiles.modular.dto.hik.DoorEventsRequest; import com.casic.missiles.modular.enums.HikUri; -import com.casic.missiles.modular.enums.SecurityEventDict; import com.casic.missiles.modular.enums.SecurityEventType; import com.casic.missiles.modular.service.CockpitService; import com.casic.missiles.modular.util.HikUtil; import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.*; @@ -25,8 +22,6 @@ @Slf4j @Service public class CockpitServiceImpl implements CockpitService { - @Autowired - private AbstractDictService dictService; @Override public HashMap dataHandle(DoorEventsRequest doorEventsRequest, HashMap> configMap, HashMap jsonMap, HashMap resultMap) { @@ -36,8 +31,8 @@ Date date = new Date(); DateTime startTimeDate = DateUtil.beginOfDay(date); DateTime endTimeDate = DateUtil.endOfDay(date); - String startTime = DateUtil.format(startTimeDate, "yyyy-MM-dd'T'HH:mm:ss'Z'"); - String endTime = DateUtil.format(endTimeDate, "yyyy-MM-dd'T'HH:mm:ss'Z'"); + String startTime = DateUtil.format(startTimeDate, "yyyy-MM-dd'T'HH:mm:ssXXX"); + String endTime = DateUtil.format(endTimeDate, "yyyy-MM-dd'T'HH:mm:ssXXX"); configMap.keySet().stream().forEach(key -> { List doorIndexCodes = configMap.get(key); doorEventsRequest.setPageNo(1); @@ -95,8 +90,9 @@ return; } Integer num = 0; - while (list.stream().iterator().hasNext()) { - JSONObject next = (JSONObject) list.stream().iterator().next(); + Iterator iterator = list.stream().iterator(); + while (iterator.hasNext()) { + JSONObject next = (JSONObject) iterator.next(); Integer inAndOutType = next.getInteger("inAndOutType"); //进门 if (1 == inAndOutType) { @@ -105,8 +101,8 @@ --num; } } - String dictName = dictService.getDictNameByCode(SecurityEventDict.DEVICE_POSITION, String.valueOf(key)); - resultMap.put(dictName, num); +// String dictName = dictService.getDictNameByCode(SecurityEventDict.DEVICE_POSITION, String.valueOf(key)); + resultMap.put(String.valueOf(key), num); }); return resultMap; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/service/impl/HikCaseDefineServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/service/impl/HikCaseDefineServiceImpl.java index 98ab2a4..1a59c7e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/service/impl/HikCaseDefineServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/service/impl/HikCaseDefineServiceImpl.java @@ -16,7 +16,7 @@ private HikCaseDefineMapper hikCaseDefineMapper; @Override - public HikCaseDefine getHikCaseDefine(Long caseTypeCode) { + public HikCaseDefine getHikCaseDefine(Number caseTypeCode) { return hikCaseDefineMapper.getHikCaseDefine(caseTypeCode); } } 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 b47f78f..dbad48f 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 @@ -58,10 +58,16 @@ 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.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; } @@ -76,10 +82,16 @@ 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.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; } @@ -94,10 +106,16 @@ 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.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; } @@ -109,24 +127,44 @@ 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()); //事件状态(未解决的字典值) + // TODO: 2022/7/28 事件状态字典值选择 + caseInfo.setStatus(dict.get(0).getCode()); //事件状态("未解决"的字典值) DeviceInfo deviceInfo = deviceInfoMapper.getByIndexCode(srcIndex); + if(Objects.isNull(deviceInfo)){ + log.info("接收到监控点离线事件,但数据库中无该事件发生的设备信息"); + return caseInfo; + } 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()); //更新设备状态 // TODO: 2022/7/28 设备离线字典值选择 -// deviceInfo.setStatus(); + List deviceDict = dictService.findInDictByCode(SecurityEventDict.DEVICE_STATUS); + deviceInfo.setStatus(deviceDict.get(1).getCode()); if(deviceInfoMapper.updateById(deviceInfo) <= 0){ + log.error("海康回调,更新监控点离线线状态失败!"); return null; } return caseInfo; } @Override + public void monitorPointOnlineHandle(JSONObject event) { + String srcIndex = event.getString("srcIndex"); + DeviceInfo deviceInfo = deviceInfoMapper.getByIndexCode(srcIndex); + // TODO: 2022/7/28 设备在线字典值选择 + List deviceDict = dictService.findInDictByCode(SecurityEventDict.DEVICE_STATUS); + deviceInfo.setStatus(deviceDict.get(0).getCode()); + if(deviceInfoMapper.updateById(deviceInfo) <= 0){ + log.error("海康回调,更新监控点在线状态失败!"); + } + } + + @Override public CaseInfo deviceOfflineHandle(JSONObject event, CaseInfo caseInfo) { //加入到安防事件 String srcIndex = event.getString("srcIndex"); //海康资源唯一标识 @@ -138,19 +176,40 @@ 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.setDeviceCode(deviceInfo.getDevCode()); //设备code caseInfo.setDevName(deviceInfo.getDevName()); //设备名 caseInfo.setPosition(deviceInfo.getPosition()); //事件位置 caseInfo.setArea(deviceInfo.getArea()); //区域 + caseInfo.setIsKeyArea(deviceInfo.getIsKeyArea()); + caseInfo.setDetailLocation(deviceInfo.getDetailLocation()); //更新设备状态 // TODO: 2022/7/28 设备离线字典值选择 -// deviceInfo.setStatus(); + List deviceDict = dictService.findInDictByCode(SecurityEventDict.DEVICE_STATUS); + deviceInfo.setStatus(deviceDict.get(1).getCode()); if(deviceInfoMapper.updateById(deviceInfo) <= 0){ + log.error("海康回调,更新设备离线状态失败!"); return null; } return caseInfo; } + + @Override + public void deviceOnlineHandle(JSONObject event) { + String srcIndex = event.getString("srcIndex"); + DeviceInfo deviceInfo = deviceInfoMapper.getByIndexCode(srcIndex); + // TODO: 2022/7/28 设备在线字典值选择 + List deviceDict = dictService.findInDictByCode(SecurityEventDict.DEVICE_STATUS); + deviceInfo.setStatus(deviceDict.get(0).getCode()); + if(deviceInfoMapper.updateById(deviceInfo) <= 0){ + log.error("海康回调,更新门禁点装置在线状态失败!"); + } + } + @Override public void propertyAttendanceHandle(JSONObject event) { String srcIndex = event.getString("srcIndex"); @@ -182,8 +241,9 @@ info.setStaffName(staffInfo.getStaffName()); info.setStaffGender(staffInfo.getStaffGender()); // TODO: 2022/7/29 物业人员字典值选择 -// info.setStaffType(); -// info.setStaffTypeName(); + List staffDict = dictService.findInDictByCode(SecurityEventDict.STAFF_TYPE); + info.setStaffType(staffDict.get(0).getCode()); + info.setStaffTypeName(staffDict.get(0).getName()); info.setAtteDate(DateUtil.today()); info.setAtteStartTime(happenTime); info.setAtteStartDev(deviceInfo.getDevCode()); @@ -226,8 +286,9 @@ info.setStaffName(staffInfo.getStaffName()); info.setStaffGender(staffInfo.getStaffGender()); // TODO: 2022/7/29 安保人员字典值选择 -// info.setStaffType(); -// info.setStaffTypeName(); + List staffDict = dictService.findInDictByCode(SecurityEventDict.STAFF_TYPE); + info.setStaffType(staffDict.get(1).getCode()); + info.setStaffTypeName(staffDict.get(1).getName()); info.setAtteDate(DateUtil.today()); info.setAtteStartTime(happenTime); info.setAtteStartDev(deviceInfo.getDevCode()); @@ -259,8 +320,12 @@ visitInfo.setVisitReason(data.getString("purpose")); visitInfo.setPicUri(data.getString("captureUrl")); visitInfo.setServerIndexCode(data.getString("svrIndexCode")); - visitInfo.setVisitPosition(deviceInfo.getPosition()); - + visitInfo.setOrderId(data.getString("visitorId")); + if(!Objects.isNull(deviceInfo)){ + visitInfo.setVisitPosition(deviceInfo.getPosition()); + } else{ + log.info("识别访客的门禁不在数据库中"); + } if(visitInfoMapper.insert(visitInfo) <= 0){ log.error("新增访客记录异常"); } 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 b416f5c..d19dceb 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 @@ -10,12 +10,12 @@ import com.casic.missiles.modular.dto.StaffInfoRequest; import com.casic.missiles.modular.dto.hik.PersonBatchDeleteRequest; import com.casic.missiles.modular.dto.hik.PersonSingleAddOrUpdateRequest; +import com.casic.missiles.modular.dto.hik.StaffCardRequest; import com.casic.missiles.modular.enums.HikUri; import com.casic.missiles.modular.enums.SecurityEventDict; import com.casic.missiles.modular.model.DeviceInfo; import com.casic.missiles.modular.model.StaffInfo; import com.casic.missiles.modular.service.StaffInfoService; -import com.casic.missiles.modular.system.service.ICasicFileService; import com.casic.missiles.modular.util.Base64Util; import com.casic.missiles.modular.util.HikUtil; import lombok.extern.slf4j.Slf4j; @@ -51,9 +51,6 @@ @Resource private Validator validator; - @Resource - private ICasicFileService fileService; - @Value("${casic.file.uploadPath}") private String uploadPath; @@ -80,8 +77,6 @@ if(!Objects.isNull(staff)){ return ResponseData.error("数据已存在"); } - String picUrl = fileService.saveFile(staffInfo.getPicture()); - staffInfo.setPicture(picUrl); //添加人员到海康 PersonSingleAddOrUpdateRequest personSingleAddOrUpdateRequest = new PersonSingleAddOrUpdateRequest(); @@ -117,9 +112,6 @@ @Override @Transactional(rollbackFor = Exception.class) public Object updateStaffInfo(StaffInfo staffInfo) { - String picUrl = fileService.saveFile(staffInfo.getPicture()); - staffInfo.setPicture(picUrl); - //修改人员到海康 PersonSingleAddOrUpdateRequest personSingleAddOrUpdateRequest = new PersonSingleAddOrUpdateRequest(); personSingleAddOrUpdateRequest.setPersonId(staffInfo.getStaffCode()); @@ -162,7 +154,13 @@ String body = JSONObject.toJSONString(personBatchDeleteRequest); String resultStr = HikUtil.hikApi(HikUri.PERSON_BATCH_DELETE, body); JSONObject resultJson = (JSONObject)JSONObject.parse(resultStr); - if (!"0".equals(resultJson.get("code"))) { + //人脸要单独删除 + PersonBatchDeleteRequest personBatchDeleteRequest2 = new PersonBatchDeleteRequest(); + personBatchDeleteRequest2.setFaceId(staffInfo.getStaffFaceId()); + String body2 = JSONObject.toJSONString(personBatchDeleteRequest2); + String resultStr2 = HikUtil.hikApi(HikUri.PERSON_SINGLE_DELETE, body2); + JSONObject resultJson2 = (JSONObject)JSONObject.parse(resultStr2); + if (!"0".equals(resultJson.get("code")) && !"0".equals(resultJson2.get("code")) ) { log.error("请求海康,单个删除人员失败,海康response:{}", resultStr); return ResponseData.error("单个删除人员失败"); } @@ -269,4 +267,21 @@ } return null; } + + @Override + @Transactional(rollbackFor = Exception.class) + public int saveCardInfo(StaffCardRequest staffCardRequest) { + List numFlag = new ArrayList<>(); + staffCardRequest.getCardList().forEach(cardInfo -> { + String staffCode = cardInfo.getPersonId(); + String cardNo = cardInfo.getCardNo(); + if(staffInfoMapper.updateByCodeForCard(staffCode, cardNo) > 0){ + numFlag.add(cardNo); + } + }); + if(staffCardRequest.getCardList().size() != numFlag.size()){ + return 0; + } + return 1; + } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/service/impl/VisitorApplyServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/service/impl/VisitorApplyServiceImpl.java index 497003a..b219984 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/service/impl/VisitorApplyServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/service/impl/VisitorApplyServiceImpl.java @@ -74,9 +74,9 @@ AppointmentFreeRegisterRequest appointmentFreeRegisterRequest = new AppointmentFreeRegisterRequest(); //将时间转换为海康ISO8601格式 DateTime inTimeDate = DateUtil.parse(visitorApply.getInTime()); - String inTimeISODate = DateUtil.format(inTimeDate, "yyyy-MM-dd'T'HH:mm:ss'Z'"); + String inTimeISODate = DateUtil.format(inTimeDate, "yyyy-MM-dd'T'HH:mm:ssXXX"); DateTime outTimeDate = DateUtil.parse(visitorApply.getOutTime()); - String outTimeISODate = DateUtil.format(outTimeDate, "yyyy-MM-dd'T'HH:mm:ss'Z'"); + String outTimeISODate = DateUtil.format(outTimeDate, "yyyy-MM-dd'T'HH:mm:ssXXX"); //海康员工唯一标识receptionistId就是我们录入的到海康的员工号 appointmentFreeRegisterRequest.setReceptionistId(visitorApply.getStaffCode()); appointmentFreeRegisterRequest.setPersonNum(1); @@ -86,7 +86,7 @@ VisitorInfo visitorInfo = new VisitorInfo(); visitorInfo.setVisitorName(visitorApply.getVisitorName()); - visitorInfo.setGender(visitorApply.getVisitorGender()); + visitorInfo.setGender(Integer.valueOf(visitorApply.getVisitorGender())); visitorInfo.setPhoneNo(visitorApply.getVisitorPhone()); visitorInfo.setCertificateNo(visitorApply.getIdCard()); visitorInfo.setCertificateType(111); @@ -121,15 +121,15 @@ appointmentFreeRegisterRequest.setAppointRecordId(visitorApply1.getAppointRecordId()); appointmentFreeRegisterRequest.setReceptionistId(visitorApply1.getStaffCode()); DateTime inTimeDate = DateUtil.parse(visitorApply.getInTime()); - String inTimeISODate = DateUtil.format(inTimeDate, "yyyy-MM-dd'T'HH:mm:ss'Z'"); + String inTimeISODate = DateUtil.format(inTimeDate, "yyyy-MM-dd'T'HH:mm:ssXXX"); DateTime outTimeDate = DateUtil.parse(visitorApply.getOutTime()); - String outTimeISODate = DateUtil.format(outTimeDate, "yyyy-MM-dd'T'HH:mm:ss'Z'"); + String outTimeISODate = DateUtil.format(outTimeDate, "yyyy-MM-dd'T'HH:mm:ssXXX"); appointmentFreeRegisterRequest.setVisitStartTime(inTimeISODate); appointmentFreeRegisterRequest.setVisitEndTime(outTimeISODate); appointmentFreeRegisterRequest.setVisitPurpose(visitorApply.getVisitReason()); VisitorInfo visitorInfo = new VisitorInfo(); visitorInfo.setVisitorName(visitorApply.getVisitorName()); - visitorInfo.setGender(visitorApply.getVisitorGender()); + visitorInfo.setGender(Integer.valueOf(visitorApply.getVisitorGender())); visitorInfo.setPhoneNo(visitorApply.getVisitorPhone()); visitorInfo.setCertificateNo(visitorApply.getIdCard()); visitorInfo.setCertificateType(111); @@ -236,9 +236,9 @@ } } DateTime inTimeDate = DateUtil.parse(busConcentrator.getInTime()); - String inTimeISODate = DateUtil.format(inTimeDate, "yyyy-MM-dd'T'HH:mm:ss'Z'"); + String inTimeISODate = DateUtil.format(inTimeDate, "yyyy-MM-dd'T'HH:mm:ssXXX"); DateTime outTimeDate = DateUtil.parse(busConcentrator.getOutTime()); - String outTimeISODate = DateUtil.format(outTimeDate, "yyyy-MM-dd'T'HH:mm:ss'Z'"); + String outTimeISODate = DateUtil.format(outTimeDate, "yyyy-MM-dd'T'HH:mm:ssXXX"); AppointmentFreeRegisterRequest appointmentFreeRegisterRequest = new AppointmentFreeRegisterRequest(); appointmentFreeRegisterRequest.setReceptionistId(busConcentrator.getStaffCode()); appointmentFreeRegisterRequest.setPersonNum(1); @@ -247,7 +247,7 @@ appointmentFreeRegisterRequest.setVisitPurpose(busConcentrator.getVisitReason()); VisitorInfo visitorInfo = new VisitorInfo(); visitorInfo.setVisitorName(busConcentrator.getVisitorName()); - visitorInfo.setGender(busConcentrator.getVisitorGender()); + visitorInfo.setGender(Integer.valueOf(busConcentrator.getVisitorGender())); visitorInfo.setPhoneNo(busConcentrator.getVisitorPhone()); visitorInfo.setCertificateNo(busConcentrator.getIdCard()); visitorInfo.setCertificateType(111); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/util/ArtemisFor302Util.java b/casic-server/src/main/java/com/casic/missiles/modular/util/ArtemisFor302Util.java new file mode 100644 index 0000000..4edb075 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/util/ArtemisFor302Util.java @@ -0,0 +1,65 @@ +package com.casic.missiles.modular.util; + +import com.hikvision.artemis.sdk.Client; +import com.hikvision.artemis.sdk.Request; +import com.hikvision.artemis.sdk.Response; +import com.hikvision.artemis.sdk.config.ArtemisConfig; +import com.hikvision.artemis.sdk.constant.Constants; +import com.hikvision.artemis.sdk.enums.Method; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.apache.http.HttpHeaders; + +import java.util.HashMap; +import java.util.Map; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/8/29 20:25 + */ +@Slf4j +public class ArtemisFor302Util { + + public static String doPostStringArtemis(Map path, String body, Map querys, String accept, String contentType, Map header) { + String httpSchema = (String)path.keySet().toArray()[0]; + if (httpSchema != null && !StringUtils.isEmpty(httpSchema)) { + String responseStr = null; + + try { + Map headers = new HashMap(); + if (StringUtils.isNotBlank(accept)) { + headers.put("Accept", accept); + } else { + headers.put("Accept", "*/*"); + } + + if (StringUtils.isNotBlank(contentType)) { + headers.put("Content-Type", contentType); + } else { + headers.put("Content-Type", "application/text;charset=UTF-8"); + } + + if (header != null) { + headers.putAll(header); + } + + Request request = new Request(Method.POST_STRING, httpSchema + ArtemisConfig.host, (String)path.get(httpSchema), ArtemisConfig.appKey, ArtemisConfig.appSecret, Constants.DEFAULT_TIMEOUT); + request.setHeaders(headers); + request.setQuerys(querys); + request.setStringBody(body); + Response response = Client.execute(request); + int statusCode = response.getStatusCode(); + if(statusCode == 302){ + return response.getHeader((HttpHeaders.LOCATION)); + } + + } catch (Exception var11) { + log.error("the Artemis PostString Request is failed, exception:{}", var11.getMessage()); + } + return responseStr; + } else { + throw new RuntimeException("http和https参数错误httpSchema: " + httpSchema); + } + } +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/util/CaseInfoFactoryUtil.java b/casic-server/src/main/java/com/casic/missiles/modular/util/CaseInfoFactoryUtil.java index bde56a9..74da5ea 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/util/CaseInfoFactoryUtil.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/util/CaseInfoFactoryUtil.java @@ -10,6 +10,7 @@ import org.springframework.stereotype.Component; import javax.annotation.Resource; +import java.util.Objects; /** * @Description: 安防事件工厂类 @@ -27,9 +28,12 @@ @Resource private CategoryLevelMapper categoryLevelMapper; - public CaseInfo getCaseInfo(Long eventType) { + public CaseInfo getCaseInfo(Number eventType) { //获取海康事件定义 HikCaseDefine hikCaseDefine = hikCaseDefineMapper.getHikCaseDefine(eventType); + if(Objects.isNull(hikCaseDefine)){ + return null; + } //不同事件类别对事件封装为可入库事件 CaseInfo caseInfo = new CaseInfo(); caseInfo.setHazardLevelCode(hikCaseDefine.getHazardLevelCode()); //危险级别code @@ -39,6 +43,7 @@ caseInfo.setCategoryLevelCode(hikCaseDefine.getCategoryLevelCode()); //事件类别code CaseCategoryLevel categoryLevel = categoryLevelMapper.getCaseCategoryLevel(hikCaseDefine.getCategoryLevelCode()); caseInfo.setTypeName(categoryLevel.getName()); //事件类别 + caseInfo.setHikEventType(hikCaseDefine.getCaseTypeCode()); return caseInfo; } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/util/HikUtil.java b/casic-server/src/main/java/com/casic/missiles/modular/util/HikUtil.java index 2dc14a2..dde810c 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/util/HikUtil.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/util/HikUtil.java @@ -13,9 +13,9 @@ /** * STEP1:设置平台参数,根据实际情况,设置host appkey appsecret 三个参数. */ - ArtemisConfig.host = "192.168.1.22:443"; // artemis网关服务器ip端口 - ArtemisConfig.appKey = "25766251"; // 秘钥appkey - ArtemisConfig.appSecret = "h2o6zXtzCmt8eaOaMkXb";// 秘钥appSecret + ArtemisConfig.host = "192.168.10.2:443"; // artemis网关服务器ip端口 + ArtemisConfig.appKey = "20464298"; // 秘钥appkey + ArtemisConfig.appSecret = "YrvonURk8z9kzYuMWEto";// 秘钥appSecret /** * STEP2:设置OpenAPI接口的上下文 @@ -46,4 +46,43 @@ String result = ArtemisHttpUtil.doPostStringArtemis(path, body, null, null, contentType, null); return result; } + + public static String hikApiFor302(String uri, String body) { + + /** + * STEP1:设置平台参数,根据实际情况,设置host appkey appsecret 三个参数. + */ + ArtemisConfig.host = "192.168.10.2:443"; // artemis网关服务器ip端口 + ArtemisConfig.appKey = "20464298"; // 秘钥appkey + ArtemisConfig.appSecret = "YrvonURk8z9kzYuMWEto";// 秘钥appSecret + + /** + * STEP2:设置OpenAPI接口的上下文 + */ + final String ARTEMIS_PATH = "/artemis"; + + /** + * STEP3:设置接口的URI地址 + */ + final String previewURLsApi = ARTEMIS_PATH + uri; + Map path = new HashMap(2) { + { + put("https://", previewURLsApi);//根据现场环境部署确认是http还是https + } + }; + + /** + * STEP4:设置参数提交方式 + */ + String contentType = "application/json"; + + /** + * STEP5:组装请求参数 + */ + /** + * STEP6:调用接口,post请求application/json类型参数 + */ + String result = ArtemisFor302Util.doPostStringArtemis(path, body, null, null, contentType, null); + return result; + } } diff --git a/casic-web/src/main/resources/config/application-dev.yml b/casic-web/src/main/resources/config/application-dev.yml index e7963bb..835aeb4 100644 --- a/casic-web/src/main/resources/config/application-dev.yml +++ b/casic-web/src/main/resources/config/application-dev.yml @@ -20,7 +20,7 @@ casic: kaptcha-open: false #是否开启登录时验证码 (true/false) - no-login-urls: ${casic.sysUrl}/user/login,${casic.sysUrl}/user/appLogin,${casic.sysUrl}/kaptcha/base64,${casic.sysUrl}/config/baseConfig,/route/mockToken,/cockpit/**,/propertyManage/** + no-login-urls: ${casic.sysUrl}/user/login,${casic.sysUrl}/user/appLogin,${casic.sysUrl}/kaptcha/base64,${casic.sysUrl}/config/baseConfig,/route/mockToken,/cockpit/**,/propertyManage/**,/eventRcv/**,/hik/**,/staffInfo/**,/**/listPage,/**/list #flowable数据源和多数据源配置 db: init: @@ -41,9 +41,8 @@ level.org.springframework.web: info #所属楼栋及各楼栋内门禁点列表配置 -#1/2/3对应字典中一期二期主楼和录制楼 +#1/2对应字典中一期(包含一期+录制楼)、二期主楼 accessgroup: configMap: - 1: [1,2,3] - 2: [2,3,4] - 3: [3,4,5] \ No newline at end of file + 1: [eaf4c45a20734a6d88cdf32cbec3fdab] + 2: [2,3,4] \ No newline at end of file diff --git a/casic-web/src/main/resources/config/application-prod.yml b/casic-web/src/main/resources/config/application-prod.yml index 0073ca8..3882020 100644 --- a/casic-web/src/main/resources/config/application-prod.yml +++ b/casic-web/src/main/resources/config/application-prod.yml @@ -4,31 +4,44 @@ ################### spring配置 ################### spring: datasource: - url: jdbc:mysql://10.18.0.20:3306/casic_smartcity_callcenter?autoReconnect=true&useUnicode=true&characterEncoding=utf8&useSSL=false&allowMultiQueries=true&zeroDateTimeBehavior=convertToNull + driver-class-name: com.mysql.cj.jdbc.Driver + url: jdbc:mysql://192.168.10.6:3306/casic_security_cockpit?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC&&allowMultiQueries=true username: root password: Casic203 - initial-size: 2 - min-idle: 1 - jms: - pub-sub-domain: true - # session: - # store-type: redis redis: - host: 127.0.0.1 + host: 192.168.10.6 port: 6379 - password: + password: Casic203 + database: 1 + serializer: org.springframework.data.redis.serializer.StringRedisSerializer + redisValueSerializer: org.springframework.data.redis.serializer.JdkSerializationRedisSerializer -#flowable数据源和多数据源配置 casic: kaptcha-open: false #是否开启登录时验证码 (true/false) - nologin-urls: /user/login,/user/appLogin,/kaptcha,/config/baseConfig,/route/mockToken - flowable: - datasource: - url: jdbc:mysql://10.18.0.20:3306/callcenter_flowable?autoReconnect=true&useUnicode=true&characterEncoding=utf8&useSSL=false&allowMultiQueries=true&zeroDateTimeBehavior=convertToNull - username: root - password: Casic203 + no-login-urls: ${casic.sysUrl}/user/login,${casic.sysUrl}/user/appLogin,${casic.sysUrl}/kaptcha/base64,${casic.sysUrl}/config/baseConfig,/route/mockToken,/cockpit/**,/propertyManage/**,/eventRcv/**,/hik/**,/staffInfo/**,/**/listPage,/**/list + #flowable数据源和多数据源配置 + db: + init: + enable: false + #图片下载本地地址 + file: + uploadPath: D:\tmp\ + commponentType: disk + +cockpit: + config: + #模板文件本地路径 + exportPath: D:\code\casic-security-cockpit\casic-web\src\main\resources\config\export\ + logging: level.root: info level.com.casic: debug - path: logs/ - file: missiles.log \ No newline at end of file + level.org.springframework.web: info + +#所属楼栋及各楼栋内门禁点列表配置 +#1/2/3对应字典中一期二期主楼和录制楼 +accessgroup: + configMap: + 1: [eaf4c45a20734a6d88cdf32cbec3fdab] + 2: [2,3,4] + 3: [3,4,5] \ No newline at end of file